关于linux kernel编译的几项关键点:

来源:互联网 发布:java socket编程实例 编辑:程序博客网 时间:2024/04/29 20:32
1. make参数: CROSS_COMPILE
即交叉编译器的前缀(prefix),也就是选择将代码编译成目标cpu的指令的工具,如指定makeCROSS_COMPILE=arm-none-linux-gnueabi-就是使用arm-none-linux-gnueabi-gcc,arm-none-linux-gnueabi-ld等工具将代码编译成arm的可执行指令。如果不指定CROSS_COMPILE参数,make时将认为prefix为空,即使用gcc来编译。

2.make参数: ARCH
即architecture,就是选择编译哪一种cpuarchitecture,也就是编译arch/目录下的哪一个子目录。如指定makeARCH=arm就是编译arch/arm下的代码。如果不指定,make将使用本机(用什么机器编译就是什么)的cpu作为缺省ARCH.注意:arch/arm下不但有arm体系架构特有的代码,还有arm特有的kconfig,也就是配置选项,所以在makemenuconfig,make xxxx_defconfig的时候也必须指定ARCH=arm。

3. Configure& make kernel 的基本步骤
以编译arm versatile为利:

step 1:
make mrproper
清除所有上次编译产生的文件和.config文件。

step 2:
make ARCH=arm versatile_defconfig
使用arch/arm/configs/versatile_defconfig文件的配置,versatile_defconfig的内容将被copy到.config中。.config文件是将用户选好的编译选项保存下来,make时读取.config中的选项来编译kernel。注意:必须指定ARCH=arm,否则make会到arch/i386/configs下去找versatile_defconfig。正如前面2.ARCH中所述不指定ARCH的话,将使用本机(i386)的ARCH作为缺省ARCH。

step 3:
make ARCH=arm menuconfig
启动图形界面来作手工配置刚此生成的.config文件。此处也必须指定ARCH=arm,否则不会load刚才生成的ARCH=arm的.config.
修改配置后保存退出。

step 4:
make -j4 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
编译生成kernel image,arm的kernel image存放在arch/arm/boot/zImage.'-j4'的作用是启动4线程编译。



4.Kernel编译生成产物:

vmlinux
位于kernel源代码的根目录下。vmlinux是virtual memory linuxkernel.它是一个elf文件(executable & linkingformat),未压缩,其中包含所有的symbol,comments。可用arm-none-linux-gnueabi-readelf来读取其中的信息。

zImage(bzImage):
位于arch/arm/boot/下,是将vmlinux去除了symbol, comment后,添加了一段初始化代码,然后用gzip压缩,最后加上一小段mini gunzip代码(用于load后解压缩)而成的。bzImage是bigzImage。zImage适用于小内核,如果kernel较大,应该用bzImage.

uImage:
位于arch/arm/boot/下,被uboot引导的kernel image。缺省状态下不会被编译出来,需要makeuImage才会被编译。uImage实在zImage上加上一个64bytes的“header”,用来告诉uboot这个Image的大小等。
所以用hexdump可以看出,uImage从第64byte开始和zImage是完全一样的。

System.map:
这是整个kernelImage中symbol与address的对应表。用vi打开即可看到。实际上在make的最后会用arm-none-linux-gnueabi-nm来读取vmlinuxelf文件,从而生成System.map。只要运行arm-none-linux-gnueabi-nm -n vmlinux> tmp.map就会发现tmp.map和System.map是一样的。

下图说明了这些产物之间的关系:

 
make            - symbol, comment  + init code gzip compress   + mini gunzipheader
-------> vmlinux ------------------> ----------> -------------> ------------------->

                64B header
zImage(bzImage)------------>  uImage
0 1