新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > Linux內核技術分析

Linux內核技術分析

作者: 時間:2008-07-14 來源:網絡 收藏
一、簡介
  ,是一個操作系統(tǒng)的核心。它負責管理系統(tǒng)的進程、內存、設備驅動程序、文件和網絡系統(tǒng),決定著系統(tǒng)的性能和穩(wěn)定性。
  linux的一個重要的特點就是其源代碼的公開性,所有的源程序都可以在 /usr/src/linux下找到,大部分應用軟件也都是遵循GPL而設計的,你都可以獲取相應的源程序代碼。全世界任何一個軟件工程師都可以將自己認為優(yōu)秀的代碼加入到其中,由此引發(fā)的一個明顯的好處就是修補漏洞的快速以及對最新軟件技術的利用。而的內核則是這些特點的最直接的代表。
  想象一下,擁有了內核的源程序對你來說意味著什么?首先,我們可以了解系統(tǒng)是如何工作的。通過通讀源代碼,我們就可以了解系統(tǒng)的工作原理,這在Windows下簡直是天方夜譚。其次,我們可以針對自己的情況,量體裁衣,定制適合自己的系統(tǒng),這樣就需要重新編譯內核。在Windows下是什么情況呢?相信很多人都被越來越龐大的Windows整得莫名其妙過。再次,我們可以對內核進行修改,以符合自己的需要。這意味著什么?沒錯,相當于自己開發(fā)了一個操作系統(tǒng),但是大部分的工作已經做好了,你所要做的就是要增加并實現自己需要的功能。在Windows下,除非你是微軟的核心技術人員,否則就不用癡心妄想了。

二、內核版本號
  由于linux的源程序是完全公開的,任何人只要遵循GPL,就可以對內核加以修改并發(fā)布給他人使用。的開發(fā)采用的是集市模型(bazaar,與cathedral--教堂模型--對應),為了確保這些無序的開發(fā)過程能夠有序地進行,Linux采用了雙樹系統(tǒng)。一個樹是穩(wěn)定樹(stable tree),另一個樹是非穩(wěn)定樹(unstable tree)或者開發(fā)樹(development tree)。一些新特性、實驗性改進等都將首先在開發(fā)樹中進行。如果在開發(fā)樹中所做的改進也可以應用于穩(wěn)定樹,那么在開發(fā)樹中經過測試以后,在穩(wěn)定樹中將進行相同的改進。一旦開發(fā)樹經過了足夠的發(fā)展,開發(fā)樹就會成為新的穩(wěn)定樹。開發(fā)數就體現在源程序的版本號中;源程序版本號的形式為x.y.z:對于穩(wěn)定樹來說,y是偶數;對于開發(fā)樹來說,y比相應的穩(wěn)定樹大一(因此,是奇數)。到目前為止,穩(wěn)定樹的最高版本是2.4.18;開發(fā)樹的最新版本是2.5.10。下載內核版本請訪問http://www.kernel.org。

三、為什么重新編譯內核
  linux作為一個自由軟件,在廣大愛好者的支持下,內核版本不斷更新。新的內核修訂了舊內核的bug,并增加了許多新的特性。如果用戶想要使用這些新特性,或想根據自己的系統(tǒng)度身定制一個更高效,更穩(wěn)定的內核,就需要重新編譯內核。
  通常,更新的內核會支持更多的硬件,具備更好的進程管理能力,運行速度更快、 更穩(wěn)定,并且一般會修復老版本中發(fā)現的許多漏洞等,經常性地選擇升級更新的系統(tǒng)內核是 linux使用者的必要操作內容。
  為了正確的合理地設置內核編譯配置選項,從而只編譯系統(tǒng)需要的功能的代碼,一般主要有下面四個考慮:
  自己定制編譯的內核運行更快(具有更少的代碼)
  系統(tǒng)將擁有更多的內存(內核部分將不會被交換到虛擬內存中)
  不需要的功能編譯進入內核可能會增加被系統(tǒng)攻擊者利用的漏洞
  將某種功能編譯為模塊方式會比編譯到內核內的方式速度要慢一些

