Linux 2.4.x 核心簡介
一,
前言
這是筆者第一次規劃這樣的專欄文章,希望可以針對現在Linux 核心所新增的功能以及有趣的議題位各位做一些介紹。因此,我希望第一次的文章可以把現在Linux 2.4.x核心大略的內容做一個介紹,以便於在之後的文章中,可以分別在針對特定主題進行一些介紹。
其實,撰寫這類的文章,對我個人來說也是一種學習,因為有一些細節的部分平常並不會刻意的去注意,透過這樣的管道來分享我的經驗,可以讓自己把一些事實與觀念釐清。當然,如果各位對於我的文章有何意見的話,我非常歡迎各位的來信指教。
這篇文章的重心是定位在介紹Linux Kernel一些基本的架構與新功能,像是目前2.4.x系列的Linux核心所加入的新功能以及目前針對這個新版本的核心,所可以支援的處理器平台。
在之後的文章中,我會把重心放在比較單一的主題上,像是ReiserFS、Kernel Http Server、Linux上的硬體支援與Linux在多媒體上的應用,筆者都將會把重點放在這些有趣的主題上,希望可以讓各位有所收穫。
二,
Linux核心與使用者環境
首先,我想先把Linux 核心與使用者環境的關係做一個大略的說明。如下圖﹝一﹞,我們可以看到一個基本的Linux環境主要是包含一個Linux 核心與一個使用者程式執行環境。在一開機時,Linux核心會先被載入到記憶體中,進行核心程式碼的初始化與偵測驅動基本的硬體設備。之後,便會執行使用者環境中的程式,在這個使用者執行的環境中,必須要包含基本的動態函式庫以及主要的系統程式,像是 “/sbin/init” 就是第一個會被執行的程式。而其它在init之後會被執行的程式,就要依據使用者環境中所做的設定,像是路徑以及基本的系統設定檔來規劃。
所以,其實一個基本的Linux執行環境是可以很精簡的,通常一個Linux核心大小約400—500Kbytes,而一個使用者環境的壓縮檔則依所置入的程式數目而有所差異,如果置入的程式檔案數目有限的話,使用者環境與Linux核心整體的大小是可以控制在1MB以下的。

