嵌入式Linux软件开发

版本：v0.7.0

Crifan Li

摘要

此文主要介绍的嵌入式Linux软件开发的概念。

[提示] 本文提供多种格式供：
在线阅读 | HTML | HTMLs | PDF | CHM | TXT | RTF | WEBHELP
下载（7zip压缩包） | HTML | HTMLs | PDF | CHM | TXT | RTF | WEBHELP

HTML版本的在线地址为：

http://www.crifan.com/files/doc/docbook/embedded_linux_dev/release/html/embedded_linux_dev.html

有任何意见，建议，提交bug等，都欢迎去讨论组发帖讨论：

http://www.crifan.com/bbs/categories/embedded_linux_dev/

2015-05-24

修订历史
修订 0.7.0 2015-05-24 crl
  1. 增加嵌入式Linux软件开发的基本组成
  2. 修正下载的链接
  3. 添加在线看Linux源码
  4. 添加嵌入式Linux基本简介

版权 © 2015 Crifan, http://crifan.com

本文章遵从：署名-非商业性使用 2.5 中国大陆(CC BY-NC 2.5)

目录

正文之前
1. 此文目的
1. 嵌入式Linux开发构成之简介
2. 嵌入式Linux开发构成之bootloader
2.1. Uboot版本演化历史
2.2. Uboot的代码逻辑和框架
2.3. Uboot基本的使用方式
2.4. Uboot常见的命令
2.5. Uboot的编译
2.6. Uboot环境变量存储机制
2.7. Uboot的移植
3. 嵌入式Linux开发构成之kernel
3.1. 嵌入式Linux的基本编译的过程
3.2. 生成的uImage和zImage等的区别
3.3. 如何优化以减小kernel的size
4. 嵌入式Linux开发构成之rootfs
4.1. 什么是rootfs
4.2. 为何要rootfs
4.3. rootfs的类型
4.4. 如何制作和生成rootfs
4.5. 如何修改和编辑rootfs
4.6. rootfs的加载方式
5. 嵌入式Linux开发相关资源
5.1. 嵌入式Linux开发网站
5.1.1. Embedded Linux Wiki
5.2. Linux源代码在线查看
参考书目


正文之前

目录

1. 此文目的

1. 此文目的

此文主要介绍的嵌入式Linux软件开发，搞懂基本的嵌入式Linux的组成，知道如何上手进入嵌入式Linux开发。


第 1 章 嵌入式Linux开发构成之简介

摘要

此处简单介绍一下嵌入式Linux开发的基本知识。

嵌入式Linux开发的基本流程，其实之前在：

嵌入式Linux开发环境组成

有了一些简单的介绍了。此处更加详细的解释一下，关于嵌入式Linux开发的方方面面。

典型的嵌入式Linux的开发，其最基本的流程是：

  1. 搭建嵌入式开发环境：制作和配置交叉编译器环境

    搭建环境，保证有交叉编译器可以使用，用于后续交叉编译。

  2. 移植Bootloader：最典型的就是Uboot

    移植uboot

    修改更新uboot，在其中添加对应的功能支持，修复bug等等。

    比如，修改其中的cmd_nand.c去添加新的其他nand flash方面的功能的支持等等。

  3. 移植Linux的内核kernel

    移植，裁剪Linux kernel，之后再去交叉编译出所需要的uImage等系统镜像文件

    编译内核期间，最常用的命令就是：

make menuconfig
make uImage

    关于make menuconfig，不了解的可以参考：【教程】什么是menuconfig和menuconfig的使用方法和技巧

  4. 制作自己的根文件系统系统

    需要注意的是，此处所说的制作文件系统，分两大步骤：

    • 用工具制作出最基本的文件系统的文件内容

      比如用Buildroot、Crosstool-NG或者其他工具，制作出自己的基本的文件系统的文件内容

    • 用对应文件系统制作工具制作出文件系统镜像

      再用专门的文件系统制作工具，去基于之前的文件系统的所有的文件内容，制作成对应的镜像文件。

      比如用Yaffs2的工具制作出Yaffs2的文件系统镜像文件

    根据自己所选择的根文件系统的类型不同，选择对应的不同的工具去制作对应的根文件系统。

    典型的嵌入式中，存储设备往往都是用的Nand Flash，所以对应的文件系统的类型也是MTD类型的某个日志型的文件系统，比如：

    • Yaffs2

      用特定的工具去制作makeyaffs2image去制作yaffs2的文件系统镜像文件，其中内部制作过程涉及到，把Yaffs2的文件系统本身相关的一些数据，制作出来，放到一个page的oob的位置，

      待后续写入此文件系统镜像文件期间，oob数据写入到对应的物理上的page的oob的位置，这样Yaffs2文件系统运行起来之后，就可以在oob的位置读取到对应的信息，可以正确的管理此文件系统了。

      制作出来的文件系统镜像文件的名字，一般都是类似于：

      TOOD：确认文件名是不是rootfs.arm.yaffs2？？？

      TODO：把yaffs2_makeyaffs2image_support_2k_4k_8k.7z上传到自己的网站后，把链接贴到此处

    • Jffs

    • UBIFS

