Chinaunix首页 | 论坛 | 博客

OS

  • 博客访问: 2279980
  • 博文数量: 691
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2660
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-05 12:49
个人简介

不浮躁

文章分类

全部博文(691)

文章存档

2019年(1)

2017年(12)

2016年(99)

2015年(207)

2014年(372)

分类: 嵌入式

2014-12-07 18:43:45

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

1. make参数: CROSS_COMPILE

即交叉编译器的前缀(prefix),也就是选择将代码编译成目标cpu的指令的工具,如指定make CROSS_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,就是选择编译哪一种cpu architecture,也就是编译arch/目录下的哪一个子目录。如指定make ARCH=arm就是编译arch/arm下的代码。如果不指定,make将使用本机(用什么机器编译就是什么)的cpu作为缺省ARCH.注意:arch/arm下不但有arm体系架构特有的代码,还有arm特有的kconfig,也就是配置选项,所以在make menuconfig,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 linux kernel.它是一个elf文件(executable & linking format),未压缩,其中包含所有的symbol, comments。可用arm-none-linux-gnueabi-readelf来读取其中的信息。

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

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

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

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

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

                 64B header
zImage(bzImage) ------------>   uImage
阅读(895) | 评论(0) | 转发(0) |
0

上一篇:大小端测试程序

下一篇:uImage 如何生成

给主人留下些什么吧!~~