四、內核編譯模式
  要增加對某部分功能的支持,比如網絡之類,可以把相應部分編譯到內核中(build-in),也可以把該部分編譯成模塊(module),動態(tài)調用。如果編譯到內核中,在內核啟動時就可以自動支持相應部分的功能,這樣的優(yōu)點是方便、速度快,機器一啟動,你就可以使用這部分功能了;缺點是會使內核變得龐大起來,不管你是否需要這部分功能,它都會存在,這就是Windows慣用的招數,建議經常使用的部分直接編譯到內核中,比如網卡。如果編譯成模塊,就會生成對應的.o文件,在使用的時候可以動態(tài)加載,優(yōu)點是不會使內核過分龐大,缺點是你得自己來調用這些模塊。

五、新版本內核的獲取和更新
  linux內核版本發(fā)布的官方網站是http://www.kernel.org。新版本的內核分兩種,一種是full Source版本,另外一種是patch文件,即補丁。完整的內核版本比較大,一般是 tar.gz或者是.bz2文件,二者分別是使用gzip或者bzip2進行壓縮的文件,使用時需要解壓縮。patch文件則比較小,一般只有幾十K到幾百K,但是patch文件是針對于特定的版本的,你需要找到自己對應的版本才能使用。
  編譯內核需要root權限,以下操作都假定你是root用戶。請把你需要升級的內核拷貝到/usr/src/下(下文中以2.4.18的內核的linux-2.4.18.tar.gz為例),命令為

#cp linux-2.4.18.tar.gz /usr/src

  讓我們先來查看一下當前/usr/src的內容,注意到有一個linux-2.4的符號鏈接,指向一個linux-2.4.7-10(以REDHAT7.2為例)的目錄。這就是你所裝linux的kernel源代碼,刪除這個鏈接。

  現在解壓我們下載的源程序文件。如果所下載的是.tar.gz(.tgz)文件,請使用下面的命令:

#tar -zxvf linux-2.4.18.tar.gz.tar.gz

  如果你所下載的是.bz2文件,例如linux-2.4.0test8.tar.bz2,請使用下面的命令

#bzip2 -d linux-2.4.18.tar.bz2
#tar -xvf linux-2.4.18.tar

  文件將解壓到/usr/src/linux目錄中,我們把它稍作修改:

#mv linux linux-2.4.18
#ln -s linux-2.4.18 linux

  如果下載的是patch文件,就可以進行patch操作(下面假設patch-2.4.18已經位于 /usr/src目錄下了,否則你需要先把該文件拷貝到/usr/src下):

#patch -p0 patch-2.4.18

  
六、內核編譯
  通常要運行的第一個命令是:

#cd /usr/src/linux
#make mrproper

  該命令確保源代碼目錄下沒有不正確的.o文件以及文件的互相依賴。由于我們使用剛下載的完整的源程序包進行編譯,所以本步可以省略。而如果你多次使用了這些源程序編譯內核,那么最好要先運行一下這個命令。
  確保/usr/include/目錄下的asm、linux和scsi等鏈接是指向要升級的內核源代碼的。它們分別鏈向源代碼目錄下的真正的、該計算機體系結構(對于PC機來說,使用的體系結構是i386)所需要的真正的include子目錄。如:asm指向/usr/src/linux/include/asm-i386 等。若沒有這些鏈接,就需要手工創(chuàng)建,按照下面的步驟進行:

# 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)建新的鏈接指向新內核源代碼目錄下的同名的目錄。這些頭文件目錄包含著保證內核在系統(tǒng)上正確編譯所需要的重要的頭文件?,F在你應該明白為什么我們上面又在/usr/src下 "多余"地創(chuàng)建了個名為linux的鏈接了吧?

  接下來的內核配置過程比較煩瑣,但是配置的適當與否與日后linux的運行直接相關,有必要了解一下一些主要的且經常用到的選項的設置。
  
配置內核可以根據需要與愛好使用下面命令中的一個:

