|  | |
| Linux內核配置與編譯 | |
| 1.內核(he)配置   編(bian)譯(yi)內核之(zhi)前要(yao)先配(pei)置。為了正確、合理(li)地設置內核編(bian)譯(yi)配(pei)置選項,從而只編(bian)譯(yi)系統需要(yao)的功能(neng)的代碼,主要(yao)有以(yi)下4個方面需要(yao)考慮。     ● 尺寸小。自己定制內核可以使代碼尺寸減小,運行將會更快。 Linux內(nei)(nei)核(he)源(yuan)(yuan)代碼(ma)支持20多種體(ti)系結構的處理器(qi),還(huan)有各種各樣的驅(qu)動程序。因此,在編譯前必須根據特(te)定平臺配置(zhi)內(nei)(nei)核(he)源(yuan)(yuan)代碼(ma)。Linux內(nei)(nei)核(he)有上(shang)千個配置(zhi)選(xuan)項,配置(zhi)相(xiang)當復雜。所以,Linux內(nei)(nei)核(he)源(yuan)(yuan)代碼(ma)組織(zhi)了一個配置(zhi)系統。 Linux內核配(pei)(pei)置(zhi)系統可(ke)以生(sheng)成內核配(pei)(pei)置(zhi)菜單(dan),方便內核配(pei)(pei)置(zhi)。配(pei)(pei)置(zhi)系統主要包(bao)含(han)Makefile、Kconfig和配(pei)(pei)置(zhi)工(gong)具(ju),可(ke)以生(sheng)成配(pei)(pei)置(zhi)接口(kou)。配(pei)(pei)置(zhi)接口(kou)是通(tong)過(guo)工(gong)具(ju)來生(sheng)成的,工(gong)具(ju)通(tong)過(guo)Makefile編譯(yi)執行,選項則是通(tong)過(guo)各級目(mu)錄(lu)的Kconfig文件定義的。 Linux內核配(pei)置(zhi)命令有make config、make menuconfig和(he)make xconfig,它們(men)分別是字符接口、ncurses光標菜(cai)單和(he)X-window圖形窗口的(de)(de)配(pei)置(zhi)接口。字符接口配(pei)置(zhi)方式需要(yao)回(hui)(hui)答(da)(da)每一個選項提示,逐個回(hui)(hui)答(da)(da)內核上(shang)千個選項幾乎是行不通的(de)(de);圖形窗口的(de)(de)配(pei)置(zhi)接口很好(hao),光標菜(cai)單也方便實(shi)用(yong)。例如(ru),執行make xconfig,主(zhu)菜(cai)單接口如(ru)圖1.5所示。 
 2.內核編譯  (1)下(xia)載(zai)內(nei)核(he)源(yuan)碼。 從//www.kernel.org/pub/Linux/kernel/v2.6/Linux-2.6.14.tar.bz2下載Linux-2.6.14內核(he)(或者更高(gao)的(de)版本)至/source/kernel目(mu)錄。解開壓縮包,并進入內核(he)源碼目(mu)錄,具體過程如下:     $ tar jxvf Linux-2.6.14.tar.bz2 (2)修改內核目錄樹根下的Makefile,指明交叉編譯器: $ vim Makefile   找到ARCH和(he)CROSS_COMPILE,修(xiu)改:     ARCH  = arm  (3)設置環境變量(liang): $ export PATH=$PATH:/usr/local/arm/3.3.2/bin (4)配置(zhi)內核產生.config文件:   $ cp arch/arm/configs/smdk2410_defconfig .config (5)輸入內核配置命(ming)令,進行內核選(xuan)(xuan)項的選(xuan)(xuan)擇,命(ming)令如下: $ make menuconfig 命令執(zhi)行(xing)成(cheng)功以后,會看到如圖(tu)(tu)1.6所示的界(jie)(jie)面(mian)。其實我(wo)們在圖(tu)(tu)1.5中看到過同樣功能(neng)的界(jie)(jie)面(mian),那個圖(tu)(tu)也是內核選項配置界(jie)(jie)面(mian),只不過那個界(jie)(jie)面(mian)在X-window下才能(neng)執(zhi)行(xing)。 
 在各級(ji)子(zi)菜單項中,選擇相應的配(pei)置時,有3種選擇,它們(men)代表的含(han)義(yi)分別如(ru)下。     ● Y:將該功能編譯進內核。 如果使(shi)(shi)用(yong)的是make xconfig,使(shi)(shi)用(yong)鼠標就可以選擇對(dui)應的選項。如果使(shi)(shi)用(yong)的是make menuconfig,則需要(yao)使(shi)(shi)用(yong)回車鍵進行選取。 在(zai)(zai)每一個選(xuan)項(xiang)(xiang)前都有個括號(hao),有的(de)(de)是(shi)中(zhong)(zhong)括號(hao),有的(de)(de)是(shi)尖括號(hao),還有的(de)(de)是(shi)圓括號(hao)。用(yong)空格鍵選(xuan)擇時可以(yi)發(fa)現,中(zhong)(zhong)括號(hao)中(zhong)(zhong)要(yao)么(me)是(shi)空,要(yao)么(me)是(shi)“*”;而(er)尖括號(hao)中(zhong)(zhong)可以(yi)是(shi)空、“*”和“M”。這表示前者(zhe)(zhe)對應的(de)(de)項(xiang)(xiang)要(yao)么(me)不要(yao),要(yao)么(me)編譯到內核中(zhong)(zhong);后者(zhe)(zhe)則多(duo)一樣選(xuan)擇,可以(yi)編譯成模塊。而(er)圓括號(hao)的(de)(de)內容是(shi)要(yao)你在(zai)(zai)所提(ti)供的(de)(de)幾個選(xuan)項(xiang)(xiang)中(zhong)(zhong)選(xuan)擇一項(xiang)(xiang)。 在編(bian)譯(yi)內(nei)核(he)(he)(he)的(de)(de)過程中,麻(ma)煩的(de)(de)事(shi)情就(jiu)是配(pei)置(zhi)這步工作了。初(chu)次接(jie)觸Linux內(nei)核(he)(he)(he)的(de)(de)開(kai)發者(zhe)往(wang)往(wang)弄不清楚該(gai)(gai)如何(he)選(xuan)(xuan)(xuan)取(qu)這些選(xuan)(xuan)(xuan)項。實際上(shang),在配(pei)置(zhi)時,大部分(fen)選(xuan)(xuan)(xuan)項可以使用其(qi)默認值,只有小部分(fen)需要(yao)根據用戶不同的(de)(de)需要(yao)選(xuan)(xuan)(xuan)擇。選(xuan)(xuan)(xuan)擇的(de)(de)原則是將與內(nei)核(he)(he)(he)其(qi)他部分(fen)關系較遠且不經(jing)常使用的(de)(de)部分(fen)功能代碼(ma)編(bian)譯(yi)成為可加載模塊,這有利于減小內(nei)核(he)(he)(he)的(de)(de)長度(du),減少內(nei)核(he)(he)(he)消(xiao)耗(hao)的(de)(de)內(nei)存,簡化該(gai)(gai)功能相應的(de)(de)環(huan)境改變時對(dui)內(nei)核(he)(he)(he)的(de)(de)影響;不需要(yao)的(de)(de)功能就(jiu)不要(yao)選(xuan)(xuan)(xuan);與內(nei)核(he)(he)(he)關系緊密而且經(jing)常使用的(de)(de)部分(fen)功能代碼(ma)直接(jie)編(bian)譯(yi)到(dao)內(nei)核(he)(he)(he)中。 (6)執(zhi)行下面的命令開始(shi)編譯: $ make zImage 在編譯過(guo)程中會出現一些錯(cuo)誤,可(ke)以(yi)看到(dao)錯(cuo)誤發生在/drivers/video/console中。有時是因(yin)為我們選(xuan)擇了“VGA text console”選(xuan)項(xiang)(xiang),去掉這(zhe)個(ge)選(xuan)項(xiang)(xiang)即可(ke)。這(zhe)個(ge)選(xuan)項(xiang)(xiang)在“Device Driver”→“Graphics Support”→“console display driver support”下(xia)。 總之(zhi),這(zhe)類錯誤是由于內(nei)核(he)配置(zhi)不(bu)當(dang)引起的,不(bu)需要修(xiu)改內(nei)核(he)源碼。 如果按照(zhao)默認的(de)配(pei)置,沒有(you)改動(dong)的(de)話,編譯后系統會在arch/arm/boot目錄下生(sheng)成(cheng)一個(ge)(ge)zImage文(wen)件(jian),這個(ge)(ge)文(wen)件(jian)就(jiu)是剛剛生(sheng)成(cheng)的(de)內核文(wen)件(jian)。我們需要把它加(jia)載(zai)到開發板中運(yun)行,加(jia)以驗(yan)證。 (7)下載(zai)Linux內(nei)核(he)。加(jia)載(zai)到(dao)開發板的(de)方式是通過U-Boot提(ti)供的(de)網(wang)絡功能,直接(jie)下載(zai)到(dao)開發板的(de)內(nei)存中(zhong)。首(shou)先把內(nei)核(he)復(fu)制到(dao)tftp服務器的(de)根目錄下(見(jian)tftp配置文件(jian)說明)。在我(wo)們(men)的(de)實(shi)驗中(zhong),這個目錄在/tftpboot下,所以我(wo)們(men)在內(nei)核(he)源碼目錄中(zhong)直接(jie)執(zhi)行(xing)下面命令:  $ cp arch/arm/boot/zImage /tftpboot   啟動開發(fa)板,在U-Boot界面下(xia)輸入下(xia)面一組命令:     FS2410# printenv	(查看當前開發板的環境變量) 如果網絡暢(chang)通,執行下面(mian)的命令下載內核(he):     FS2410#tftp 30008000 zImage  (把Linux內核下載到開發板內存的30008000地址處) 此(ci)時可以在超級終端中觀察(cha)到內核的啟動現象(xiang),不過內核在此(ci)時還(huan)(huan)不會成功啟動,因為還(huan)(huan)需要做一些其他(ta)的移植工作。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點鏈接(jie):       
         1、Linux內核結構介紹 |