一、编译流程
1- 解压缩
2- 打补丁
patch -p_ < 补丁文件
-p用于忽略补丁文件前面几个‘/’
-p1表示去掉前面1个目录
3- 配置
两种方法:
1. make menuconfig 每一项都自己配置
2. 使用默认配置,在此基础上修改
3. 使用厂家提供的配置文件
在内核目录下
find -name “*defconfig*”
在/arch/arm/configs
下会找到很多默认配置
make s3c2410_deconfig
会将结果保存在.config中
make menuconfig
会读取.config
可以直接将厂家的config文件复制为.config
- config_ok就是韦东山提供的配置文件
make menuconfig
- 进入界面后,一些选项高亮的开头字母,按下之后可以直接跳转
- 输入Y就会编译,N就不编译。M就是作为模块,事后加载。?是帮助(对配置项的帮助说明)
如果make menuconfig出错,请参考链接:http://blog.csdn.net/feather_wch/article/details/50736772
4- 编译
make
或者想生成uImage(头部+真正内核,用于uboot)
二、配置过程
配置结果:生成.config
配置项:CONFIG_DM9000
C源码:CONFIG_DM9000宏
Makefile: drivers/net/Makefile
m和f的差别体现在makefile的子目录中:
obj-y += xxx.o(会直接编译到内核中)
obj-m += yyy.o(会变成可以加载的模块)
y是加载到内核中。m是作为模块用于日后加载。
include/config/auto.conf
include/linux/autoconf.h
m和f都定义为1
三、makefile解析
第一个文件(能追踪到文件的执行)
链接脚本(内核应该放在哪里,里面内容如何排布(如代码段等部分如何摆放))
Linux kernel Makefile 文件分类
名称 | 描述 |
---|---|
顶层Makefile | 所有makefile核心 |
.config | 配置文件,在配置内核时生成。所有makefile根据.config来决定使用哪些文件 |
arch/$(ARCH)/Makefile | 对应体系结构的Makefile,用来决定哪些体系结构相关文件参与内核的生成,并提供一些规则来生成特定格式的内核映像 |
scripts/Makefile.* | Makefile共用的通用规则、脚本 |
kbuild Makefiles | 各级子目录下的Makefile,他们相对简单,被上一层Makefile调用来编译当前目录下的文件 |
Linux内核makefile的详细讲解可以参考:
内核目录下\Documentation\kbuild\makefiles.txt
Linux内核代码架构图:
如何将.c文件编译进内核或者作为模块?
例如:有文件a.c, b.c
1. 编译进内核
obj-y += a.o b.o
2. 作为模块
obj-m += ab.o //名字随意
ab-objs := a.o b.o
a.c,b.c会编译成a.o b.o,然后会被链接为 ab.ko(ab名字随意)
四、内核启动流程
1. 处理uboot传入的参数
先运行自解压代码, 然后运行解压后代码(head.S,会处理机器id等)
- 判断是否支持这个单板(uboot启动内核时传入的机器id)
-
。。。
挂载文件系统
最终目的:运行应用程序(根文件系统中)