查看單個文章
舊 2004-07-10, 03:13 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 一篇編譯內核的詳細配置文章

一篇編譯內核的詳細配置文章(超長-強烈推薦)

前言之前言:誰是這篇文章的讀者?

不習慣讀英文資料的非LINUX高手
音效卡不響光碟不轉連不上網等等,只要有問題就行
開發嵌入式操作系統

現在流行的ODL(only disk linux)中做內核部分,那些文章不介紹此點內容。我正在做
,完工後整理資料。
BY THE WAY ,想成為LINUX高手嗎?你需要熟練掌握KERNEL COMPILE 、XCONFIGRATER
、LINUXCONFIG、 SAMBA四大利器,你隨時可以找到後三者的大量相關資料,但內核編譯
就只好啃為數不多的英文了。
筆者耗時3月,搜集並整理大量資料,在兒童節前連續工作18個小時後,給小企鵝送了這
份禮物。
筆者自信是目前為止KERNEL編譯方面最完備的中文資料(將不斷翻譯補充),這可是畢
業論文哪!
為什麼要放網上呢?首先找這方面資料太難了,文章對各位LINUX愛好者會有所說明 。其
次,取之於網用之於網。
歡迎使用這篇文章,請隨便引用,這才符合LINUX自由軟體的精神嘛,不過別忘了提提我
的名字,就算為我的辛苦付了點稿酬。
介於內核方面資料較少,歡迎在這篇文章中增加和修改內容,但不要過多刪除,筆者列
表要加入你的名字,讓我們為把它變成數百頁的資料而努力。OK,交個朋友吧, 我是玉
玉安,email :ziboyuyuan@263.net <ZIBOyuyuan@263.net>
目錄
序言
第一章 內核編譯的基礎
第一節內核簡介
第二節內核版本
第三節編譯原因
第四節準備工作
第二章 內核編譯的流程
第一節編譯開始
第二節配置內核 {核心內容}
1.程式碼成熟等級
2..處理器類型和特色
3.對模組的支持
4.基本的選項
5.即插即用支持
6.塊設備支持
7.網路選項
8.電話支持
9.SCSI設備的支持
10.I2O接頭橋接器
11.網路設備支持
12.配置業餘無線廣播
13.紅外支持
14.ISDN的文件系統
15.舊型光碟類型(非IDE界面的光碟)
16.字串設備
17.USB支持
18.文件系統
19.控制台驅動
20.音效卡驅動
21.Kernel hacking
第三節編譯內核
第四節啟用內核
附錄:LILO分析
第三章 內核編譯的套用
第一節嵌入式Linux技術
第二節你的Linux有多大(及實踐結果)
結束語
參考文獻
序言
近幾年,linux大行其道,令不滿windows顯示藍色的使用者躍躍欲試,結果發現linux安裝不
及windows方便,界面不及windows友好,配置不及windows容易,軟體不及windows豐富
,以至淺嘗輒止。
其實, Linux有windows無可比擬的兩個優勢:網路套用和嵌入式技術,這也正是未來最
有前途的方向。同時此課題是從理論上設計具有嵌入式Linux操作系統器件的重要組成部
分。
如要涉足這兩個方面,就必須對內核有深刻理解。當然,您可以從來源碼入手,但前提
是您擁有程序設計和操作系統等多方面專業知識,否則,就利用現成的Linux kernel從
編譯內核開始吧。不幸的是,內核編譯方面的資料匱乏。以上兩個原因使我寫這篇論文
成為必要。我可以自信得說,這是目前最詳盡的內核編譯方面的中文資料。
值得一提的是,我在搜集翻譯資料的程序中,獲得了操作系統、程序設計、硬體設備、
網路通信等各方各面的知識,極大的拓寬了視野,真正學有所獲。
感謝所有為Linux發展作出貢獻的人,感謝所有Linux中文網站為促進Linux在中國的發展
作出的不懈努力,他們是我搜集資料的來源。
特別感謝我的指導老師——官伯然教授和高斌博士,正是他們的辛勤指導讓我順利完成
畢業設計。
西電科大 :李玉元 2001/6/1
備註:#----------後跟小的選項
##---------後還有更細選項
注意------上機實踐結果
第一章 內核編譯的基礎
第一節 內核簡介
內核,是一個操作系統的核心,它負責管理系統的工作、記憶體、設備驅動程式、文件和
網路系統,決定著系統的效能和穩定性。 就好比DOS下的IO.SYS和MSDOS.SYS一體,我
們可以把這兩個文件叫做DOS的核心。Linux也有它的核心,通常在根目錄下,一個叫vm
linuz的文件。我們用這個文件來控制我們的整台PC,包括周邊設備和軟硬磁牒機、CD-
ROM、音效卡等。簡單地說,核心就是操作系統本身。沒有了它,就像一個無人住的家,沒
有人去維持這個家的動作。一個安定的家需要一個很用心已能當機立斷的主人:一部電
腦也需要很有效率已穩定的核心,也就是操作系統。因此,核心是整個系統維持下去的
關鍵。
Linux的一個重要的特點就是其來源碼的公開性,所有的內核源程序都可以在/usr/src/
linux下找到,大部分應用軟體也都是遵循GPL而設計的,你都可以獲取相應的源程序代
碼。任何一個軟體工程師都可以將自己認為優秀的程式碼加入到其中,由此引發的一個明
顯的好處就是Linux修補漏洞的快速以及對最新軟體技術的利用。而Linux的內核則是這
些特點的最直接的代表。
想像一下,擁有了內核的源程序對你來說意味著什麼?首先,我們可以瞭解系統是如何
工作的。通過通讀來源碼,我們就可以瞭解系統的工作原理,這在Windows下簡直是天方
夜譚。其次,我們可以針對自己的情況,量體裁衣,定制適合自己的系統,這樣就需要
重新編譯內核。在Windows下是什麼情況呢?相信很多人都被越來越龐大的Windows整得
莫名其妙過。再次,我們可以對內核進行修改,以符合自己的需要。這意味著什麼?沒
錯,相當於自己開發了一個操作系統,但是大部分的工作已經做好了,你所要做的就是
要增加並實現自己需要的功能。在Windows下,除非你是微軟的核心技術人員,否則就不
用癡心妄想了。
先介紹一下編譯核心的選項,希望能對大家消除對內核的神秘感有所說明 。
1.程式碼成熟等級
2..處理器類型和特色
3.對模組的支持
4.基本的選項
5.即插即用支持
6.塊設備支持
7.網路選項
8.電話支持
9.SCSI設備的支持
10.I2O接頭橋接器
11.網路設備支持
12.配置業餘無線廣播
13.紅外支持
14.ISDN的文件系統
15.舊型的光碟類型(非IDE界面的光碟)
16.字串設備
17.USB支持
18.文件系統
19.控制台驅動
20.音效卡驅動
21.Kernel hacking
第二節 內核版本
由於Linux的源程序是完全公開的,任何人只要遵循GPL,就可以對內核加以修改並發佈
給他人使用。Linux的開發採用的是集市模型(bazaar,與cathedral--教堂模型--對應
),為了確保這些無序的開發程序能夠有序地進行,Linux採用了雙樹系統。一個樹是穩
定樹(stable tree),另一個樹是非穩定樹(unstable tree)或者開發樹(developm
ent tree)。一些新特性、實驗性改進等都將首先在開發樹中進行。如果在開發樹中所
做的改進也可以套用於穩定樹,那麼在開發樹中經過測試以後,在穩定樹中將進行相同
的改進。一旦開發樹經過了足夠的發展,開發樹就會成為新的穩定樹。開發數就體現在
源程序的版本號中;源程序版本號的形式為x.y.z:對於穩定樹來說,y是偶數;對於開
發樹來說,y比相應的穩定樹大一(因此,是奇數)。確定是以〞 root 〞的身份簽入,
然後cd 到 /usr/src 。uname -r 這個指令將會顯示版本。內核版本的更新可以訪問<h
ttp://www.kernel.org/>。
第三節 編譯原因
Linux作為一個自由軟體,在廣大愛好者的支持下,內核版本不斷更新。新的內核修訂了
舊內核的bug,並增加了許多新的特性。如果用戶想要使用這些新特性,或想根據自己的
系統度身定制一個更高效,更穩定的內核,就需要重新編譯內核。
通常,更新的內核會支持更多的硬體,具備更好的工作管理能力,執行速度更快、更穩
定,並且一般會修復老版本中發現的許多漏洞等,經常性地選項昇級更新的系統內核是
Linux使用者的必要操作內容。
 