#make config(基于文本的最為傳統(tǒng)的配置界面,不推薦使用)
#make menuconfig(基于文本選單的配置界面,字符終端下推薦使用)
#make xconfig(基于圖形窗口模式的配置界面,Xwindow下推薦使用)
#make oldconfig(如果只想在原來內核配置的基礎上修改一些小地方,會省去不少麻煩)

  這三個命令中,make xconfig的界面最為友好,如果你可以使用Xwindow,那么就推薦你使用這個命令,界面如下:

  如果你不能使用Xwindow,那么就使用make menuconfig好了。界面雖然比上面一個差點,總比make config的要好多了,下圖為make menuconfig的界面:


  選擇相應的配置時,有三種選擇,它們分別代表的含義如下:
  Y--將該功能編譯進內核
  N--不將該功能編譯進內核
  M--將該功能編譯成可以在需要時動態(tài)插入到內核中的模塊
  如果使用的是make xconfig,使用鼠標就可以選擇對應的選項。如果使用的是 make menuconfig,則需要使用空格鍵進行選取。你會發(fā)現在每一個選項前都有個括號, 但有的是中括號有的是尖括號,還有一種圓括號。用空格鍵選擇時可以發(fā)現,中括號里要么是空,要么是"*",而尖括號里可以是空,"*"和"M"。這表示前者對應的項要么不要,要么編譯到內核里;后者則多一樣選擇,可以編譯成模塊。而圓括號的內容是要你在所提供的幾個選項中選擇一項。
  在編譯內核的過程中,最煩雜的事情就是這步配置工作了,很多新手都不清楚到底該如何選取這些選項。實際上在配置時,大部分選項可以使用其缺省值,只有小部分需要根據用戶不同的需要選擇。選擇的原則是將與內核其它部分關系較遠且不經常使用的部分功能代碼編譯成為可加載模塊,有利于減小內核的長度,減小內核消耗的內存,簡化該功能相應的環(huán)境改變時對內核的影響;不需要的功能就不要選;與內核關心緊密而且經常使用的部分功能代碼直接編譯到內核中。

至于選項,因為比較復雜,只是簡單做一介紹,編譯時應視具體情況,參考幫助的內容再加以選擇。

1. Code maturity level options
  代碼成熟等級。此處只有一項:prompt for development and/or incomplete code/drivers,如果你要試驗現在仍處于實驗階段的功能,比如khttpd、IPv6等,就必須把該項選擇為Y了;否則可以把它選擇為N。

2. Loadable module support
  對模塊的支持。這里面有三項:

  Enable loadable module support:除非你準備把所有需要的內容都編譯到內核里面,否則該項應該是必選的。
  Set version inFORMation on all module symbols:可以不選它。
  Kernel module loader:讓內核在啟動時有自己裝入必需模塊的能力,建議選上。

3. Processor type and features
  CPU類型。內容蠻多的,不一一介紹了,有關的幾個如下:

  Processor family:根據你自己的情況選擇CPU類型。
  High Memory Support:大容量內存的支持??梢灾С值?G、64G,一般可以不選。
  Math emulation:協(xié)處理器仿真。協(xié)處理器是在386時代的寵兒,現在早已不用了。
  MTTR support:MTTR支持。可不選。
  Symmetric multi-processing support:對稱多處理支持。除非你富到有多個CPU,否則就不用選了。

4. General setup
  這里是對最普通的一些屬性進行設置。這部分內容非常多,一般使用缺省設置就可以了。下面介紹一下經常使用的一些選項:

  Networking support:網絡支持。必須,沒有網卡也建議你選上。
  PCI support:PCI支持。如果使用了PCI的卡,當然必選。
  PCI access mode:PCI存取模式??晒┻x擇的有BIOS、Direct和Any,選Any吧。
  Support for hot-pluggabel devices:熱插拔設備支持。支持的不是太好,可不選。
  PCMCIA/CardBus support:PCMCIA/CardBus支持。有PCMCIA就必選了。
  System V IPC
  BSD Process Accounting
  Sysctl support:以上三項是有關進程處理/IPC調用的,主要就是System V和BSD兩種風格。如果你不是使用BSD,就按照缺省吧。
  Power Management support:電源管理支持。
  Advanced Power Management BIOS support:高級電源管理BIOS支持。

5. Memory Technology Device(MTD)
  MTD設備支持??刹贿x。

6. Parallel port support
  并口支持。如果不打算使用串口,就別選了。

7. Plug and Play configuration
  即插即用支持。雖然linux對即插即用目前支持的不如Windows好,但是還是選上吧,這樣你可以拔下鼠標之類的體驗一下Linux下即插即用的感覺。

