如何編譯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和原理。 值得參考。


书籍推荐