為了正確的合理地設定內核編譯配置選項,從而只編譯系統需要的功能的程式碼,一般主
要有下面四個考慮:
  ---自己定制編譯的內核執行更快(具有更少的程式碼)
  ---系統將擁有更多的記憶體(內核部分將不會被交換到虛擬記憶體中)
  ---不需要的功能編譯進入內核可能會增加被系統攻擊者利用的漏洞
  ---將某種功能編譯為模組方式會比編譯到內核內的方式速度要慢一些
以上是針對成熟的Linux套件如Redhat Linux而言,我的目的是為建造嵌入式Linux操作系
統做準備,也是必由之路。
第四節 準備工作
第一部分 新版本內核的獲取和更新
Linux內核版本發佈的官方網站是<http://www.kernel.org/>,國內各大ftp上一般都可
以找到某些版本的內核。新版本的內核的發佈有兩種形式,一種是完整的內核版本,另
外一種是patch文件,即修正檔。完整的內核版本比較大,比如linux-2.4.0-test8.tar.b
z2就有18M之多。完整內核版本一般是.tar.gz(.tgz)文件或者是.bz2文件,二者分別
是使用gzip或者bzip2進行壓縮的文件,使用時需要解壓縮。patch文件則比較小,一般
只有幾十K到幾百K,極少的會超過1M。但是patch文件是針對於特定的版本的,需要找到
自己對應的版本才能使用。
編譯內核需要root權限。把需要昇級的內 拷貝到/usr/src/下(下文中以2.2.16的內核
的linux-2.2.16tar.gz為例),指令為
#cp linux-2.2.16tar.gz /usr/src
先檢視當前/usr/src的內容,注意到有一個linux的符號連接,它指向一個類似於linux
-2.2.14(對應於現在使用的內核版本號)的目錄。首先刪除這個連接:
#cd /usr/src
#rm -f linux
現在解壓下載的源程式文件。如果所下載的是.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
 
