年紀大了,記性不好,這篇文檔作為自學(xué)筆記,也算是積累,給自己一個交待。
Linux內(nèi)核編譯的大致流程如下:
一、獲取內(nèi)核代碼:編譯內(nèi)核代碼之前一定要獲取到內(nèi)核代碼,到http://www./下載
查詢當前系統(tǒng)的版本號的命令:uname
切換到root用戶: su
二、配置內(nèi)核:內(nèi)核代碼包括有很多功能,通過配置文件,選擇編譯選項,實現(xiàn)定制內(nèi)核的目的。
1. 如果.config不存在,運行make config/menuconfig時,編譯器找到每個子目錄下的Kconfig文件,并使用其中的缺省值生成.config文件。
2. 如果.config存在,運行make config/menuconfig時的缺省設(shè)置即是當前.config的設(shè)置,若對設(shè)置進行了修改,.config將被更新。 3. arch/xxx/defconfig是一個缺省的配置文件,make defconfig時會根據(jù)這個文件生成當前的.config。 4. arch/xxx/configs文件夾中有許多命名為xxx_defconfig的配置文件,如果運行make xxx_defconfig,當前.config文件會由xxx_defconfig文件生成。 5. make oldconfig的作用和make config類似,但是它的作用是在現(xiàn)有的內(nèi)核設(shè)置文件基礎(chǔ)上建立一個新的設(shè)置文件,只會向用戶提供有關(guān)新內(nèi)核特性的問題,在新內(nèi)核升級的過程 中,make oldconfig非常有用,用戶將舊的配置文件.config復(fù)制到新內(nèi)核的源碼中,執(zhí)行make oldconfig,舊的配置文件.config會被備份,同時用戶只需要回答那些針對新增特性的問題。 一般,就用make menuconfig。
2、內(nèi)核編譯選項
編譯選項數(shù)量眾多,詳細請參考《Linux內(nèi)核配置參考》,反正我是直接使用默認生成的.config就可以了。不過以下建議將避免您最終得出一個不能工作的內(nèi)核:
三、編譯內(nèi)核
1、編譯內(nèi)核
make或make bzImage
編譯好的內(nèi)核文件名是bzImage,生成的文件放在arch/<cpu>/boot/目錄下面。
2、編譯內(nèi)核模塊
make moudles
3、安裝內(nèi)核模塊
make moudles_install
所謂安裝,就是將編譯好的內(nèi)核模塊從內(nèi)核源代碼目錄copy到lib/modules/目錄下,并根據(jù)被編譯內(nèi)核的版本號生成一個新的子目錄。我們在做實驗的時候,為了安全起見,最好備份好modules目錄。
四、制作Ramdisk
首先要了解內(nèi)核與ramdisk的關(guān)系:
Linux系統(tǒng)在啟動的過程中,需要mount根文件系統(tǒng),此時除非將根文件系統(tǒng)涉及的所有模塊全部(各種文件系統(tǒng)、各種塊設(shè)備驅(qū)動、IDE、SATA)編譯到內(nèi)核文件,否則內(nèi)核無法完成根文件系統(tǒng)的mount操作,但是如果都編譯的話,內(nèi)核就太大了,所以一般來說驅(qū)動/模塊都駐留在根文件系統(tǒng)本身上/lib/modules/xxx,那么問題就來了,現(xiàn)在要mount根文件系統(tǒng)卻需要根文件系統(tǒng)上的模塊文件,怎么辦?于是,就想出ramdisk,內(nèi)核總是能安裝ramdisk的(注:這是因為ramdisk和內(nèi)核一樣都是一個內(nèi)存文件,也是由bootloader通過低級讀寫命令(如uboot用nand read,而不用通過文件系統(tǒng)層提供的高級讀寫接口)加載進內(nèi)存,因此內(nèi)核可以掛載內(nèi)存里ramdisk文件系統(tǒng)),然后把所有可能需要的驅(qū)動/模塊都放在ramdisk上,首先,讓內(nèi)核將ramdisk當作根文件系統(tǒng)來安裝,然后再用這個根文件系統(tǒng)上的驅(qū)動來安裝真正的根文件系統(tǒng),就將這個矛盾問題解決了。
1、重新制作內(nèi)核映像
mkinitrd initrd-2.6.29 2.6.29
其中 2.6.29為/lib/modules下的目錄名稱
將內(nèi)核文件bzImage和鏡像文件initrd-2.6.29一起拷貝到/boot/目錄下,并將內(nèi)核改名為vmlinuz-2.6.29。
修改/etc/grub.conf文件
title MyZinux (2.6.29)
root (hd0,0) kernel /vmlinuz-2.6.29 ro root=UUID=e7ff8cb4-6560-4c5e-99f3-9314e10ed40d rhgb quiet initrd /initrd-2.6.29 【相關(guān)知識】makefile文件:
內(nèi)核版本號由 Makefile 的第一行決定:
|
|