下面的實(shí)驗以 debian7.5 64bit 為例.
獲取 debian7.5 本身的源碼非常簡(jiǎn)單:
sudo apt-get install linux-sourcehttps://www.kernel.org/ 的git上提供的源碼分支非常多, 剛開(kāi)始學(xué)習源碼主要關(guān)注下面幾個(gè)分支:
上面的列出的git樹(shù)中都可以獲取想要的源碼.
其實(shí)編譯內核和編譯普通軟件也沒(méi)多大區別, 只是內核編譯的參數非常之多.
下面就來(lái)先看看如何設置內核編譯參數
配置編譯選項:
設置內核編譯選項是通過(guò) kconfig 這個(gè)工具來(lái)完成的.
kconfig 的源碼就是內核代碼中 script/kconfig 目錄下
各個(gè)編譯選項的選擇有3種方式:
編譯方法:
編譯很簡(jiǎn)單, 內核編譯選項設置好之后, 只需簡(jiǎn)單的命令 make, 就可以編譯了.
由于內核代碼的龐大, 所以和一般應用程序相比, 編譯時(shí)間會(huì )很長(cháng). 可以嘗試以下方法來(lái)加快編譯速度:
使用 make localmodconfig 來(lái)生成僅以正在使用的內核模塊為對象的 .config (一般這樣生成的.config中包含的內核模塊最少, 所以編譯速度快)
編譯時(shí)間比較: 測試環(huán)境 - debian v7.5虛擬機(cpu: 單核, 內存: 512MB)
| .config生成 | make時(shí)間 | 生成的modules | 備注 |
|---|---|---|---|
| make menuconfig | 1小時(shí)13分41秒 | 3052個(gè).ko, 共1.2GB | 默認配置, 什么也不選擇 |
| make localmodconfig | 19分36秒 | 337 個(gè).ko, 共176MB |
注 modules 是通過(guò) make modules_install 之后, 在 /lib/modules 中根據編譯內核版本號來(lái)查看的
查看有多少個(gè) .ko 文件的方法:
cd /lib/modules/3.2.60find . -name '*.ko' | wc -l模塊和內核不在一起的編譯, 就是在現有的內核中追加一些內核模塊時(shí), 不需要將內核也重新編譯.
模塊分開(kāi)編譯的方法很簡(jiǎn)單, 參考之前的博客: 《Linux內核設計與實(shí)現》讀書(shū)筆記(六)- 內核數據結構 這篇博客中的例子就是和內核分開(kāi)編譯的模塊.
交叉編譯就是在當前平臺上編譯其他平臺上的內核二進(jìn)制映像, 比如在 x86_64 平臺上編譯 arm 的內核映像.
交叉編譯需要目標平臺的交叉編譯器. 編譯時(shí)主要是 ARCH 和 CROSS_COMPILE 2個(gè)變量的設置.
下面舉個(gè)交叉編譯 ARM 的例子: 公司用的制作 Cubieboard 板子上的image中的一段編譯內核的代碼
make -C ${CB_KSRC_DIR} O=${CB_KBUILD_DIR} ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- kernel_defconfigmake -C ${CB_KSRC_DIR} O=${CB_KBUILD_DIR} ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 INSTALL_MOD_PATH=${CB_TARGET_DIR} uImage modules上述 第一行 是編譯內核源碼. 第二行 是創(chuàng )建 uImage 格式的內核映像以及創(chuàng )建內核模塊
最終在 INSTALL_MOD_PATH 生成的內核模塊可以直接拷貝到 arm機器上使用.
debian 系 linux下生成 內核源碼包的方法
make deb-pkgmake modules_install (安裝內核模塊到 /lib/modules 下)
make install (安裝內核二進(jìn)制映像, 生成并安裝boot初始化文件系統映像文件)
聯(lián)系客服