現在再來看一下/usr/src下的內容,發現現在有了一個名為linux的目錄,裡面就是需要
昇級到的版本的內核的源程序。還記得那個名為linux的連接麼?之所以使用那個連接就
是防止在昇級內核的時候會不慎把原來版本內核的源程序給覆蓋掉了。現在也需要同樣
處理:
#mv linux linux-2.2.16
#ln -s linux-2.2.16 linux
 
如果還下載了patch文件,比如patch-2.2.16,就可以進行patch操作(下面假設patch-
2.2.16已經位於/usr/src目錄下了,否則需要先把該檔案拷貝到/usr/src下):
#patch -p0 < patch-2.2.16
第二部分 準備主機板和相關硬體的說明手冊
其實也不用太詳細,只要知道您的硬體是屬於哪一類型就行了。例如:有一張SCSI卡,
那就要知道這張卡的名字,有一台cd-rom,就要知道這台光碟是哪一種牌子的,是否為標
准的IDE/ATAPI界面,還是另有專屬接頭卡呢?或者,主機版是否有支持Triton晶片(通
常586以上的電腦常有),這些資訊能說明 我們,使得設定變得清楚且容易。
因此,不管您有什麼使用手冊,準備好吧。即使現在不用,將來還是會用到的(設X-w
indow system時要顯示卡的手冊)。
第三部分 檢查音效卡的IRQ設定和其種類
如果配有一張音效卡,除了要知道卡的種類外(例如 Sound Blaster)還需要知道這張卡
的IRQ位址。一般來說,盧卡的IRQ位址是5或7而IO位址則為220。DMA則l,不過,有時不
同的音效卡可能會有不同的設定。因為稍後的選項裡,就會要填入這些數位。
第四部分 編譯核心的硬體需求
在編譯核心時,確定您的RAM最好在8MB以上, 否則可能會很慢而且問題會很多,記得查
看swap有沒有開啟(用free指令)。此外,最好不要超頻,不然很有可能會發生signal
11的錯誤,使得編到一半的核心停了下來,其實編譯核心就好比編譯程序一樣,只是因
為構成核心的程序太多了,因此我們能小心盡量小心。
第二章 內核編譯的流程
概述編譯的流程:
編譯開始----- make mrproper;檢查所需的連接
配置核心
編譯核心
編輯/etc/lilo.conf
重新啟動新核心
重新啟動機器
發現並修理故障(仔細看我的文章,應該沒多少問題了)
第一節 編譯開始
通常要執行的第一個指令是:
#cd /usr/src/linux
#make mrproper
該指令確保來源碼目錄下沒有不正確的目標.o文件以及文件的互相依賴。如使用剛下載
的完整的源程序包進行編譯,本步可以省略。而如果多次使用了這些源程序編譯內核,
那麼最好要先執行一下這個指令。
確保/usr/include/目錄下的asm、linux和scsi等連接是指向要昇級的內核來源碼的。它
們分別鏈向來源碼目錄下的真正的、該電腦體系結構(對於PC機來說,使用的體系結
構是i386)所需要的真正的include子目錄。如:asm指向/usr/src/linux/include/asm
-i386等。若沒有這些連接,就需要手工新增,按照下面的步驟進行:
# 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連接後,再創
建新的連接指向新內核來源碼目錄下的同名的目錄。這些頭文件目錄包含著保證內核在
系統上正確編譯所需要的重要的頭文件。也是上面又在/usr/src下"多餘"地新增了個名
為linux的連接的原因之一.
一旦萬事俱備,轉到/usr/src/linux。現在你也許想停下細讀一下我的文件文件,實際
上如果你有些特別的硬體,或幾種光碟驅動程需要自己動手設定,他們通常這樣做,當
引導時這些驅動程式將給出警告,這並不礙事他們照常工作少,閱讀副檔名為.txt .h.
c的文件。通常我發現他們具有共性且易於配置。如果你不想冒險,你沒必要做。記住你
照樣可以解開tar文件(或再次安裝.rpm文件)恢復前的文件。
第二節 配置內核 核心內容
接下來的內核配置程序比較煩瑣,但是配置的適當與否與日後Linux的執行直接相關,有
必要瞭解一下選項的設定。
 
