Linux內(nèi)核配置與編譯步驟(超詳細(xì))

inux內(nèi)核下載地址:https://www.kernel.org/
ubuntu下載內(nèi)核對(duì)應(yīng)源碼:
sudo apt-get source linux-$(uname -r) ? ?#此命令下載的源碼存放在/usr/src/文件夾中
一、配置:
內(nèi)核編譯時(shí)會(huì)根據(jù)內(nèi)核目錄下的.config文件進(jìn)行編譯,而進(jìn)行內(nèi)核配置時(shí)實(shí)際上就是修改.config文件.一般常見的硬件平臺(tái)在內(nèi)核目錄arch/<平臺(tái)>/configs/文件夾下會(huì)包含有默認(rèn)的配置文件,可以使用cp命令將其覆蓋內(nèi)核根目錄下的.config文件.
在編譯前都必須使用配置命令在內(nèi)核根目錄下進(jìn)行一次配置(即使是使用默認(rèn)的配置文件也必須這樣做).而配置命令有以下幾種:
# make ARCH=<平臺(tái)> config ? ? ? ? ??
#比較繁瑣,不推薦 # make ARCH=<平臺(tái)> oldconfig ? ? ? ?
#常用于內(nèi)核升級(jí),提示新內(nèi)核特性 # make ARCH=<平臺(tái)> menuconfig ? ? ??
#常用 # make ARCH=<平臺(tái)> xconfig ? ? ? ? ?
#X界面的配置方式 # make ARCH=<平臺(tái)> gconfig ? ? ? ? ?
#GTK界面的配置方式 # make ARCH=<平臺(tái)> defconfig ? ? ? ?
#使用默認(rèn)的配置 # make ARCH=<平臺(tái)> allyesconfig ? ??
#所有配置選項(xiàng)設(shè)置為yes # make ARCH=<平臺(tái)> allmodconfig ? ??
#所有選項(xiàng)配置為module
在配置時(shí),每一項(xiàng)都有幾種選項(xiàng),分別為Y,N,M.
Y : 代表將此項(xiàng)編譯入內(nèi)核中
N : 代表不將此項(xiàng)編譯
M : 代表將此項(xiàng)編譯為模塊,在需要使用到的時(shí)候再加載入內(nèi)核
也可以通過直接修改內(nèi)核源代碼目錄中的.config進(jìn)行配置,不過此種方法有點(diǎn)麻煩,之后再說(shuō)。小提示:為了防止內(nèi)核編譯之后配置文件丟失的情況,可以在內(nèi)核配置時(shí)選擇:
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。∏?00名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)?

二、編譯:
首先,內(nèi)核鏡像分為很多種
vmlinux ? ? ? ? ? ? ? ? ? ?編譯后形成鏡像文件
zImage(vmlinuz) ? ? ?在vmlinux的基礎(chǔ)上使用gzip進(jìn)行壓縮所形成的小內(nèi)核(不超過512KB)
bzImage(vmlinuz) ? ?全稱為bigzImage,同zImage一樣原理,只是比zImage鏡像大
uImage(vmlinuz) ? ? 為uBoot專用鏡像,在zImage基礎(chǔ)上再加上一個(gè)頭形成uImage
以arm為目標(biāo)板進(jìn)行交叉編譯內(nèi)核常用的編譯命令為:
# make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- uImage modules ? //-j4 ?使用4個(gè)線程編譯 ? ?ARCH=arm ?目標(biāo)為arm體系結(jié)構(gòu) ? ?CROSS_COMPILE ?交叉編譯器(我的為arm-linux-gnueabihf-) ? ?uImage ?編譯為uImage鏡像 ? ?modules ?同時(shí)也將配置中的模塊進(jìn)行編譯: 在編譯過程中有時(shí)候會(huì)遇到一些錯(cuò)誤,而這些錯(cuò)誤只能夠具體問題具體分析了。
編譯完成后將所有編譯的modules和firmware放入指定文件夾中: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=XXX ? ? #此命令結(jié)束后會(huì)生成兩個(gè)文件夾,fireware和modules,這兩個(gè)文件夾之后應(yīng)該放在lib目錄下進(jìn)行使用。
小提示:有些硬件不僅需要驅(qū)動(dòng),還需要所對(duì)應(yīng)的firmware,而firmware是體系無(wú)關(guān)的文件(X86的也可以復(fù)制到arm下使用),需要下載其所對(duì)應(yīng)的firmware放入到lib/firmware文件夾中。
到此配置和編譯算是完成了,只需把編譯好的鏡像文件及模塊放對(duì)位置就行了。
其他內(nèi)容:
vmlinux,vmlinuz(zImage,bzImage,uImage)關(guān)系
vmlinuz是對(duì)vmlinux進(jìn)行了相應(yīng)壓縮的內(nèi)核鏡像,而zImage,bzImage和uImage統(tǒng)稱為vmlinuz。

zImage實(shí)際上就是將vmlinux使用gzip進(jìn)行壓縮,并在壓縮之后的鏡像前加個(gè)頭,頭里包括一段gzip解壓縮代碼,用于啟動(dòng)時(shí)自解壓。
bzImage和zImage相同,不同的就是zImage會(huì)將內(nèi)核解壓到一個(gè)低端地址(內(nèi)存中第一個(gè)640KB),而bzImage將內(nèi)核解壓到一個(gè)高端地址(大于1M)。
而uImage是uBoot專用的鏡像文件,它是在zImage的基礎(chǔ)上使用mkimage工具生成,其結(jié)果是在zImage上加個(gè)0x40 bytes的頭,其包括:內(nèi)核版本,創(chuàng)建時(shí)間,類型等:
? ? ?#uImage添加的頭 ? ? ?
Image Name: ? Linux 2.4.18 ? ? ?
Created: ? ? ?Mon Jun 24 12:00:01 2002 ? ? ?
Image Type: ? ARM Linux Kernel Image (gzip compressed) ? ? ?
Data Size: ? ?567188 Bytes = 553 kB = 0 MB ? ? ?
Load Address: 0xc0008000 ? ? ?
Entry Point: 0xc0008000