TODO：抽空确认下面文件的名字是否正确！！！

有了对应的这些文件：

  • uboot文件：u-boot.bin
  • kernel文件：uImage
  • rootfs文件：rootfs.arm.yaffs2

然后再去用烧录工具去将这些文件，烧录到目标开发板中，

然后再去用串口工具连接开发板，进行调试

调试Uboot是否正常运行，调试Linux内核是否工作正常等等。

如此，才是一个基本的，完整的嵌入式Linux开发流程。

此外，对于烧录过程，可以参考：【详解】嵌入式开发中固件的烧录方式


第 2 章 嵌入式Linux开发构成之bootloader

目录

2.1. Uboot版本演化历史
2.2. Uboot的代码逻辑和框架
2.3. Uboot基本的使用方式
2.4. Uboot常见的命令
2.5. Uboot的编译
2.6. Uboot环境变量存储机制
2.7. Uboot的移植

摘要

之前有很多bootloader，不过现在用的最多的就是uboot。

主要介绍的内容有：

2.1. Uboot版本演化历史

目前最常用的哪几个版本：

  • u-boot.1.1.6
  • uboot 2012之类的


2.2. Uboot的代码逻辑和框架

  • arch，支持的平台
  • cpu类型
  • 支持哪些外设，代码架构如何


2.3. Uboot基本的使用方式

  • 烧录到目标开发板中后
  • 启动系统之前按某个键，或任意键
  • 然后输入命令，使用uboot


2.4. Uboot常见的命令

  • nand write/read
  • md
  • setenv
  • cp
  • 等等


2.5. Uboot的编译

包括基本的编译命令：

make XXXX_config

另外，把之前自己对，uboot编译最后阶段的命令的详细解释，也（引用）过来：

详细分析make uboot 最后的编译链接的具体执行过程


2.6. Uboot环境变量存储机制

  • 环境变量env
  • 存在多种可能的介质中：比如nand flash，nor flash等等


2.7. Uboot的移植

以及如果要移植，大概的逻辑，和参考资料。

找到值得参考的，关于uboot移植的资料


第 3 章 嵌入式Linux开发构成之kernel

目录

3.1. 嵌入式Linux的基本编译的过程
3.2. 生成的uImage和zImage等的区别
3.3. 如何优化以减小kernel的size

摘要

嵌入式系统，免费开源的，用的比较广泛的，就属linux

3.1. 嵌入式Linux的基本编译的过程

  • 先配置好，比如设置ARCH=arm等环境变量
  • make menuconfig
  • make uImage


3.2. 生成的uImage和zImage等的区别

如何加参数配置，以生成uImage或zImage


3.3. 如何优化以减小kernel的size

去除不必要的模块等


第 4 章 嵌入式Linux开发构成之rootfs

目录

4.1. 什么是rootfs
4.2. 为何要rootfs
4.3. rootfs的类型
4.4. 如何制作和生成rootfs
4.5. 如何修改和编辑rootfs
4.6. rootfs的加载方式

摘要

4.1. 什么是rootfs


4.2. 为何要rootfs


4.3. rootfs的类型

常见的，针对于嵌入式系统中常见的存储设备Nand Flash的rootfs，有：

  • cramfs
  • JFFS2
  • YAFFS2
  • UBIFS


4.4. 如何制作和生成rootfs

支持yaff的4k和8k的那个脚本


4.5. 如何修改和编辑rootfs

嵌入式中如何增加启动项


4.6. rootfs的加载方式

  • NFS挂在
  • 直接挂载到块设备中，比如/mtd/block2之类的

然后就衍生出一个问题：如何在线升级rootfs，详见：

在Linux运行期间升级Linux系统（Uboot+kernel+Rootfs）


第 5 章 嵌入式Linux开发相关资源

目录

5.1. 嵌入式Linux开发网站
5.1.1. Embedded Linux Wiki
5.2. Linux源代码在线查看

摘要

5.1. 嵌入式Linux开发网站

5.1.1. Embedded Linux Wiki

Embedded Linux Wiki这个网站，可以简单解释成为，嵌入式Linux开发的资源大全

其中包含了很多方面的内容，比如：

  • Android

    Android Tools - eLinux.org

    整理了Android开发所用到的工具。


5.2. Linux源代码在线查看

在折腾Linux开发期间，往往会涉及到查阅Linux源代码。

传统的方式是，使用好用的工具，比如Source Insight去查看Linux源代码。

如果没有Source Insight的话，且方便上网，则可以借用在线的Linux源代码查阅网站去看代码。

  • 经典的LXR
  • 这里的代码高亮效果也不错：http://kerneldox.com/kdox-linux/d5/d72/mtd__stresstest_8c_source.html


参考书目

[1] 嵌入式开发之bootloader | 在路上

[2] 嵌入式开发之kernel | 在路上

[3] 嵌入式开发之rootfs | 在路上

[4] 在Linux运行期间升级Linux系统（Uboot+kernel+Rootfs）