?? 00000010.htm
字號:
<HTML><HEAD> <TITLE>BBS水木清華站∶精華區(qū)</TITLE></HEAD><BODY><CENTER><H1>BBS水木清華站∶精華區(qū)</H1></CENTER>發(fā)信人: axp33a (無聊中...), 信區(qū): Linux <BR>標 題: Linux內核源代碼分析3-5 <BR>發(fā)信站: BBS 水木清華站 (Thu Aug 3 11:27:11 2000) WWW-POST <BR> <BR>3.5 設計和實現的關系
<BR>接下來的部分將介紹一些內核設計和實現之間的關系。本部分最重要的內容是對于內核源 <BR>程序目錄結構的概述,這一點隨后就會提到。本章最后以實現中體系結構無關代碼和體系 <BR>結構相關代碼的相對大小的估算作為總結。
<BR>3.5.1 內核源程序目錄結構
<BR>按照慣例,內核源程序代碼安裝在/usr/src/linux目錄下。在該目錄下還有幾個其他目錄 <BR>,每一個都代表一個特定的內核功能性子集(或者非常粗略地說是高層代碼模塊)。
<BR>1. Documentation
<BR>這個目錄下面沒有內核代碼,只有一套有用的文檔。但是這些文檔的質量不一。有一部分 <BR>內核文檔,例如文件系統,在該目錄下有相當優(yōu)秀而且相當完整的文檔;而另外一部分內 <BR>核,例如進程調度,則根本就沒有文檔。但是在這里你可以不時地發(fā)現自己所最需要的東 <BR>西。
<BR> 2. arch
<BR>arch目錄下的所有子目錄中都是體系結構相關的代碼。每個體系結構特有的子目錄下都又 <BR>至少包含三個子目錄:kernel,存放支持體系結構特有的諸如信號處理和SMP之類特征的 <BR>實現;lib,存放高速的體系結構特有的諸如strlen和memcpy之類的通用函數的實現;mm <BR>,存放體系結構特有的內存管理程序的實現。
<BR>除了這三個子目錄以外,大多數體系結構在必要的情況下還都有一個boot子目錄,該目錄 <BR>中包含有在這種平臺上啟動內核所使用的部分或全部平臺特有代碼。這些啟動代碼中的部 <BR>分或全部也可以在平臺特有的內核目錄下找到。
<BR>最后,大部分體系結構所特有的目錄還可以根據需要包含了供附加特性或改進組織使用的 <BR>其他子目錄。例如,i386目錄包含一個math-emu子目錄,其中包括了在缺少數學協處理器 <BR>(FPU)的CPU上運行模擬FPU的代碼。作為另外一個例子,m68k移植版本中為每一個該移 <BR>植版本所支持的基于680x0的機器建立了一個子目錄,從而這些機器所特有的代碼都有一 <BR>個自然的根目錄。
<BR>下面幾個是arch目錄下的子目錄:
<BR>* arch/alpha/—Linux內核到基于DEC Alpha CPU工作站的移植。
<BR>* arch/arm/—Linux到ARM系列CPU 的移植,該類CPU主要用于諸如Corel的NetWinder和 <BR>Acorn RiscPC之類的機器。
<BR>* arch/i386/—最接近于Linux內核原始平臺或標準平臺。這是為Intel的80386結構使用 <BR>的,當然包括對同一系列后來的CPU(80486,Pentium等等)的支持。它還包括了對AMD、 <BR>Cyrix和IDT等公司的一些兼容產品的支持。
<BR>本書基本上將這種體系結構稱為“x86”。即使這樣,嚴格說來“x86”對于我們的目標來 <BR>說還是要求得過于寬泛。早期的Intel CPU,例如80286,并沒有包括Linux運行所需的所 <BR>有特性。對于這些機器,Linux也沒有正式的支持版本(順便提一下,Linux對這種CPU的 <BR>獨立移植版本是存在的,不過它在功能上有部分損失)。當本書中提到“x86平臺”時, <BR>通常是指80386或更新的CPU。
<BR>* arch/m68k/—到Motorola的680x0 CPU系列的移植。該版本可以提供對基于從68020(只 <BR>要它同內存管理單元(MMU)68851一起使用)到68060的一切機器的支持。很多公司在他 <BR>們的產品中使用680x0系列芯片,例如Commodore(現在是Gateway)的Amiga、Apple的 <BR>Macintosh、Atari ST等等。這些老機器中的很多現在正充當可靠的Linux工作站。另外, <BR>到NeXT工作站和SUN 3工作站的移植也正在進行中。
<BR>* arch/mips/—到MIPS的CPU系列的移植。雖然有其他幾個廠商也使用MIPS開發(fā)了一些系 <BR>統,但是基于這種CPU的最出名的機器是Silicon Graphics(SGI)工作站。
<BR>* arch/ppc/—到Motorola/IBM的PowerPC系列CPU的移植。這包括對基于PowerPC的 <BR>Macintosh和Amiga以及BeBox、IBM的RS/6000等其他一些機器的支持。
<BR>* arch/sparc/—到32位SPARC CPU的移植。這包括對從Sun SPARC 1到SPARC 20的全部支 <BR>持。
<BR>* arch/sparc64/—到基于64位SPARC CPU(UltraSPARC系列)系統的移植。這里所能夠支 <BR>持的機器包括Sun的Ultra 1、Ultra 2和更高配置的機器,直到Sun的最新產品 <BR>Enterprise 10000。注意32位和64位的SPARC的移植版本正在合并中。
<BR>不幸的是,本書必須將注意力集中在x86上,因此只應用到了arch/i386/目錄下的代碼, <BR>而其他體系結構所特有的代碼將不再涉及了。
<BR>3. drivers
<BR>這個目錄是內核中非常大的一塊。實際上,drivers目錄下包含的代碼占整個內核發(fā)行版 <BR>本代碼的一半以上。它包括顯卡、網卡、SCSI適配器、軟盤驅動器、PCI設備和其他任何 <BR>你可以說出的Linux支持的外圍設備的軟件驅動程序。
<BR>drivers目錄下的一些子目錄是平臺特有的,例如,zorro子目錄中包含有和Zorro總線通 <BR>訊的代碼。而Zorro總線只在Amiga中使用過,因此這些代碼必然是Amiga特有的。而其他 <BR>一些子目錄,例如pci子目錄,則至少是部分平臺無關的。
<BR>4. fs
<BR>Linux支持的所有文件系統在fs目錄下面都有一個對應的子目錄。一個文件系統是存儲設 <BR>備和需要訪問存儲設備的進程之間的媒介。
<BR>文件系統可能是本地的物理上可訪問的存儲設備,例如硬盤或CD-ROM驅動器;在這兩種情 <BR>況下將分別使用ext2和isofs文件系統。文件系統也可能是可以通過網絡訪問的存儲設備 <BR>;這種情況下使用的文件系統是NFS。
<BR>還有一些偽文件系統,例如proc文件系統,可以以偽文件的形式提供其他信息(例如,在 <BR>proc的情況下是提供內核的內部變量和數據結構)。雖然在底層并沒有實際的存儲設備與 <BR>這些文件系統相對應,但是進程可以像有實際存儲設備一樣處理(NFS也可以作為偽文件 <BR>系統來使用)。
<BR>5. include
<BR>這個目錄包含了Linux源程序樹中大部分的包含(.h)文件。這些文件按照下面的子目錄 <BR>進行分組:
<BR>* include/asm-*/—這樣的子目錄有多個,每一個都對應著一個arch的子目錄,例如 <BR>include/asm-alpha、include/asm-arm、include/asm-i386等等。每個目錄下的文件中包 <BR>含了支持給定體系結構所必須的預處理器宏和短小的內聯函數。這些內聯函數很多都是全 <BR>部或部分地使用匯編語言實現的,而且在C或者匯編代碼中都會應用到這些文件。
<BR>當編譯內核時,系統將建立一個從include/asm到目標體系結構特有的目錄的符號鏈接。 <BR>結果是體系結構無關內核源程序代碼可以使用如下形式的代碼來實現所需功能:
<BR> #include <asm/some-file>
<BR>這樣就能夠將適當地體系結構特有的文件包含(#include)進來。
<BR>* include/linux/—內核和用戶應用程序請求特定內核服務時所使用的常量和數據結構在 <BR>頭文件中定義,而該目錄中就包含了這些頭文件。這些文件大都是平臺獨立的。這個目錄 <BR>被全部復制(更多的情況是鏈接)到/usr/include/linux下。這樣用戶應用程序就可以使 <BR>用#include包含這些頭文件,而且能夠保證所包含進來的頭文件的內容和內核中的定義一 <BR>致。第9章將會給出有關的一個樣例。
<BR>* 對這些文件的移植只有對于內核來說才是必須的,對用戶應用程序則沒有必要。移植工 <BR>作可以按照如下的方式封裝處理:
<BR>* include/net/—這個目錄供與網絡子系統有關的頭文件使用。
<BR>* include/scsi/—這個目錄供與SCSI控制器和SCSI設備有關的頭文件使用。
<BR>* include/video/—這個目錄供與顯卡和幀顯示緩存有關的頭文件使用。
<BR>6. init
<BR>這個目錄下面的兩個文件中比較重要的一個是main.c,它包含了大部分協調內核初始化的 <BR>代碼。第4章將詳細介紹這部分代碼。
<BR>7. ipc
<BR>這個目錄下的文件實現了System V的進程間通訊(IPC)。在第9章中將會對它們進行詳細 <BR>介紹。
<BR>8. kernel
<BR>這個目錄中包含了Linux中最重要的部分:實現平臺獨立的基本功能。這部分內容包括進 <BR>程調度(kernel/sched.c)及創(chuàng)建和撤銷進程的代碼(kernel/fork.c和kernel/exit.c) <BR>;以上所有內容將在第7章中有所涉及。但是我并不想給你留下這樣的印象:需要了解的 <BR>內容都在這個目錄下。實際上在其他目錄下也有很多重要的內容。但是,不管怎樣說,最 <BR>重要部分的代碼是在這個目錄下的。
<BR>9. lib
<BR>lib目錄包含兩部分的內容。lib/inflate.c中的函數能夠在系統啟動時展開經過壓縮的內 <BR>核(請參見第4章)。lib目錄下剩余的其他文件實現一個標準C庫的有用子集。這些實現 <BR>的焦點集中在字符串和內存操作的函數(strlen,memcpy和其他類似的函數)及有關 <BR>sprintf和atoi的系列函數上。
<BR>這些文件都是使用C語言編寫的,因此在新的內核移植版本中可以立即使用這些文件。正 <BR>如本章前面部分說明的那樣,一些移植提供了它們獨有的高速的函數版本,這些函數通常 <BR>是經過手工調整過的匯編程序,在移植后的系統使用這些函數來代替原來的通用函數。
<BR>10. mm
<BR>該目錄包含了體系結構無關的內存管理代碼。正如我們前面說明的那樣,為每個平臺實現 <BR>最底層的原語的體系結構特有的內存管理程序是存儲在arch/platform/mm中的。大部分平 <BR>臺獨立和x86特有的內存管理代碼將在第8章中介紹。
<BR>11. net
<BR>這個目錄包含了Linux應用的網絡協議代碼,例如AppleTalk、TCP/IP、IPX等等。
<BR>12. scripts
<BR>該目錄下沒有內核代碼,它包含了用來配置內核的腳本。當運行make menuconfig或者 <BR>make xconfig之類的命令配置內核時,用戶就是和位于這個目錄下的腳本進行交互的。
<BR>3.5.2 體系結構相關和體系結構無關的代碼
<BR>現在我們來估計一下體系結構相關和體系結構無關代碼的相對大小。我們首先給出一些數 <BR>字。完整的2.2.5的內核總共有1 725 645行代碼(順便一提,請注意本書只包含了39 000 <BR>行代碼,但是我們仍然努力涵蓋了相當部分的核心函數)。其中一共有392 844行代碼在 <BR>體系結構特有的目錄之內,也就是arch/*和include/asm-*下面。我估計還有超過64 000 <BR>行的代碼是僅供一種體系結構專用的驅動程序。這意味著大約26%的代碼是專用于體系結 <BR>構相關代碼的。
<BR>但是,對于單一一種體系結構,體系結構相關代碼比例相對較小。不妨理想一點,如果某 <BR>種單一體系結構所需要的特有代碼約有50 000行,而體系結構無關代碼則大約有1 250 <BR>000行,那么體系結構相關代碼大概只占到4%。當然,在特定的一個內核中,并不是所有 <BR>這些體系結構無關代碼都會被用到,因此體系結構相關代碼在特定內核中所占的比重與內 <BR>核的配置有關。但是不管怎樣,很顯然大部分內核代碼是平臺獨立的。 <BR> <BR>-- <BR>※ 來源:·BBS 水木清華站 smth.org·[FROM: 166.111.196.22] <BR><CENTER><H1>BBS水木清華站∶精華區(qū)</H1></CENTER></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -