編譯內核步驟:
1.
先查看自己OS使用的內核版本
mrzhang@mrzhang:~$ uname -r
4.4.0-51-generic
mrzhang@mrzhang:~$
2.
如果安裝系統時,自動安裝了源碼。在 /usr/src 目錄下有對應的使用的版本目錄(ubuntu安裝完一般沒有源碼需要自己下載)。如下:
后綴generic表示通用版。
mrzhang@mrzhang:/usr/src$ ls
linux-headers-4.4.0-21 linux-headers-4.4.0-21-generic linux-headers-4.4.0-51 linux-headers-4.4.0-51-generic
3.
下載源碼 指令apt-cache search linux-source查看系統可用的源碼版本
mrzhang@mrzhang:/usr/src$ apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-4.4.0 - Linux kernel source for version 4.4.0 with Ubuntu patches
linux-source-4.8.0 - Linux kernel source for version 4.8.0 with Ubuntu patches
mrzhang@mrzhang:/usr/src$
安裝linux源碼。下載源碼包。
mrzhang@mrzhang:/usr/src$ sudo apt-get install linux-source-4.4.0
下載完成后,在/usr/src下,文件名為:linux-source-4.4.0.tar.bz2,是一個壓縮包,解壓縮既可以得到整個內核的源代碼:
注意 已經切換到超級用戶模式
root@mrzhang:/usr/src#tar jxvf linux-source-4.4.0.tar.bz2
解壓后生成一個新的目錄/usr/src/linux-source-4.4.0,所有的源代碼都在該目錄下。
4. 鏈接源碼樹
ln -s /usr/src/linux-source-4.4.0/ /lib/modules/4.4.0-51-generic/build #源代碼的目錄要和build的內核版本匹配
進入該目錄
開始配置內核 選擇最快的原版的配置(默認)方式 (我是如此)
root@mrzhang:/usr/src/linux-source-4.4.0# make oldconfig
當然你也可以使用 自己喜歡的配置方式 如 menuconfig , xconfig(必須有GTK環境吧)。反正不用剪裁什么,所以不管那種方式能配置它就行了。
完成后,開始make 吧 這兒比較久 一般有1一個小時吧。
直接make bzImage。執行結束后,可以看到在當前目錄下生成了一個新的文件: vmlinux, 其屬性為-rwxr-xr-x。
mrzhang@mrzhang:/usr/src/linux-source-4.4.0$ make bzImage
第一次會出現如下錯誤:
scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h
解決方法如下:缺少這個庫。
sudo apt-get install libssl-dev
然后 :
root@mrzhang:/usr/src/linux-source-4.4.0#make modules #將內核選項中的M選項的配置編譯為了*.ko文件。
root@mrzhang:/usr/src/linux-source-4.4.0#make modules_install #將生成的*.ko文件復制到/lib/modules/<內核版本號>/下面,並運行depmod生成modules.dep內核模塊的依賴文件,insmod和modprobe需要這些依賴去自動加載依賴的ko文件,否則需要手動添加依賴模塊后,才能將內核模塊insert進內核中去。 或者用modprobe, modprobe會讀取文件 /lib/modules/4.4.0-51-generic/modules.dep . 此文件可以由工具depmod 根據當前加載的ko模塊生成。這個文件主要指明了內核版本需要加載哪些內核模塊以及內核模塊的依賴模塊。modules.dep假設ko文件位於目錄/lib/modules/version/目錄下面。
以行為單位
#modulea.ko 依賴depend1.ko和depned2.ko
MODULEA.ko: DEPEND1.ko DEPEND2.ko
更准確的描述如下:
/lib/modules/2.6.29/kernel/a.ko: /lib/modules/2.6.29/kernel/c.ko /lib/modules/2.6.29/kernel/b.ko
/lib/modules/2.6.29/kernel/b.ko:
/lib/modules/2.6.29/kernel/c.ko: /lib/modules/2.6.29/kernel/b.ko
modproe a.ko的時候,他會按照順序(從右向左)加載b.ko和c.ko.
執行結束之后,會在/lib/modules下生成新的目錄/lib/modules/linux-source-4.4.0-generic/
。 在隨后的編譯模塊文件時,要用到這個路徑下的build目錄。至此,內核編譯完成。可以重啟一下系統。