如何编译linux kernel

其实build kernel很简单,首先参考kernel源代码目录下的README文件,基本上是这么几步:

1. make mrproper -- 注意这一步走过之后,.config会被恢复成默认设置
2. make menuconfig -- 在这里面check配置项,决定哪个打开,哪个关闭。哪些driver编译成module,哪些直接编译进内核
3. make -- 首先会编译内核,完成后会自动编译modules

几个Tips:
1. 如果要做交叉编译,只需要定义CROSS_COMPILE环境变量就可以,比如:

export CROSS_COMPILE=arm-none-linux-gnueabi-

Linux kernel不依赖于glibc,只依赖于gcc, binutils(有ld, as这些软件)。所以,比如上面的例子,设置了CROSS_COMPILE之后,kernel就会用arm-none-linux-gnueabi-gcc, arm-none-linux-gnueabi-ld这样的命令来编译和链接。所以,要确定这些命令在PATH中,能被kernel找到。平常我们做交叉编译,准备工具链也就是准备这些东西。

2. 用O=<dir path>这样的方式来将编译产生的所有文件放入指定的目录,包括.config。比如:

make O=./build

这个很好用,可以不污染源代码目录,要重新编译直接删掉build目录下的所有东西即可。记住,每个命令都要带有O=<dir path>这个option。

3. 一般嵌入式系统中使用u-boot,而uboot是不能引导标准的linux kernel的。现在linux kernel已经内置支持生成u-boot格式的内核文件,只需要make完成后,再执行:make uImage即可。

4. 编译完成后,生成的linux kernel文件,包括uImage,都放在<build dir>/arch/<architecture, 如arm>/boot目录下。Image是没有压缩过的版本,zImage是压缩过的。

5. 使用make clean清除已经生成的.o文件

6. 每个源码目录下的Kconfig文件定义了在make menuconfig中我们看到的那些菜单和项目。所以,看到make menuconfig界面中的项目,想知道是哪儿的,可以参考Kconfig文件。至于哪些源文件编译出什么东西,那就要看每个目录下的Makefile了。

7. 如果有已经配置好的config文件(别人通过make menuconfig生成的),那么,将config文件放在源码目录/arch/<architecture name,如arm>/configs目录下,然后在源码根目录下,执行make <config file name>就可以直接将指定config文件的内容导入(也就是在当前目录下生成一个.config)。这样,如果有时我们只是需要在别人的基础上修改一些配置的话,就很有用。

OK, That's all. Kernel源码目录下/Documents目录下有很多很好的文档,描述了kernel的很多feature,API和原理。值得参考。
posted @ 2011-01-03 11:04  super119  阅读(1126)  评论(0编辑  收藏  举报