内核:
一、内核启动流程分析之编译体验
1、打补丁:
cd linux-2.6.22.6
patch -p1 < ../linux-2.6.22.6_jz2440.patch
2、配置:三种方法
a, make menuconfig
b, 使用默认配置,在上面修改: 在arch/arm/configs 下
在arch/arm/configs找到相似的配置文件xxxx_defconfig
make xxxx_deconfig // 结果会生成一个.config 文件
make menuconfig (就会根据上面的配置文件出一个菜单,就可以选择修改配置项)
c, 使用厂家提供的配置文件:
cp config_厂家 .config
make menuconfig
例如:config_ok文件就是厂家的配置文件
3、编译:
a,make
b,make uImage //生成uImage 就是有个头部的内核文件
二、内核启动流程分析之配置
1、配置:
配置结果 : 生成一个.config 文件
make uImage 时有那些事情发生?
a, 由.config文件创建生成了一个autoconf.h文件 (最源代码使用,定义的是一个宏)
b, 由.config文件创建生成了一个auto.conf文件 (子目录下的Makefile文件使用,定义一个宏是Y/M)
例如:
.config 文件中有很多的配置项
配置项: CONFIG_DM9000 = Y/M
a, C源码中会有 CONFIG_DM9000 (是一个宏)
b, 子目录Makefile drivers/net/Makefile文件里有:obj -$(CONFIG_DM9000)+=dm9000.o
c, include/config/auto.conf 文件也有定义 Y/M (就是用于b中的Makefile) //在make 的时候由.config 生成
d, include/linux/autoconfi.h文件 定义为 1 (就是用于a中的C源码) //在make 的时候由.config 生成
注: c 和 d 文件都是make uImage的时候由.config文件生成的。
2、讲一下内核子目录下的Makefile文件
格式: obj -y +=xxx.o
obj -m +=yyy.o
obj -$(CONFIG_DM9000)+=dm9000.o (CONFIG_DM9000就是在生成的auto.conf文件中定义(Y/M))
三、内核启动流程分析之Makefile
1、子目录的Makefile:
例如 有a.c b.c两个源码文件
a, 编译到内核去: obj -y += a.o b.o
b, 编译成一个模块(ko文件) : obj-m += ab.o
ab-objs := a.o b.o
2、架构下的Makefile
由于顶层Makefile里没有uImage,所以在这里搜索uImage
zImage Image xipImage bootpImage uImage: vmlinux //uImage 依赖于vmlinux uImage = 头部 + 真正的内核
而vmlinux在顶层的目录下:
3、顶层的Makefile
make uImage 的时候就是查到uImage 搜索uImage 但是没有在顶层Makefile里,那就是在架构下的Makefile里
如果直接 make 的话 all: vmlinux 也会是依赖于vmlinux
vmlinux 依赖于:
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE