陳莉君 梁 琛 王小銀
摘要:開放源代碼Linux為操作系統教學內容研究與改革帶來良好的契機,本文在對Linux內核入門途徑分析的基礎上,給出了分析Linux內核的原理基礎和硬件基礎,并探究了操作系統的執行機制,最后給出了實踐途徑和方法。
關鍵詞:Linux內核;源代碼;教學改革
中圖分類號:G642 文獻標識碼:B
1引言
芬蘭大學生Linus在赫爾辛基大學學習“操作系統”課程時,不滿足于使用教學用操作系統Minix,從著手開發一個簡單的程序開始,到逐步開發顯示器、鍵盤和調制解調器的驅動程序,然后寫了磁盤驅動程序,文件系統,這樣,一個操作系統的原型就形成了。
這個誕生于學生之手的Linux,在Internet這片肥沃的土壤中不斷成長,逐步發展為與Unix、Windows并駕齊驅的實用操作系統。與Windows不同,Linux 與Unix外表相似,但它的窗口向所有人完全敞開,任何想了解其內在機理的愛好者都可以走進其內部世界。
在1999年的春季,我們有幸走進了這個開放的世界,那時分析的是Linux內核2.0版,在閱讀源代碼的基礎上,我們編寫了《Linux操作系統內核分析》一書,該書曾被指定為中科院考博參考書。隨著Linux內核版本的不斷更新,我們又陸續編寫和翻譯了針對Linux內核2.2、2.4及2.6的相關書籍。
Linux內核是由C語言和匯編語言編寫的,其全部源代碼是一個龐大的世界,如何在這龐大而又復雜的世界中抓住主要內容,如何找到進入Linux內部的突破口,又如何能把Linux的源代碼變為自己的所需,并在此基礎上進行內核級程序的開發,很多學過操作系統原理而又想進一步實踐的軟件開發者,對以上問題都有過種種困惑。針對這些問題,在教學的過程中,從教學內容,教學方法以及實踐環節等方面,我們進行了探索和改革。
2Linux內核入門
Linux內核入門是不容易的,它之所以難學,在于龐大的規模和涉及的層面。規模一大就不易現出本來面目,渾然一體,自然不容易找到著手之處;層面一多,就會讓人眼花繚亂,盤根錯節。
Linux源碼研究的方法不同于小規模軟件。這是由于規模和層面決定的,比如說,在語言學習中,可以采取小步快跑的方法,通過一個個小程序和小嘗試,就可以取得漸進的成果,就能從新技術中有所收獲。針對Linux,如果沒有對整體的把握,即使你對某個局部的算法、技術或是代碼再熟悉,也無法將其融入實用。因此,Linux內核入門從以下幾方面著手。
2.1Linux內核整體結構
Linux內核雖然實現和Unix系統有很大不同,但是其結構還基本保持和Unix一致,其中功能與操作系統原理中所涉及到的內容大體一致。
Linux 內核除系統調用外,由5個主要的子系統組成,如圖1所示。