配置內核可以根據需要與愛好使用下面指令中的一個:
#make config(關於文本的最為傳統的配置界面,不推薦使用)
#make menuconfig(關於文本選單的配置界面,字串終端下推薦使用,必須安裝ncurse
s-dev和tk4-dev庫)
#make xconfig(關於圖形視窗模式的配置界面,Xwindow下推薦使用)
#make oldconfig(如果只想在原來內核配置的基礎上修改一些小地方,會省去不少麻煩

  
如果不能使用Xwindow,那麼就使用make menuconfig好了。界面雖然比上面一個差
點,總比make config的要好多了。
選項相應的配置時,有三種選項,它們分別代表的含義如下:
  Y--將該功能編譯進內核
  N--不將該功能編譯進內核
  M--將該功能編譯成可以在需要時動態插入到內核中的模組
在每一個選項前都有個括號, 但有的是中括號有的是尖括號,還有一種圓括號。 用空格
鍵選項時可以發現,中括號裡要麼是空,要麼是"*",而尖括號裡可以是空,"*"和"M"。
這表示前者對應的項要麼不要,要麼編譯到內核裡;後者則多一樣選項,可以編譯成模
塊。而圓括號的內容是要在所提供的幾個選項中選項一項。
在編譯內核的程序中,最煩雜的事情就是這步配置工作了,不清楚到底該如何選取這些
選項。實際上在配置時,大部分選項可以使用其預設值,只有小部分需要根據用戶不同
的需要選項。選項的原則是將與內核其它部分關係較遠且不經常使用的部分功能程式碼編
譯成為可載入模組,有利於減小內核的長度,減小內核消耗的記憶體,簡化該功能相應的
環境改變時對內核的影響;不需要的功能就不要選;與內核關心緊密而且經常使用的部
分功能程式碼直接編譯到內核中。下面對選項分別加以介紹。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
回覆時引用此帖
向 psac 送花的會員:
ice_man0413 (2009-03-19)
感謝您發表一篇好文章