序言
第一章 內(nèi)核編譯的基礎(chǔ)
第一節(jié)內(nèi)核簡(jiǎn)介
第二節(jié)內(nèi)核版本
第三節(jié)編譯原因
第四節(jié)準(zhǔn)備工作
第二章 內(nèi)核編譯的流程
第一節(jié)編譯開(kāi)始
第二節(jié)配置內(nèi)核 {核心內(nèi)容}
1.代碼成熟等級(jí)
2..處理器類型和特色
3.對(duì)模塊的支持
4.基本的選擇
5.即插即用支持
6.塊設(shè)備支持
7.網(wǎng)絡(luò)選項(xiàng)
8.電話支持
9.SCSI設(shè)備的支持
10.I2O接口適配器
11.網(wǎng)絡(luò)設(shè)備支持
12.配置業(yè)余無(wú)線廣播
13.紅外支持
14.ISDN的文件系統(tǒng)
15.舊型光驅(qū)類型(非IDE界面的光驅(qū))
16.字符設(shè)備
17.USB支持
18.文件系統(tǒng)
19.控制臺(tái)驅(qū)動(dòng)
20.聲卡驅(qū)動(dòng)
21.Kernel hacking
第二節(jié) 內(nèi)核版本
由于Linux的源程序是完全公開(kāi)的,任何人只要遵循GPL,就可以對(duì)內(nèi)核加以修改并發(fā)布給他人使用。Linux的開(kāi)發(fā)采用的是集市模型(bazaar,與cathedral--教堂模型--對(duì)應(yīng)),為了確保這些無(wú)序的開(kāi)發(fā)過(guò)程能夠有序地進(jìn)行,Linux采用了雙樹(shù)系統(tǒng)。一個(gè)樹(shù)是穩(wěn)定樹(shù)(stable tree),另一個(gè)樹(shù)是非穩(wěn)定樹(shù)(unstable tree)或者開(kāi)發(fā)樹(shù)(development tree)。一些新特性、實(shí)驗(yàn)性改進(jìn)等都將首先在開(kāi)發(fā)樹(shù)中進(jìn)行。如果在開(kāi)發(fā)樹(shù)中所做的改進(jìn)也可以應(yīng)用于穩(wěn)定樹(shù),那么在開(kāi)發(fā)樹(shù)中經(jīng)過(guò)測(cè)試以后,在穩(wěn)定樹(shù)中將進(jìn)行相同的改進(jìn)。一旦開(kāi)發(fā)樹(shù)經(jīng)過(guò)了足夠的發(fā)展,開(kāi)發(fā)樹(shù)就會(huì)成為新的穩(wěn)定樹(shù)。開(kāi)發(fā)數(shù)就體現(xiàn)在源程序的版本號(hào)中;源程序版本號(hào)的形式為x.y.z:對(duì)于穩(wěn)定樹(shù)來(lái)說(shuō),y是偶數(shù);對(duì)于開(kāi)發(fā)樹(shù)來(lái)說(shuō),y比相應(yīng)的穩(wěn)定樹(shù)大一(因此,是奇數(shù))。確定是以″ root ″的身份簽入,然后cd 到 /usr/src 。uname -r 這個(gè)指令將會(huì)顯示版本。內(nèi)核版本的更新可以訪問(wèn)<http://www.kernel.org/>。
第三節(jié) 編譯原因
Linux作為一個(gè)自由軟件,在廣大愛(ài)好者的支持下,內(nèi)核版本不斷更新。新的內(nèi)核修訂了舊內(nèi)核的bug,并增加了許多新的特性。如果用戶想要使用這些新特性,或想根據(jù)自己的系統(tǒng)度身定制一個(gè)更高效,更穩(wěn)定的內(nèi)核,就需要重新編譯內(nèi)核。通常,更新的內(nèi)核會(huì)支持更多的硬件,具備更好的進(jìn)程管理能力,運(yùn)行速度更快、更穩(wěn) 定,并且一般會(huì)修復(fù)老版本中發(fā)現(xiàn)的許多漏洞等,經(jīng)常性地選擇升級(jí)更新的系統(tǒng)內(nèi)核是Linux使用者的必要操作內(nèi)容。
為了正確的合理地設(shè)置內(nèi)核編譯配置選項(xiàng),從而只編譯系統(tǒng)需要的功能的代碼,一般主要有下面四個(gè)考慮:
---自己定制編譯的內(nèi)核運(yùn)行更快(具有更少的代碼) ---系統(tǒng)將擁有更多的內(nèi)存(內(nèi)核部分將不會(huì)被交換到虛擬內(nèi)存中) ---不需要的功能編譯進(jìn)入內(nèi)核可能會(huì)增加被系統(tǒng)攻擊者利用的漏洞 ---將某種功能編譯為模塊方式會(huì)比編譯到內(nèi)核內(nèi)的方式速度要慢一些
以上是針對(duì)成熟的Linux套件如Redhat Linux而言,我的目的是為建造嵌入式Linux操作系統(tǒng)做準(zhǔn)備,也是必由之路。
第四節(jié) 準(zhǔn)備工作
第一部分 新版本內(nèi)核的獲取和更新
Linux內(nèi)核版本發(fā)布的官方網(wǎng)站是<http://www.kernel.org/>,國(guó)內(nèi)各大ftp上一般都可以找到某些版本的內(nèi)核。新版本的內(nèi)核的發(fā)布有兩種形式,一種是完整的內(nèi)核版本,另外一種是patch文件,即補(bǔ)丁。完整的內(nèi)核版本比較大,比如linux-2.4.0- test8.tar.bz2就有18M之多。完整內(nèi)核版本一般是.tar.gz(.tgz)文件或者是.bz2文件,二者分別是使用gzip或者 bzip2進(jìn)行壓縮的文件,使用時(shí)需要解壓縮。patch文件則比較小,一般只有幾十K到幾百K,極少的會(huì)超過(guò)1M。但是patch文件是針對(duì)于特定的版本的,需要找到自己對(duì)應(yīng)的版本才能使用。編譯內(nèi)核需要root權(quán)限。把需要升級(jí)的內(nèi) 拷貝到/usr/src/下(下文中以2.2.16的內(nèi)核的 linux-2.2.16tar.gz為例),命令為
#cp linux-2.2.16tar.gz /usr/src
先查看當(dāng)前/usr/src的內(nèi)容,注意到有一個(gè)linux的符號(hào)鏈接,它指向一個(gè)類似于linux-2.2.14(對(duì)應(yīng)于現(xiàn)在使用的內(nèi)核版本號(hào))的目錄。首先刪除這個(gè)鏈接:
#cd /usr/src #rm -f linux 現(xiàn)在解壓下載的源程序文件。如果所下載的是.tar.gz(.tgz)文件,使用命令:
#tar -xzvf linux-2.2.16tar.gz
如果下載的是.bz2文件,例如linux-2.2.16tar.bz2,使用命令
#bzip2 -d linux-2.2.16tar.bz2 #tar -xvf linux-2.2.16tar
現(xiàn)在再來(lái)看一下/usr/src下的內(nèi)容,發(fā)現(xiàn)現(xiàn)在有了一個(gè)名為linux的目錄,里面就是需要升級(jí)到的版本的內(nèi)核的源程序。還記得那個(gè)名為linux的鏈接么?之所以使用那個(gè)鏈接就是防止在升級(jí)內(nèi)核的時(shí)候會(huì)不慎把原來(lái)版本內(nèi)核的源程序給覆蓋掉了。現(xiàn)在也需要同樣處理:
#mv linux linux-2.2.16 #ln -s linux-2.2.16 linux
如果還下載了patch文件,比如patch-2.2.16,就可以進(jìn)行patch操作(下面假設(shè)patch-2.2.16已經(jīng)位于/usr/src目錄下了,否則需要先把該文件拷貝到/usr/src下):
#patch -p0 < patch-2.2.16
第二部分 準(zhǔn)備主機(jī)板和相關(guān)硬件的說(shuō)明手冊(cè)
其實(shí)也不用太詳細(xì),只要知道您的硬件是屬于哪一類型就行了。例如:有一張SCSI卡,那就要知道這張卡的名字,有一臺(tái)cd-rom,就要知道這臺(tái)光驅(qū)是哪一種牌子的,是否為標(biāo)準(zhǔn)的IDE/ATAPI界面,還是另有專屬接口卡呢?或者,主機(jī)版是否有支持Triton芯片(通常586以上的電腦常有),這些信息能幫助我們,使得設(shè)定變得清楚且容易。因此,不管您有什么使用手冊(cè),準(zhǔn)備好吧。即使現(xiàn)在不用,將來(lái)還是會(huì)用到的(設(shè)X-window system時(shí)要顯示卡的手冊(cè))。
第三部分 檢查聲卡的IRQ設(shè)定和其種類
如果配有一張聲卡,除了要知道卡的種類外(例如 Sound Blaster)還需要知道這張卡的IRQ地址。一般來(lái)說(shuō),盧卡的IRQ地址是5或7而IO地址則為220。DMA則l,不過(guò),有時(shí)不同的聲卡可能會(huì)有不同的設(shè)定。因?yàn)樯院蟮倪x項(xiàng)里,就會(huì)要填入這些數(shù)字。
第四部分 編譯核心的硬件需求
在編譯核心時(shí),確定您的RAM最好在8MB以上, 否則可能會(huì)很慢而且問(wèn)題會(huì)很多,記得查看swap有沒(méi)有打開(kāi)(用free指令)。此外,最好不要超頻,不然很有可能會(huì)發(fā)生signal 11的錯(cuò)誤,使得編到一半的核心停了下來(lái),其實(shí)編譯核心就好比編譯程序一樣,只是因?yàn)闃?gòu)成核心的程序太多了,因此我們能小心盡量小心。
第二章 內(nèi)核編譯的流程
概述編譯的流程:
編譯開(kāi)始----- make mrproper;檢查所需的連接 配置核心 編譯核心 編輯/etc/lilo.conf 重新啟動(dòng)新核心 重新啟動(dòng)機(jī)器 發(fā)現(xiàn)并修理故障(仔細(xì)看我的文章,應(yīng)該沒(méi)多少問(wèn)題了)
第一節(jié) 編譯開(kāi)始
通常要運(yùn)行的第一個(gè)命令是:
#cd /usr/src/linux #make mrproper
該命令確保源代碼目錄下沒(méi)有不正確的目標(biāo).o文件以及文件的互相依賴。如使用剛下載的完整的源程序包進(jìn)行編譯,本步可以省略。而如果多次使用了這些源程序編譯內(nèi)核,那么最好要先運(yùn)行一下這個(gè)命令。
確保/usr/include/目錄下的asm、linux和scsi等鏈接是指向要升級(jí)的內(nèi)核源代碼的。它們分別鏈向源代碼目錄下的真正的、該計(jì)算機(jī)體系結(jié)構(gòu)(對(duì)于PC機(jī)來(lái)說(shuō),使用的體系結(jié)構(gòu)是i386)所需要的真正的include子目錄。如:asm指向/usr/src/linux/include /asm-i386等。若沒(méi)有這些鏈接,就需要手工創(chuàng)建,按照下面的步驟進(jìn)行:
# cd /usr/include # rm -r asm linux scsi # ln -s /usr/src/linux/include/asm-i386 asm # ln -s /usr/src/linux/include/linux linux # ln -s /usr/src/linux/include/scsi scsi
這是配置非常重要的一部分。刪除掉/usr/include下的asm、linux和scsi鏈接后,再創(chuàng)建新的鏈接指向新內(nèi)核源代碼目錄下的同名的目錄。這些頭文件目錄包含著保證內(nèi)核在系統(tǒng)上正確編譯所需要的重要的頭文件。也是上面又在/usr/src下"多余"地創(chuàng)建了個(gè)名為linux的鏈接的原因之一.
一旦萬(wàn)事俱備,轉(zhuǎn)到/usr/src/linux。現(xiàn)在你也許想停下細(xì)讀一下文檔文件,實(shí)際上如果你有些特別的硬件,或幾種光驅(qū)驅(qū)動(dòng)程需要自己動(dòng)手設(shè)置,他們通常這樣做,當(dāng)引導(dǎo)時(shí)這些驅(qū)動(dòng)程序?qū)⒔o出警告,這并不礙事他們照常工作少,閱讀擴(kuò)展名為.txt .h .c的文件。通常我發(fā)現(xiàn)他們具有共性且易于配置。如果你不想冒險(xiǎn),你沒(méi)必要做。記住你照樣可以解開(kāi)tar文件(或再次安裝.rpm文件)恢復(fù)前的文件。
第二節(jié) 配置內(nèi)核 核心內(nèi)容
接下來(lái)的內(nèi)核配置過(guò)程比較煩瑣,但是配置的適當(dāng)與否與日后Linux的運(yùn)行直接相關(guān),有必要了解一下選項(xiàng)的設(shè)置。
配置內(nèi)核可以根據(jù)需要與愛(ài)好使用下面命令中的一個(gè):
#make config (基于文本的最為傳統(tǒng)的配置界面,不推薦使用) #make menuconfig(基于文本選單的配置界面,字符終端下推薦使用,必須安裝ncurses-dev和tk4-dev庫(kù)) #make xconfig (基于圖形窗口模式的配置界面,Xwindow下推薦使用) #make oldconfig (如果只想在原來(lái)內(nèi)核配置的基礎(chǔ)上修改一些小地方,會(huì)省去不少麻煩)
如果不能使用Xwindow,那么就使用make menuconfig好了。界面雖然比上面一個(gè)差點(diǎn),總比make config的要好多了。選擇相應(yīng)的配置時(shí),有三種選擇,它們分別代表的含義如下:
Y--將該功能編譯進(jìn)內(nèi)核 N--不將該功能編譯進(jìn)內(nèi)核 M--將該功能編譯成可以在需要時(shí)動(dòng)態(tài)插入到內(nèi)核中的模塊 在每一個(gè)選項(xiàng)前都有個(gè)括號(hào), 但有的是中括號(hào)有的是尖括號(hào),還有一種圓括號(hào)。 用空格鍵選擇時(shí)可以發(fā)現(xiàn),中括號(hào)里要么是空,要么是"*",而尖括號(hào)里可以是空,"*"和"M"。這表示前者對(duì)應(yīng)的項(xiàng)要么不要,要么編譯到內(nèi)核里;后者則多一樣選擇,可以編譯成模塊。而圓括號(hào)的內(nèi)容是要在所提供的幾個(gè)選項(xiàng)中選擇一項(xiàng)。在編譯內(nèi)核的過(guò)程中,最煩雜的事情就是這步配置工作了,不清楚到底該如何選取這些選項(xiàng)。實(shí)際上在配置時(shí),大部分選項(xiàng)可以使用其缺省值,只有小部分需要根據(jù)用戶不同的需要選擇。選擇的原則是將與內(nèi)核其它部分關(guān)系較遠(yuǎn)且不經(jīng)常使用的部分功能代碼編譯成為可加載模塊,有利于減小內(nèi)核的長(zhǎng)度,減小內(nèi)核消耗的內(nèi)存,簡(jiǎn)化該功能相應(yīng)的環(huán)境改變時(shí)對(duì)內(nèi)核的影響;不需要的功能就不要選;與內(nèi)核關(guān)心緊密而且經(jīng)常使用的部分功能代碼直接編譯到內(nèi)核中。下面對(duì)選項(xiàng)分別加以介紹。
1.Code maturity level options代碼成熟等級(jí)
此處只有一項(xiàng):prompt for development and/or incomplete code/drivers,如果要試驗(yàn)現(xiàn)在仍處于實(shí)驗(yàn)階段的功能,比如khttpd、IPv6等,就必須把該項(xiàng)選擇為Y了;否則可以把它選擇為N。 在Linux的世界里,每天都有許多人為它發(fā)展支持的 driver和加強(qiáng)它的核心。但是有些driver還沒(méi)進(jìn)入穩(wěn)定的階段。但其作者很歡迎其他人去測(cè)試這些driver并提出一些bugs。這個(gè)問(wèn)題是說(shuō),有一些drive還在做測(cè)試中,問(wèn)您是否要選擇這些drive或支持的程序碼。
如果鍵入Y,往后將會(huì)出現(xiàn)一些還在測(cè)試中的東西給您做選擇。(像Java的程序碼和PCI bridge),臺(tái)則就鍵入N。
2. Processor type and features處理器類型和特色
#Processor family (386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC,PPro /6x86MX) [PPro/6x86MX] ------選擇處理器類型,缺省為Ppro/6x86MX。它會(huì)對(duì)每種CPU做最佳化,讓它跑得快又好。一般來(lái)說(shuō),沒(méi)有選擇正確的CPU并不會(huì)有重大的影響(特別是選擇386 ,這樣編譯出來(lái)的核心也許會(huì)比較小但它的速度可能就會(huì)變慢了)。所以,最好要知道您的CPU是哪一種。不過(guò),如果您的gCC編譯器是2.7.0版以前的。那么只能選擇386或是486。
#High Memory Support------內(nèi)核支持的最大內(nèi)存數(shù),缺省為1G。可以支持到4G、6.4G,一般可以不選.
#Math emulation------這項(xiàng)詢問(wèn)是否需L1nux核心模擬數(shù)學(xué)浮點(diǎn)運(yùn)算器。如果有486Dx、AMD以及Pentium機(jī)器的話,這個(gè)選項(xiàng)就不必選了,因?yàn)樗鼈兌加袃?nèi)建的浮點(diǎn)運(yùn)算器。協(xié)處理器是在386時(shí)代的寵兒,現(xiàn)在早已不用了。不過(guò),對(duì)于有內(nèi)建浮點(diǎn)運(yùn)算器的人來(lái)說(shuō),選了這個(gè)選項(xiàng)并不會(huì)因此讓內(nèi)建的浮點(diǎn)運(yùn)算器失效。但它會(huì)增大核心約45KB。
#MTTR (memory type range register)support------選擇該選項(xiàng),系統(tǒng)將生成/proc/mtrr文件對(duì) MTRR進(jìn)行管理,供X server使用。同時(shí)用來(lái)啟動(dòng)pentinum pro和pentinum II 的特殊功能,如果你用的不是這類CPU就選 N,否則也僅僅是使內(nèi)核變大而已。
#Symmetric multi-processing support------對(duì)稱多處理支持。除非有多個(gè)CPU,否則就不用選了。
3. Loadable module support對(duì)模塊的支持.
首先,了解一點(diǎn)關(guān)于模塊的知識(shí)。模塊就像你特意插入核心中的某些東西,如果辦公室有一個(gè)小網(wǎng)絡(luò)并且有時(shí)想用一下(但并不經(jīng)常),也許你想把網(wǎng)卡編譯成一個(gè)模塊。使用這個(gè)模塊,機(jī)器必運(yùn)行和存取/libs下的模塊,意思是驅(qū)動(dòng)程序(IDE,SCSI等但必須是NFS支持的網(wǎng)卡),文件系統(tǒng)(通常是ext2但也可以是nfs)和核心類型(最好是elf)必須編譯在內(nèi)核并且不能是模塊,模塊只有核心引導(dǎo)時(shí)才起作用,驅(qū)動(dòng)程序(來(lái)網(wǎng)絡(luò))的存取,和文件系統(tǒng)安裝。這些文件必須編譯在核心內(nèi)否則將能安裝啟動(dòng)分區(qū)。如果安裝啟動(dòng)分區(qū)和網(wǎng)絡(luò),你需要網(wǎng)絡(luò)系統(tǒng)文件,和己經(jīng)編譯的網(wǎng)卡。為什么要使用模塊? 模塊化使核心變的更簡(jiǎn)捷,它減少核心釋放大量的受保護(hù)的空間。模塊的安裝和卸載使用的空間是可重復(fù)分配利用的。如果你打開(kāi)機(jī)器有90%以上的時(shí)間用到一個(gè)模塊,編譯它。運(yùn)用這類模塊是浪費(fèi)內(nèi)存的,原因是一旦你編譯了模塊它們同樣將占用大量的內(nèi)存,核心需要一些代碼來(lái)掛上模塊。記住,核心在保護(hù)空間運(yùn)行,但模塊并不是。這么說(shuō),并不經(jīng)常使用我的設(shè)備,把它編譯成只支持ext2,ide和elf。而一直使用的網(wǎng)卡,把其它的編譯成模塊:如 a.out, java, floppy, iso9960, msdos, minix, vfat,smb,nfs,smcultra(ethernetcard),serial,printer,sound,ppp, 等等。它們?cè)S多只是在這或那用上那么幾分鐘。嚴(yán)格的說(shuō),這樣做會(huì)使核心增大許多而降低它的執(zhí)行速度。這時(shí)我們就可以把這些可能會(huì)用的驅(qū)動(dòng)程序編譯成一個(gè)— 個(gè)的模塊,在需要用的時(shí)候才用insmod這個(gè)指令加入核心,不用的時(shí)候也能rmmod把它從核心移除,或是用lsmod察看目前所載入的模塊。這里面有三項(xiàng):
#Enable loadable module support------除非準(zhǔn)備把所有需要的內(nèi)容都編譯到內(nèi)核里面,否則該項(xiàng)應(yīng)該是必選的。
#Set version information on all module symbols------通常,我們更新核心版本之后,模塊耍重新的編譯。這個(gè)選項(xiàng)使您不必更新編譯模塊而能使用以前的模塊。可以不選它。但如果您選y,則按照它的說(shuō)明,您必須有g(shù)enksyms這個(gè)程序(可用 whereis指令查看有無(wú)此程序)。
#Kernel module loader------讓內(nèi)核在啟動(dòng)時(shí)有自己裝入必需模塊的能力,建議選上。
注意:在開(kāi)機(jī)就會(huì) mount 上來(lái)的 partition 的 FS 、device driver 記得要 compiler 進(jìn) kernel,不能把它弄成 modules。請(qǐng)不要夸張到為了完全模組化而忘了把ext2fs和IDE dirver compiler 進(jìn) kernel 里。
#Support for hot-pluggabel devices ------熱插拔設(shè)備支持。支持的不是太好,可不選。
#PCMCIA/CardBus support------PCMCIA/CardBus支持。有PCMCIA就必選了。
#PCI bridge optimization (experimental) ------在某些支持BIOS上,它能讓存取速度加快,建議是選Y。
#Backward-compatible /proc/pci------設(shè)備兼容,自己看help。
#System V IPC 如果將來(lái)想編譯dosemu(DOS模擬器),則這個(gè)選項(xiàng)一定要選,它是一個(gè)讓各個(gè)程序(process)同步且能彼此交換數(shù)據(jù)的函數(shù)庫(kù)和一些系統(tǒng)的調(diào)用,沒(méi)它,很多的程序?qū)?huì)無(wú)法執(zhí)行。
#BSD Process Accounting------
#Sysctl support------除非你的內(nèi)存少的可憐,否則你應(yīng)該啟動(dòng)這個(gè)功能,啟用該選項(xiàng)后內(nèi)核會(huì)大8K,但能讓你直接改變內(nèi)核的參數(shù)而不必重新開(kāi)機(jī)。
#Kernel support for A.OUT binaries ------a.out的執(zhí)行文件是比較古老的可執(zhí)行碼,用在比較早期的 UNIX系統(tǒng)上。Linux最初也是使用這種碼來(lái)執(zhí)行程序,一直到ELF格式的可執(zhí)行碼出來(lái)后,有愈來(lái)俞多的程序碼隨著ELF格式的優(yōu)點(diǎn)而變成了ELF的可執(zhí)碼。將來(lái)勢(shì)必完全取代a.out格式的可執(zhí)行碼。但目前由于沿有許多的程序還沒(méi)有取代過(guò)來(lái),所以只好選擇Y,等將來(lái)有一天,全部的程序都變成了ELF 的天下時(shí),那時(shí)再disable掉。
|