嵌入式Linux软件开发
版本：v0.7.0
Crifan Li
摘要
此文主要介绍的嵌入式Linux软件开发的概念。
本文提供多种格式供：

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/
在线阅读	HTML  1	HTMLs  2	PDF  3	CHM  4	TXT  5	RTF  6	WEBHELP  7	
下载（7zip压缩包）	HTML  8	HTMLs  9	PDF  10	CHM  11	TXT  12	RTF  13	WEBHELP  14	
修订历史	
修订 0.7.0	2015-05-24	crl	
· 	增加嵌入式Linux软件开发的基本组成
· 	修正下载的链接
· 	添加在线看Linux源码
· 	添加嵌入式Linux基本简介
· 		
嵌入式Linux软件开发:
Crifan Li
版本：v0.7.0
出版日期 2015-05-24
版权 © 2015 Crifan, http://​crifan.com

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

目录
正文之前  	 # 

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. 此文目的
此文主要介绍的嵌入式Linux软件开发，搞懂基本的嵌入式Linux的组成，知道如何上手进入嵌入式Linux开发。

第 1 章 嵌入式Linux开发构成之简介
此处简单介绍一下嵌入式Linux开发的基本知识。
嵌入式Linux开发的基本流程，其实之前在：
嵌入式Linux开发环境组成  1
有了一些简单的介绍了。此处更加详细的解释一下，关于嵌入式Linux开发的方方面面。
典型的嵌入式Linux的开发，其最基本的流程是：
· 	搭建嵌入式开发环境：制作和配置交叉编译器环境
· 	搭建环境，保证有交叉编译器可以使用，用于后续交叉编译。
· 	移植Bootloader：最典型的就是Uboot
· 	移植uboot
· 	修改更新uboot，在其中添加对应的功能支持，修复bug等等。
· 	比如，修改其中的cmd_nand.c去添加新的其他nand flash方面的功能的支持等等。
· 	移植Linux的内核kernel
· 	移植，裁剪Linux kernel，之后再去交叉编译出所需要的uImage等系统镜像文件
· 	编译内核期间，最常用的命令就是：
· 	

make menuconfig
make uImage

· 	关于make menuconfig，不了解的可以参考：【教程】什么是menuconfig和menuconfig的使用方法和技巧2
· 	制作自己的根文件系统系统
· 	需要注意的是，此处所说的制作文件系统，分两大步骤：
· 	用工具制作出最基本的文件系统的文件内容
比如用Buildroot3、Crosstool-NG4或者其他工具，制作出自己的基本的文件系统的文件内容
用对应文件系统制作工具制作出文件系统镜像
再用专门的文件系统制作工具，去基于之前的文件系统的所有的文件内容，制作成对应的镜像文件。
比如用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开发流程。
此外，对于烧录过程，可以参考：【详解】嵌入式开发中固件的烧录方式5

第 2 章 嵌入式Linux开发构成之bootloader
之前有很多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 最后的编译链接的具体执行过程  1

2.6. Uboot环境变量存储机制
环境变量env
存在多种可能的介质中：比如nand flash，nor flash等等

2.7. Uboot的移植
以及如果要移植，大概的逻辑，和参考资料。
找到值得参考的，关于uboot移植的资料

第 3 章 嵌入式Linux开发构成之kernel
嵌入式系统，免费开源的，用的比较广泛的，就属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的类型
常见的，针对于嵌入式系统中常见的存储设备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）  1

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

5.1. 嵌入式Linux开发网站

5.1.1. Embedded Linux Wiki
Embedded Linux Wiki1这个网站，可以简单解释成为，嵌入式Linux开发的资源大全
其中包含了很多方面的内容，比如：
Android
Android Tools - eLinux.org2
整理了Android开发所用到的工具。

5.2. Linux源代码在线查看
在折腾Linux开发期间，往往会涉及到查阅Linux源代码。
传统的方式是，使用好用的工具，比如Source Insight去查看Linux源代码。
如果没有Source Insight的话，且方便上网，则可以借用在线的Linux源代码查阅网站去看代码。
经典的LXR  3
这里的代码高亮效果也不错：http://​kerneldox.com/​kdox-​linux/​d5/​d72/​mtd_​_​stresstest_​8c_​source.html

参考书目
[1] 嵌入式开发之bootloader | 在路上1 
[2] 嵌入式开发之kernel | 在路上2 
[3] 嵌入式开发之rootfs | 在路上3 
[4] 在Linux运行期间升级Linux系统（Uboot+kernel+Rootfs）4