8. Block devices
  塊設備支持。這個就得針對自己的情況來選了,簡單說明一下吧:

  Normal PC floppy disk support:普通PC軟盤支持。這個應該必選。
  XT hard disk support:
  Compaq SMART2 support:
  Mulex DAC960/DAC1100 PCI RAID Controller support:RAID鏡像用的。
  Loopback device support:
  Network block device support:網絡塊設備支持。如果想訪問網上鄰居的東西,就選上。
  Logical volume manager(LVM)support:邏輯卷管理支持。
  Multiple devices driver support:多設備驅動支持。
  RAM disk support:RAM盤支持。

9. Networking options
  網絡選項。這里配置的是網絡協(xié)議。內容太多了,不一一介紹了,自己看吧,如果你對網絡協(xié)議有所了解的話,應該可以看懂的。如果懶得看,使用缺省選項(肯定要選中TCP/IP networking哦)就可以了。讓我們看看,TCP/IP、ATM、IPX、DECnet、Appletalk……支持的協(xié)議好多哦,IPv6也支持了,Qos and/or fair queueing(服務質量公平調度)也支持了,還有kHTTPd,不過這些都還在實驗階段。

10. Telephony Support
  電話支持。linux下可以支持電話卡,這樣你就可以在IP上使用普通的電話提供語音服務了。記住,電話卡可和modem沒有任何關系哦。

11. ATA/IDE/MFM/RLL support
  這個是有關各種接口的硬盤/光驅/磁帶/軟盤支持的,內容太多了,使用缺省的選項吧,如果你使用了比較特殊的設備,比如PCMCIA等,就到里面自己找相應的選項吧。

12. SCSI support
  SCSI設備的支持。我沒有SCSI的設備,所以根本就不用選,如果你用了SCSI的硬盤/光驅/磁帶等設備,自己找好了。

13. Fusion MPT device support
  需要Fusion MPT兼容PCI適配器,不用選。

14. I2O device support
  需要I2O接口適配器支持,在智能Input/Output(I2O)體系接口中使用。

15. Network device support
  網絡設備支持。上面選好協(xié)議了,現在該選設備了,可想而知,內容肯定多得很。還好還好,里面大概分類了,有ARCnet設備、Ethernet(10 or 100 Mbit)、Ethernet(1000Mbit)、Wireless LAN(non-hamradio)、Token Ring device、Wan interfaces、PCMCIA network device support幾大類。我用的是10/100M的以太網,看來只需要選則這個了。還是10/100M的以太網設備熟悉,內容雖然多,一眼就可以看到我所用的RealTeck RTL-8139 PCI Fast Ethernet Adapter support,為了免得麻煩,編譯到內核里面好了,不選M了,選Y。耐心點,一般說來你都能找到自己用的網卡。如果沒有,你只好自己到廠商那里去要驅動了。

16. Amateur Radio support
  配置業(yè)余無線廣播。

17. IrDA(infrared)support
  紅外線支持。

18. ISDN subsystem
  如果你使用ISDN上網,這個就必不可少了。

19. Old CD-ROM drivers(not SCSI、not IDE)
  做的可真周到,原來那些非SCSI/IDE口的光驅誰還在用啊,自己選吧,用IDE的CD-ROM不用選。

20. Character devices
  字符設備。這個內容又太多了,先使用缺省設置,需要的話自己就修改。把大類介紹一下吧:

  I2C support:I2C是Philips極力推動的微控制應用中使用的低速串行總線協(xié)議。如果你要選擇下面的Video For linux,該項必選。
  Mice:鼠標。現在可以支持總線、串口、PS/2、CT 82C710 mouse port、PC110 digitizer pad,自己根據需要選擇。
  Joysticks:手柄。即使在linux下把手柄驅動起來意義也不是太大,游戲太少了。
  Watchdog Cards:雖然稱為Cards,這個可以用純軟件來實現,當然也有硬件的。如果你把這個選中,那么就會在你的/dev下創(chuàng)建一個名為watchdog的文件,它可以記錄你的系統(tǒng)的運行情況,一直到系統(tǒng)重新啟動的1分鐘左右。有了這個文件,你就可以恢復系統(tǒng)到重啟前的狀態(tài)了。
  Video For linux:支持有關的音頻/視頻卡。
  Ftape, the floppy tape device driver:
  PCMCIA character device support:

