如何编译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和原理。值得参考。
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和原理。值得参考。