如何编译Linux Kernel

很多人都问到如何编译Linux 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找到。交叉编译中经常提到的工具链(toolchain),就是这些东西。
 
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)。这样,如果有时我们只是需要在别人的基础上修改一些配置的话,就很有用。 
 
Kernel源码目录下/Documents目录下有很多很好的文档,描述了kernel的很多feature,API和原理。值得参考。
原文地址:https://www.cnblogs.com/super119/p/1904382.html