内核编译总流程
1.解压内核源码
tar --xjf linux-2.6.22.6.tar.bz2
2.打补丁
patch -p1 < ../linux-2.6.22.6_jz2440.patch //在内核文件的根目录下打
3.配置
- 使用默认配置,在上面修改。 在arch/arm/configs中找到相似的配置文件 xx_defconfig,然后执行 make xxx_defconfig,保存在.config中,再执行make menuconfig(直接执行改的东西太多),此时也会去读取.config,这样配置就会少很多配置项。
- 使用的厂家提供的配置文件 config_厂家,直接把这个文件改名为.config,然后再去执行 make menuconfig。百文网提供的config_厂家配置文件,在Linux的根目录下,叫config_ok,直接cp config_ok .config就可以了,之后不需要再配置任何东西,也不需要去make menuconfig里面配置,如果需要对某些模块做裁剪,也是可以到menuconfig中配置
- 如果要换某一个模块的驱动,把对应的.c文件换到driver/*对应的文件下,并且修改该文件下的Makefile,把对应模块的名字换成自己的.c的名字。
如换lcd驱动,把lcd.c拷贝到driver/video文件下,把Makefile中
#obj-$(CONFIG_FB_S3C2410) += s3c2410fb.o 这个改为下面的
obj-$(CONFIG_FB_S3C2410) += lcd.o
4.编译
make uImage
uImage是 头部+kernel,编译成功后,uImage放在arch/arm/boot中
注意:
看是否生成了uImage,如果未生成表示没有mkimage工具,在 u-boot 源码下 tools 目录里有mkimage。把 mkimage 工具复制到/usr/bin 目录下去
2.6版本内核问题
1.该版本内核可以用3.x的交叉编译器,也可以用4.x的编译器来编译,但应用程序必须使用3.x的交叉编译器
2.在make menuconfig时会出现问题,需要去Makefile中改两行
//修改416行
config %config: scripts_basic outputmakefile FORCE //修改前
%config: scripts_basic outputmakefile FORCE //修改后
//修改1449行
/ %/: prepare scripts FORCE //修改前
%/: prepare scripts FORCE //修改后
3.4版本内核问题
1.该版本内核只能由4.x的编译器来编译,同时应用程序也只能用3.x的交叉编译器来编译。
2.在使用ubuntu16.04编译Linux-3.4.2内核时出现这样的错误:
recipe for target 'kernel/timeconst.h' failed
解决办法是:将kernel/timeconst.pl中第373行的defined()去掉,只留下 !@val 就可以了,去掉后如下:
3.直接用百文网给的源码和补丁编译好后上不了网,所以直接用给的uImage好了