圖﹝一﹞
Linux核心載入系統之後,在使用者環境中的程式就可以透過80號中斷來使用Linux核心所提供的系統呼叫。透過這些系統呼叫,使用者程式可以完成所需要執行的工作。
所以囉,有些使用者在安裝Linux環境時會覺得耗費相當多的硬碟空間,其實那是因為現在許多的套件都把很多使用者可能會用到的工具程式或函式庫給包進來了。如果在安裝時,沒有基本了解的話,通常都會裝了過多的套件,常常一安裝就要花掉6-700 MB以上的空間。其實,有一些多餘的套件是可以不必安裝的,如果對於使用環境規劃有興趣的使用者,可以考慮使用Debian Linux﹝http://www.debian.org/﹞,這系列的Linux可以讓Linux的使用者打造屬於自己比較精簡的執行環境。
三,
Linux 2.4.x 所支援的處理器平台
Linux 支援了相當多的處理器架構,因為這項特點也使得許多不同領域的使用者有機會進一步的加入使用Linux的行列中,筆者以Linux 2.4.3的核心為例子,這個版本的Linux主要支援了以下的處理器﹕
i386﹝32 bits,CISC(複雜指令集)﹞è這是目前最多人使用的Linux處理器平台,像是過去的486、Pentium、PII與現在的PIII都屬於此類別。
IA64 ﹝64 位元,CISC﹞ èIA-64 是Intel最新的64位元處理器架構,主要目標是高階的應用市場。IA-64是Intel與HP的合作產物,IA-64融合了x86與RISC架構,x86來自Intel本身的架構,而RISC部份就是HP的PA-RISC架構。
Mips and Mips64﹝32 位元與64位元,RISC﹝精簡指令集﹞﹞è MIPS處理器原是史丹福大學的Hennessy教授所主導的研究計劃,之後他帶領一群學生創立了MIPS處理器設計公司,將MIPS產品導入市場中。MIPS處理器設計公司後來被視算科技(SGI)所併購。
Alpha﹝64 bits,RISC﹞èAlpha處理器原本是迪吉多公司(DEC)所推出的產品,這是全球第一個真正64位元商品化的處理器。Alpha指令集架構主要是由MIPS處理器所衍生而來,經由迪吉多公司之後的研發改良而商品化,不過迪吉多公司之後被Compaq公司所併購。
Sparc and Sparc64 ﹝32 位元與64位元,RISC﹞èSparc系列處理器是由昇陽﹝Sun﹞公司所主導的產品,剛開始時RISC處理器也是32位元,在迪吉多公司的Alpha處理器誕生後,才把RISC處理器延伸到64位元的世界。UltraSPARC 是昇陽公司的64位元處理器。
PA-RISC ﹝64位元,RISC﹞ è PA-RISC是惠普公司﹝HP﹞所推出的RISC處理器,亦是目前全球系統出貨金額最大的64位元處理器。主要由原本參與IBM 801計劃的人員,投入HP後所發展而成的。
PowerPC<ppc>﹝32位元與64位元,RISC﹞ è1991年,IBM推出第二代的POWER架構,並且由IBM、Motorola、Apple共組一個 PowerPC 聯盟,發展新的PowerPC處理器架構。當時,Apple亦採用了PowerPC-601做為新一代麥金塔電腦﹝Macintosh﹞的處理器。
m68k﹝32位元,RISC﹞ è 68K系列是Motorola所擁有的處理器產品, Apple從Macintosh系列開始,就是使用Motorola 68K系統的CPU。提到Motorola的68K系列處理器,筆者想到Palm
Vx所使用的處理器就是由Motorola
68K系列所衍生而來的DRANGON BALL 處理器。
Arm ﹝32位元,RISC﹞ èARM公司原本為英國Acorn電腦集團旗下的部門,主要是研發RISC處理器核心的矽智產元件(IP,Intellectual
Property)。目前,Intel亦有StrongARM系列的處理器產品,StrongArm原本由迪吉多公司﹝DEC﹞所開發,之後迪吉多公司被Compaq所併購,而StrongArm部門則被Intel買下。
Sh ﹝32位元,RISC﹞è由日本日立﹝Hitachi﹞公司所開發的處理器,目前亦用於各式PDA﹝例如﹕HP Jornada 548﹞產品或是遊戲機﹝Sega DC﹞上。
s390 架構è為IBM針對大型企業運算需求所設計的伺服器,具備相當的擴充性,可以參考IBM網頁上的相關資料﹝http://www-1.ibm.com/servers/s390/pes/﹞。
CRIS架構 è CRIS實際上是 ”Code Reduced Instruction Set”的縮寫。目前採用CRIS架構的處理器為ETRAX,適用於目前最新Linux核心程式碼的處理器代號為 “ETRAX 100LX”。其它資料讀者可以自行參考Linux 2.4.3原始碼中的檔案 “Documentation/cris/README”。
以上是筆者整理的資料,內容是參考一些官方網站以及Linux相關資源,主要是針對目前Linux所支援的各種處理器平台所做的一個介紹,從中也讓各位了解這些處理器本身的歷史與演進。在整理資料的過程中,不禁覺得Linux能夠支援這樣多不同的處理器平台實在是很不容易,透過許多Linux自願開發者的加入,才有可能讓Linux有機會應用在這樣廣泛的層面。
四,
核心模組演進
早期的Linux版本﹝約1.3.57以前﹞是沒有支援動態載入驅動程式的機制,當時的Linux核心必須要依執行的硬體環境重新編譯,在核心選項中來決定所執行的硬體平台上具備了哪一些介面卡或是所需的額外硬體設定。在這樣的架構下,如果想要讓Linux能夠在多個不同硬體設備的電腦環境上運作的話,很容易遇到的問題就是必須要重新編譯核心,不過這對於一般使用者來說並不是一件可以輕易解決的問題。所以,如果想要同一個Linux的環境能夠支援更多的硬體相容性的話,最好的方式就是把更多的驅動程式都在設定核心選項時,一併的選入核心的設定中,不過這樣會產生的問題就是,Linux核心在載入記憶體後,就不會再被卸下了。而為了讓同一個版本的Linux核心支援更多硬體設備,所造成的結果就是讓核心存有部分使用者可能永遠都不會用到的程式碼。因為,使用者的電腦設備不完全一樣,為了相容性於同樣的Linux核心,所做的就是把一般會用到的硬體設備都選入核心中,這樣會造成核心存有部分使用者根本就用不到的核心程式碼,而造成了資源的浪費。
也因此,在Linux核心1.3.x之後,加入了Kerneld的機制,透過這樣的機制Linux核心可以動態的載入核心模組,因為具備了動態載入核心模組的機制,所以我們可以讓Linux核心設定的更為精簡,也就是說其實Linux核心只需要包含我們所有環境中都必須使用到的功能即可。其它會因為不同使用者需求,或是針對特定硬體所需的核心模組,都可以透過動態載入的方式來進行,在這樣的機制底下,重新編譯Linux核心的機會小了許多﹝除非使用者要自行升級核心版本 or ......﹞,而且對於撰寫驅動程式的程式設計人員來說,就不需要不斷的重新編譯Linux核心來驗證驅動程式的正常與否,可以透過動態載入模組的方式來測試驅動程式,再透過動態卸載的方式來移除。
在Linux核心2.1.x之後,Kerneld的機制被換成了Kmod的機制,同樣都是提供了動態載入驅動程式的機制,只是兩者在實作上有所不同。Kmod比起Kerneld主要是增加了執行時期的效率以及提供這些機制的流程更為精簡。目前在Linux 2.4.x的核心中,仍舊是採用Kmod的機制,不過在使用2.4.x的使用者都會面對到要更新modutils套件的問題,這是因為新版本的Linux核心對於核心模組載入的機制做了一些修正,像是加入了自動動態載入USB驅動模組的機制以及修正了之前版本中modutils容易引起的錯誤,此外在 “/lib/modules” 目錄中的核心模組的架構也變得更為清楚,因此使用者在採用新版本的Linux核心時,同時也必須要更新modutils套件。
五,新加入核心的功能
在Linux 2.4.x 的核心中,加入了一些新的功能,在此我舉出一些新加入的功能,為各位做一個介紹﹕
ReiserFS è原本在Linux上面最常用的檔案系統為Ext2,不過Ext2檔案系統最大的問題就是一旦系統在不正常關機後,在下一次開機時將會耗費相當多的時間去進行系統資料結構完整性的檢查,主要是在避免資料在不正常關機後所造成的遺失。由於在許多的情況下,這樣的檢查其實會花掉相當多的時間,所以像是ReiserFS這樣日誌式的檔案系統,會把每個資料結構的改變都加以紀錄,確保在實際的資料寫入之前,對應的日誌紀錄已先完成。透過這樣的方式,下次系統不正常關機時,只需要很短的時間就可以恢復原先完整的系統了。
LVM è在新版本的2.4.x核心中,已把LVM﹝Logical Volume Manager﹞模組加入到核心程式碼中。過去如果我們把一個分割區對映到一個目錄後﹝例如﹕/home﹞,如果在日後系統需要把該目錄所屬的分割區增加容量時,能夠進行的方式就是,準備好一個更大的硬碟分割區,把原本在/home中的資料都拷貝到新的分割區中,再把那個新的分割區mount到/home目錄即可,如此的做法其實滿沒有彈性的,而且會花去不少時間。現在我們有了LVM的機制,可以先準備好我們要加入的新分割區,動態的把該分割區加入原本已存在的分割區中,實際上/home目錄所屬的資料會分屬在這兩個不同的分割區中,不過在邏輯上卻可以讓使用者感覺不到其實是分散在兩個不同的分割區中,而且又可以動態的增加該目錄所可以使用的儲存空間,對於系統管理者來說,提供了相當高的彈性。
DevFS èDevFS﹝device filesystem﹞亦被加入新版本的Linux核心,原本在Linux的環境中,我們如果要新增一個Device Node時,需要填入兩個數值,分別為Major device numbers 與 Minor device numbers這兩個數值,來建立在/dev 目錄下的Device Node。不過DevFS的出現,讓日後系統辨認這些Device Node時,可以透過驅動程式作者所定義的Device Name來建立唯一的驅動程式名稱﹝可呼叫devfs_register()註冊Device的名稱﹞,在使用者辨別Device Node的功能時,便可以透過有意義的名稱來判斷,因為通常對裝置取名時,便會選擇一個比較有意義的名稱。
此外,過去的/dev 目錄中,存在了許多我們其實用不到的Device Node,這些Device Node是為了預留日後擴充的空間所加入的,可是這樣其實是很浪費系統資源的,像筆者的RedHat 6.2的 /dev 目錄中就有超過2000個以上的檔案存在,可是其中大部分都是筆者電腦中所沒有的設備。然而這樣大型的/dev目錄,會在我們使用這些Device Node所連結的設備時,浪費一些尋找資料的時間。而在DevFS的架構下,系統只會列出目前存在的設備名稱,並不會列出那些系統實際上沒有載入的設備,如此可以讓Linux運作的環境更為精簡有效率。其它與DevFS有關的資訊,讀者可以參考在Linux 2.4.3 原始碼目錄中的檔案 “Documentation/filesystems/devfs/README”,這裡面有滿不錯的介紹。
kHTTPd è kHTTPd 是內建在Linux核心中的WWW伺服器,與目前我們常用的網頁伺服器的不同點在於,kHTTPd是以核心模組的方式存在於系統中,而不是一個使用者所執行的應用程式。不過kHTTPd只能組理靜態的網頁資料,因此kHTTPd可以與Apache Server配合一起使用,像是需要額外處理的動態網頁就交由Apache Server處理﹝像是用PHP寫的網頁﹞,那些靜態網頁的要求就交給kHTTPd來處理。因為在網頁伺服器中,靜態網頁仍佔了相當大的數目,把這部分固定交由Linux 核心模組來處理,可以讓系統在傳遞靜態網頁時更加的有效率,進而提昇整個系統在網頁伺服功能上的效率。
六,結語
本文主要的目的就是針對現在Linux大略的架構為各位讀者做一個介紹,透過這樣的說明,筆者希望可以為日後系列的文章做起頭。Linux目前被應用在很多不同的領域中,像是嵌入式系統以及更具威力的商業運算系統上,我們可以看到在開放原始碼的概念下,Linux不斷的受到來自各地廠商以及好手的支援與投入開發。筆者是Linux的愛好者,在很多的工作機會中我也將它應用來解決我所面對的系統問題,逐步累積實作經驗會讓我們更快速的了解到整個系統架構。
Linux的世界需要更多人去推廣它,以它開放原始碼的情況來說,應用在各式各樣的領域中,其實都可以為廠商帶來不少助益,透過Linux來開發商業化的產品,可以讓廠商有更多的機會去針對需求來修改系統架構。筆者聽過一些朋友的說法,其實他們並不反對採用Linux做為他們商業化系統的一部份,可是主要的問題就是,要有足夠對於Linux系統熟悉的人員以及妥善的支援服務。以致於在選擇所要開發的作業系統平台時,面對不同的應用許多廠商可能會針對大型系統選擇採用Sun Solaris,而在嵌入式系統部分採用VxWork。因為這些系統,背後都有穩定廠商提供技術支援與服務。
我覺得滿可惜的,不過我相信在更多的廠商或是好手投入Linux的領域後,將會有更多符合商業化需求的條件誕生,如此我們才會有機會看到Linux更普遍的應用在各式的生活中。
My E-Mail﹕hlchou@mail2000.com.tw
七,參考資料
[1] Linux Kernel Internals,Second Edition
[2] http://linux.s390.org/
[3] http://www.atnf.csiro.au/~rgooch/linux/docs/devfs.html
[4] http://site.pcmagazine.com.tw/personal/JazzDog/2_hard/2_CPU/cpu_64_1-1.htm
[6] http://linux1394.sourceforge.net/