21. File systems
  文件系統(tǒng)。內容又太多了,老法子,在缺省選項的基礎上進行修改。介紹以下幾項:

  Quota support:Quota可以限制每個用戶可以使用的硬盤空間的上限,在多用戶共同使用一臺主機的情況中十分有效。
  DOS FAT fs support:DOS FAT文件格式的支持,可以支持FAT16、FAT32。
  ISO 9660 CD-ROM file system support:光盤使用的就是ISO 9660的文件格式。
  NTFS file system support:ntfs是NT使用的文件格式。
  /proc file system support:/proc文件系統(tǒng)是linux提供給用戶和系統(tǒng)進行交互的通道,建議選上,否則有些功能沒法正確執(zhí)行。

  還有另外三個大類都歸到這兒了:Network File Systems(網絡文件系統(tǒng))、Partition Types(分區(qū)類型)、Native Language Support(本地語言支持)。值得一提的是Network File Systems里面的兩種:NFS和SMB分別是linux和Windows相互以網絡鄰居的形式訪問對方所使用的文件系統(tǒng),根據需要加以選擇。

22. Console drivers
  控制臺驅動。一般使用VGA text console就可以了,標準的80*25的文本控制臺。

23. Sound
  聲卡驅動。如果你能在列表中找到聲卡驅動那自然最好,否則就試試OSS了。

24. USB supprot
  USB支持。很多USB設備,比如鼠標、調制解調器、打印機、掃描儀等,在linux都可以得到支持,根據需要自行選擇。

25. Kernel hacking
  配置了這個,即使在系統(tǒng)崩潰時,你也可以進行一定的工作了。普通用戶是用不著這個功能的。

  配置完后,存盤退出,當然你也可以把現在的配置文件保存起來,這樣下次再配置的時候就省力氣了。

接下來是編譯,輸入以下命令。

#make dep
#make clean
#make bzImage或make zImage
#make modules
#make modules_install
#depmod -a

  第一個命令make dep實際上讀取配置過程生成的配置文件,來創(chuàng)建對應于配置的依賴關系樹,從而決定哪些需要編譯而那些不需要;第二命令make clean完成刪除前面步驟留下的文件,以避免出現一些錯誤;make zImage和make bzImage則實現完全編譯內核,二者生成的內核都是使用gzip壓縮的,只要使用一個就夠了,它們的區(qū)別在于使用make bzImage可以生成大一點的內核。建議大家使用make bzImage命令。
  后面三個命令只有在你進行配置的過程中,在回答Enable loadable module support (CONFIG_MODULES)時選了"Yes"才是必要的,make modules和make modules_install分別生成相應的模塊和把模塊拷貝到需要的目錄中。
  嚴格說來,depmod -a命令和編譯過程并沒有關系,它是生成模塊間的依賴關系,這樣你啟動新內核之后,使用modprobe命令加載模塊時就能正確地定位模塊。

更新

  經過以上的步驟,我們終于得到了新版本的內核。為了能夠使用新版本的內核,我們還需要做一些改動:

#cp /usr/src/linux/System.map /boot/System.map-2.4.18
#cp /usr/src/linux/arch/i386/bzImage /boot/vmlinuz-2.4.18

  以上這兩個文件是我們剛才編譯時新生成的。下面修改/boot下的兩個鏈接System.map和vmlinuz,使其指向新內核的文件:

#cd /boot;rm -f System.map vmlinuz
#ln -s vmlinuz-2.4.18 vmlinuz
#ln -s System.map-2.4.18 System.map

七、修改啟動管理器

  如果用LILO,修改/etc/lilo.conf,添加以下項:

image=/boot/vmlinuz-2.4.18
label=linux240
read-only
root=/dev/hda2

  其中root=/dev/hda2一行要根據需要自行加以修改。
  運行:

#/sbin/lilo -v

  確認對/etc/lilo.conf的編輯無誤,現在重新啟動系統(tǒng):

#shutdown -r now

如果是用Grub啟動管理器,則添加如下幾項即可。

title Red Hat linux (2.4.18)
root (hd0,0)
kernel /vmlinuz-2.4.18 ro root=/dev/hda2

Grub不需再次調用命令,自動生效。

重啟以后就可以用新內核了。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

linux相關文章:linux教程


三維掃描儀相關文章:三維掃描儀原理


關鍵詞: 分析 核技 內核 Linux

評論


相關推薦

技術專區(qū)

關閉