《Linux內(nèi)核設計與實現(xiàn)(第三版)》中所用的內(nèi)核版本為2.6.34,這個版本太舊了,在高版本系統(tǒng)中編譯各種不支持,所以選了Ubuntu 14.04進行編譯。
編譯準備
編譯環(huán)境:Ubuntu 14.04
GCC版本:4.8.4
編譯的內(nèi)核版本:Linux 2.6.34
內(nèi)核源碼下載:https://mirrors.edge.kernel.org/pub/linux/kernel/
編譯過程
解壓源碼linux-2.6.34.tar.gz,進入源碼目錄執(zhí)行以下命令:
# make mrproper
# make clean
# make config
# make > /dev/null
編譯成功后,源碼目錄所用空間從443M增至4.9G。
上述命令包含三個階段:
1)清理
make mrproper,該命令用于清除Linux內(nèi)核源代碼樹中生成的文件,通常在編譯內(nèi)核時使用,以確保舊的編譯產(chǎn)物被完全清除,以開始一個全新的編譯過程,該命令會刪除所有的編譯生成文件、內(nèi)核配置文件(.config文件)和各種備份文件,所以幾乎只在第一次執(zhí)行內(nèi)核編譯前才用這條命令。
make clean,該命令則是用于刪除大多數(shù)的編譯生成文件,但是會保留內(nèi)核的配置文件.config,還有足夠的編譯支持來建立擴展模塊。所以若只想刪除前一次編譯過程的殘留數(shù)據(jù),只需執(zhí)行make clean命令。
make mrproper刪除的范圍比make clean大,實際上make mrproper在具體執(zhí)行時第一步就是調(diào)用make clean。
2)配置
make config,該命令會逐一遍歷所有配置項,要求用戶選擇yes、no或module,這是一種基于文本的傳統(tǒng)配置方式,它會為內(nèi)核支持的每一個特性向用戶提問,如果用戶輸入“y”,則把該特性編譯進內(nèi)核,如果輸入“m”,則把該特性變成以模塊,如果輸入為“n”,則表示不編譯該特性,用戶的配置選擇結果會存入.config文件。
make config比較繁瑣耗時,可以使用make menuconfig或GTK+圖形界面下的make gconfig來進行配置選擇。
還有兩條與配置相關的命令:
make defconfig,生成默認配置。
make oldconfig,檢查已有的.config文件和Kconfig文件的規(guī)則是否一致,如果一致就什么都不做,否則提示用戶哪些源代碼中有的選項在.config文件沒有,讓用戶進行選擇。Kconfig文件是源碼中提供用來配置內(nèi)核的文件,是各種配置界面(包括make config這樣的文本方式)所需要的源文件,內(nèi)核配置工具讀取各個Kconfig文件,生成配置界面供開發(fā)人員配置內(nèi)核,最后生成配置文件.config。當把一個老版本內(nèi)核源碼中已經(jīng)配置好的.config
文件拷貝到一個新版本源碼文件夾中繼續(xù)使用時,應該執(zhí)行make oldconfig命令,因為新版本內(nèi)核往往會增加配置項。
3)生成
make,生成內(nèi)核映像和內(nèi)核模塊。
補充:
make bzImage,只生成內(nèi)核映像。
make modules,只生成內(nèi)核模塊。
make -jn,開啟n個并發(fā)編譯作業(yè),在多核環(huán)境中可以極大加快編譯速度。
編譯報錯
1)報錯提示:
gcc: error: elf_x86_64: No such file or directory
gcc: error: unrecognized command line option ‘-m’
解決方法:
這是由于gcc 4.6及以上不再支持linker-style架構,需要將arch/x86/vdso/Makefile中,以VDSO_LDFLAGS_vdso.lds開頭所在行的“-m elf_x86_64”替換成“-m64”(注意不是-m 64),將VDSO_LDFLAGS_vdso32.lds開頭所在行的“-m elf_i386”替換成“-m32”。
2)報錯提示:
drivers/net/igbvf/igbvf.h:129:15: error: duplicate member ‘page’
解決方法:
這是因為高版本GCC對舊定義方式不支持所致,把相關結構體struct igbvf_buffer中最后一個struct page *page注釋掉或刪掉。
內(nèi)核安裝
# sudo make modules_install
# sudo make install
make modules_install是安裝內(nèi)核模塊,安裝目錄為/lib/modules,這里會生成一個以內(nèi)核版本號2.6.34命名的子目錄,存放各個以.ko為后綴的模塊文件。
make install是安裝內(nèi)核映像,安裝目錄為/boot,本次安裝中這里被放入四個文件:vmlinuz-2.6.34,initrd.img-2.6.34,System.map-2.6.34,config-2.6.34
vmlinuz:內(nèi)核映像文件。
initrd.img:initrd是initial ramdisk的簡寫,意為初始RAM磁盤,是在系統(tǒng)引導過程中掛載的一個臨時根文件系統(tǒng),initrd綁定到內(nèi)核,并作為內(nèi)核引導過程的一部分加載,用來支持兩階段的引導過程。initrd文件中包含了各種可執(zhí)行程序和驅動程序,它們可以用來掛載真正的根文件系統(tǒng),然后再將這個臨時根文件系統(tǒng)卸載,繼而釋放內(nèi)存。但在很多嵌入式系統(tǒng)中initrd就是最終的根文件系統(tǒng)。
System.map:這是一份用于調(diào)試內(nèi)核的符號對照表,可以將內(nèi)核符號和它們的起始地址對應起來,將內(nèi)存地址翻譯成容易理解的函數(shù)名及變量名。
config:從其內(nèi)容來看,該文件記錄了make config中對內(nèi)核各個配置項的選擇。
可以執(zhí)行make modules_install install將內(nèi)核模塊和內(nèi)核映像一并安裝。
在執(zhí)行make install時,如果/boot目錄下已經(jīng)存在相同版本的內(nèi)核,已存在內(nèi)核會被重命名為vmlinuz-x.x.xx.old。
有些教程中需要手動運行mkinitramfs命令以在/boot下創(chuàng)建initrd文件,但本次測試中運行make install后自動創(chuàng)建了initrd文件。
更新引導
執(zhí)行命令:
# sudo update-grub
選擇內(nèi)核
方式一:
在系統(tǒng)啟動時,按shift鍵進入GRUB菜單,選擇"Advanced Options for Ubuntu",在新菜單頁中選擇指定版本的內(nèi)核啟動,如"Ubuntu, with Linux 2.6.34"。
方式二:
驗證成功
選擇2.6.34版本內(nèi)核重啟系統(tǒng)后,執(zhí)行命令:
# uname -r
可以查看系統(tǒng)當前所用內(nèi)核的版本。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-695061.html
?文章來源:http://www.zghlxwxcb.cn/news/detail-695061.html
?
?
?
到了這里,關于編譯Linux 2.6.34內(nèi)核的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!