從圖1可以看出,處于中心位置的是進程調度,所有其它的子系統都依賴于它,因為每個子系統都需要掛起或恢復進程。一般情況下,當一個進程等待硬件操作完成時,它被掛起,當操作真正完成時,進程恢復執行。例如,當一個進程通過網絡發送一條消息時,發送進程被掛起,一直到硬件成功地完成消息的發送。其它子系統(內存管理,虛擬文件系統及進程間通信)以相似的理由依賴于進程調度。
2.2硬件基礎
操作系統是一組軟件的集合。但它和一般軟件不同,因為它是充分挖掘硬件潛能的軟件,也可以說,操作系統是橫跨軟件和硬件的橋梁。因此,要想深入解析操作系統內在的運作機制,就必須搞清楚相關的硬件機制——尤其是內存尋址的硬件機制。
操作系統的設計者必須在硬件相關的代碼與硬件無關的代碼之間劃出清楚的界限,以便于一個操作系統很容易地移植到不同的平臺。Linux的設計就做到了這點,它把與硬件相關的代碼全部放在arch(architecture一詞的縮寫,即體系結構相關)的目錄下,在這個目錄下,可以找到Linux目前版本支持的所有平臺,例如,支持的平臺有arm、alpha,、i386、m68k、mips等十多種。在這眾多的平臺中,大家最熟悉的就是X86。因此,首先要了解和熟悉X86與內存管理相關的機制—保護模式機制。
2.3原理基礎
操作系統的原理中主要講述了進程管理、內存管理、文件管理和設備管理。盡管這些原理基于的背景為Unix,但是,因為其要涵蓋更多的操作系統,因此,各部分內容顯得抽象。而在Linux內核源代碼分析中,就是讓這些原理適時地落到實處。
進程管理是操作系統的靈魂,因此要從內核實現的角度分析進程賴以存活的各種數據結構。進程作為一個動態變化的實體,可以從生命歷程的角度說明進程從誕生到死亡的艱難過程,并給出具體的實現函數。
內存作為計算機系統的重要資源,因為其容量的有限和程序規模的不斷擴大,需要從技術上對其容量進行擴充,Linux中對虛擬內存管理的實現建立在分段和分頁的原理之上,具體給出其中的部分源代碼,使學生體會從理論過渡到實踐之間的真實跨越。
3探究操作系統的執行機制
如果說操作系統是資源的管理者,那么歸根結底,操作系統是程序賴以執行的堅實基礎;因為所謂的進程管理,內存管理,文件管理以及設備管理等,都是因為執行程序而引發的。以這樣的大思路為前提,引領學生探究事物本質的興趣。
進程概念的引入是為了執行程序,這是毋庸置疑的。那么,內存管理呢?一個死氣沉沉存放在磁盤上的程序是毫無意義的。程序只有從外存裝入內存一行行執行,才會變得生龍活虎,因此,所謂的文件系統以及內存管理等等都是為程序的執行而服務的。
3.1并發執行之根本
多個程序之所以能夠有條不紊地執行,是因為Linux內核的核心仲裁者調度程序,也就是內核代碼中schedule()函數,鼓勵學生閱讀這一函數,從根本上認識進程調度的過程,從而明白內核為了進程的并發執行而牽引出一系列的相關東西,真正理解圖1中的進程調度所處的核心位置。
3.2內核任務的并發執行
所謂內核任務是指內核態下可以獨立執行的內核例程(一個或多個內核函數),每個內核任務運行時都擁有一個獨立的程序計數器、棧和一組寄存器。一般來說,內核任務包括內核線程、系統調用、中斷服務程序、異常處理程序、下半部等幾類。
如果我們把內核看作不斷對各種請求進行響應的服務器,那么,正在CPU上執行的進程、發出中斷請求的外部設備等就相當于客戶。正如服務器要隨時響應客戶的請求一樣,內核也會隨時響應進程、中斷等的請求。所以說內核中各個任務并不是嚴格按著順序依次執行的,而是相互交錯執行的。搞清楚各種內核任務的執行機制,猶如把學
生從森林中引領出來,使學生體會操作系統執行機制的奧妙。
4動手實踐
內核初學者對內核各個核心子系統有個整體把握,包括它們提供什么樣的服務,為什么要提供這樣的服務,又是怎樣實現的有了初步了解之后,總希望自己寫代碼一試身手。我們的“內核之旅”www.kerneltravel.net網站,填補課堂教學和實踐開發之間的鴻溝。網上發布多期原創專題性電子刊物。針對操作系統愛好者學習Linux之后,苦于無用武之地的現狀,在網站上討論如何進行Linux內核層面上的系統軟件開發。并配以大量有實用價值或指導意義的實驗,深入淺出的教授學生認識Linux內核,學習Linux內核,開發Linux內核。每期都配有相關的實驗和相應的源代碼,供大家下載實踐。實踐內容如下:
(1) 搭建Linux試驗系統實例:學生通過親手構建系統的過程,消除對Linux的恐懼感;
(2) 構建一個簡易操作系統(一個可啟動的操作系統);
(3) 編寫Shell解釋程序;
(4) 編寫自己的系統調用;
(5) 編寫一個內存映射;
(6) 編寫一個內核共享鏈表同步訪問的程序;
(7) 實現一個文件系統;
(8) 編寫自己的中斷系統。
5結束語
“Linux內核分析”是一門引領初學者進入Linux內核的課程,在這樣一條引領的路途上,會遇到各種困難和絆腳石。如果說,龐大的Linux內核源代碼是一片望不到邊的森林,那么,我們教師恰恰就是要給學生以引領,使大家不被茂密森林中的雜草或荊棘所絆倒,為此,我們編寫了《Linux操作系統原理與應用》一書,并建設了配套的Linux內核之旅網站的。另外,針對當前2.6內核,我們陸續在網站發布相應的實驗代碼,同時鼓勵讀者把網站電子雜志部分的實驗代碼移植到2.6,以讓更多的人分享。在Linux內核之旅的討論區http://www.lupaworld.com/bbs/ forum-255-1.html,設有專門解答Linux內核問題的論壇。同時,在作者的技術博客http://linuxkernel.lupaworld.com上,不定期發布與內核相關專題的知識。Linux教學與學習之路漫漫兮,在課堂之外,我們西郵Linux興趣小組www.xiyouLinux.cn在積極主動的學習Linux相關知識。
Linux最本質的思想體現其“自由”和“開放”的思想。自由,意味著世界范圍內的知識共享;而開放,則意味著Linux對所有的人都敞開大門。走入Linux內核,源于我們的興趣,對Linux源代碼的深入分析和研究,源于開源社區良好的氛圍。這種氛圍深深影響了我們,于是,我們對Linux內核源代碼的分析結果也無償的共享于開源社區,希望更多的Linux愛好者分享到我們的成果。
參考文獻:
[1] 陳莉君, 康華. Linux操作系統原理與應用[M]. 北京:清華大學出版社,2006.
[2] ANIEL P. BOVET, MARCO CESATI . 深入理解Linux內核[M].3版. 陳莉君,張瓊聲,張宏偉,譯. 北京:中國電力出版社,2007.
[3] Claudia Salzberg Rodriguez, Gordon Fischer, Steven Smolski. Linux內核編程[M]. 陳莉君,賀炎,劉霞林,譯. 北京:機械工業出版社,2006.
[4] Robert Love. Linux內核設計與實現[M]. 陳莉君,康華,張波,譯. 北京:機械工業出版社,2006.