陳莉君 梁 琛 王小銀
摘要:開(kāi)放源代碼Linux為操作系統(tǒng)教學(xué)內(nèi)容研究與改革帶來(lái)良好的契機(jī),本文在對(duì)Linux內(nèi)核入門(mén)途徑分析的基礎(chǔ)上,給出了分析Linux內(nèi)核的原理基礎(chǔ)和硬件基礎(chǔ),并探究了操作系統(tǒng)的執(zhí)行機(jī)制,最后給出了實(shí)踐途徑和方法。
關(guān)鍵詞:Linux內(nèi)核;源代碼;教學(xué)改革
中圖分類(lèi)號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:B
1引言
芬蘭大學(xué)生Linus在赫爾辛基大學(xué)學(xué)習(xí)“操作系統(tǒng)”課程時(shí),不滿(mǎn)足于使用教學(xué)用操作系統(tǒng)Minix,從著手開(kāi)發(fā)一個(gè)簡(jiǎn)單的程序開(kāi)始,到逐步開(kāi)發(fā)顯示器、鍵盤(pán)和調(diào)制解調(diào)器的驅(qū)動(dòng)程序,然后寫(xiě)了磁盤(pán)驅(qū)動(dòng)程序,文件系統(tǒng),這樣,一個(gè)操作系統(tǒng)的原型就形成了。
這個(gè)誕生于學(xué)生之手的Linux,在Internet這片肥沃的土壤中不斷成長(zhǎng),逐步發(fā)展為與Unix、Windows并駕齊驅(qū)的實(shí)用操作系統(tǒng)。與Windows不同,Linux 與Unix外表相似,但它的窗口向所有人完全敞開(kāi),任何想了解其內(nèi)在機(jī)理的愛(ài)好者都可以走進(jìn)其內(nèi)部世界。
在1999年的春季,我們有幸走進(jìn)了這個(gè)開(kāi)放的世界,那時(shí)分析的是Linux內(nèi)核2.0版,在閱讀源代碼的基礎(chǔ)上,我們編寫(xiě)了《Linux操作系統(tǒng)內(nèi)核分析》一書(shū),該書(shū)曾被指定為中科院考博參考書(shū)。隨著Linux內(nèi)核版本的不斷更新,我們又陸續(xù)編寫(xiě)和翻譯了針對(duì)Linux內(nèi)核2.2、2.4及2.6的相關(guān)書(shū)籍。
Linux內(nèi)核是由C語(yǔ)言和匯編語(yǔ)言編寫(xiě)的,其全部源代碼是一個(gè)龐大的世界,如何在這龐大而又復(fù)雜的世界中抓住主要內(nèi)容,如何找到進(jìn)入Linux內(nèi)部的突破口,又如何能把Linux的源代碼變?yōu)樽约旱乃?并在此基礎(chǔ)上進(jìn)行內(nèi)核級(jí)程序的開(kāi)發(fā),很多學(xué)過(guò)操作系統(tǒng)原理而又想進(jìn)一步實(shí)踐的軟件開(kāi)發(fā)者,對(duì)以上問(wèn)題都有過(guò)種種困惑。針對(duì)這些問(wèn)題,在教學(xué)的過(guò)程中,從教學(xué)內(nèi)容,教學(xué)方法以及實(shí)踐環(huán)節(jié)等方面,我們進(jìn)行了探索和改革。
2Linux內(nèi)核入門(mén)
Linux內(nèi)核入門(mén)是不容易的,它之所以難學(xué),在于龐大的規(guī)模和涉及的層面。規(guī)模一大就不易現(xiàn)出本來(lái)面目,渾然一體,自然不容易找到著手之處;層面一多,就會(huì)讓人眼花繚亂,盤(pán)根錯(cuò)節(jié)。
Linux源碼研究的方法不同于小規(guī)模軟件。這是由于規(guī)模和層面決定的,比如說(shuō),在語(yǔ)言學(xué)習(xí)中,可以采取小步快跑的方法,通過(guò)一個(gè)個(gè)小程序和小嘗試,就可以取得漸進(jìn)的成果,就能從新技術(shù)中有所收獲。針對(duì)Linux,如果沒(méi)有對(duì)整體的把握,即使你對(duì)某個(gè)局部的算法、技術(shù)或是代碼再熟悉,也無(wú)法將其融入實(shí)用。因此,Linux內(nèi)核入門(mén)從以下幾方面著手。
2.1Linux內(nèi)核整體結(jié)構(gòu)
Linux內(nèi)核雖然實(shí)現(xiàn)和Unix系統(tǒng)有很大不同,但是其結(jié)構(gòu)還基本保持和Unix一致,其中功能與操作系統(tǒng)原理中所涉及到的內(nèi)容大體一致。
Linux 內(nèi)核除系統(tǒng)調(diào)用外,由5個(gè)主要的子系統(tǒng)組成,如圖1所示。
從圖1可以看出,處于中心位置的是進(jìn)程調(diào)度,所有其它的子系統(tǒng)都依賴(lài)于它,因?yàn)槊總€(gè)子系統(tǒng)都需要掛起或恢復(fù)進(jìn)程。一般情況下,當(dāng)一個(gè)進(jìn)程等待硬件操作完成時(shí),它被掛起,當(dāng)操作真正完成時(shí),進(jìn)程恢復(fù)執(zhí)行。例如,當(dāng)一個(gè)進(jìn)程通過(guò)網(wǎng)絡(luò)發(fā)送一條消息時(shí),發(fā)送進(jìn)程被掛起,一直到硬件成功地完成消息的發(fā)送。其它子系統(tǒng)(內(nèi)存管理,虛擬文件系統(tǒng)及進(jìn)程間通信)以相似的理由依賴(lài)于進(jìn)程調(diào)度。
2.2硬件基礎(chǔ)
操作系統(tǒng)是一組軟件的集合。但它和一般軟件不同,因?yàn)樗浅浞滞诰蛴布撃艿能浖?也可以說(shuō),操作系統(tǒng)是橫跨軟件和硬件的橋梁。因此,要想深入解析操作系統(tǒng)內(nèi)在的運(yùn)作機(jī)制,就必須搞清楚相關(guān)的硬件機(jī)制——尤其是內(nèi)存尋址的硬件機(jī)制。
操作系統(tǒng)的設(shè)計(jì)者必須在硬件相關(guān)的代碼與硬件無(wú)關(guān)的代碼之間劃出清楚的界限,以便于一個(gè)操作系統(tǒng)很容易地移植到不同的平臺(tái)。Linux的設(shè)計(jì)就做到了這點(diǎn),它把與硬件相關(guān)的代碼全部放在arch(architecture一詞的縮寫(xiě),即體系結(jié)構(gòu)相關(guān))的目錄下,在這個(gè)目錄下,可以找到Linux目前版本支持的所有平臺(tái),例如,支持的平臺(tái)有arm、alpha,、i386、m68k、mips等十多種。在這眾多的平臺(tái)中,大家最熟悉的就是X86。因此,首先要了解和熟悉X86與內(nèi)存管理相關(guān)的機(jī)制—保護(hù)模式機(jī)制。
2.3原理基礎(chǔ)
操作系統(tǒng)的原理中主要講述了進(jìn)程管理、內(nèi)存管理、文件管理和設(shè)備管理。盡管這些原理基于的背景為Unix,但是,因?yàn)槠湟w更多的操作系統(tǒng),因此,各部分內(nèi)容顯得抽象。而在Linux內(nèi)核源代碼分析中,就是讓這些原理適時(shí)地落到實(shí)處。
進(jìn)程管理是操作系統(tǒng)的靈魂,因此要從內(nèi)核實(shí)現(xiàn)的角度分析進(jìn)程賴(lài)以存活的各種數(shù)據(jù)結(jié)構(gòu)。進(jìn)程作為一個(gè)動(dòng)態(tài)變化的實(shí)體,可以從生命歷程的角度說(shuō)明進(jìn)程從誕生到死亡的艱難過(guò)程,并給出具體的實(shí)現(xiàn)函數(shù)。
內(nèi)存作為計(jì)算機(jī)系統(tǒng)的重要資源,因?yàn)槠淙萘康挠邢藓统绦蛞?guī)模的不斷擴(kuò)大,需要從技術(shù)上對(duì)其容量進(jìn)行擴(kuò)充,Linux中對(duì)虛擬內(nèi)存管理的實(shí)現(xiàn)建立在分段和分頁(yè)的原理之上,具體給出其中的部分源代碼,使學(xué)生體會(huì)從理論過(guò)渡到實(shí)踐之間的真實(shí)跨越。
3探究操作系統(tǒng)的執(zhí)行機(jī)制
如果說(shuō)操作系統(tǒng)是資源的管理者,那么歸根結(jié)底,操作系統(tǒng)是程序賴(lài)以執(zhí)行的堅(jiān)實(shí)基礎(chǔ);因?yàn)樗^的進(jìn)程管理,內(nèi)存管理,文件管理以及設(shè)備管理等,都是因?yàn)閳?zhí)行程序而引發(fā)的。以這樣的大思路為前提,引領(lǐng)學(xué)生探究事物本質(zhì)的興趣。
進(jìn)程概念的引入是為了執(zhí)行程序,這是毋庸置疑的。那么,內(nèi)存管理呢?一個(gè)死氣沉沉存放在磁盤(pán)上的程序是毫無(wú)意義的。程序只有從外存裝入內(nèi)存一行行執(zhí)行,才會(huì)變得生龍活虎,因此,所謂的文件系統(tǒng)以及內(nèi)存管理等等都是為程序的執(zhí)行而服務(wù)的。
3.1并發(fā)執(zhí)行之根本
多個(gè)程序之所以能夠有條不紊地執(zhí)行,是因?yàn)長(zhǎng)inux內(nèi)核的核心仲裁者調(diào)度程序,也就是內(nèi)核代碼中schedule()函數(shù),鼓勵(lì)學(xué)生閱讀這一函數(shù),從根本上認(rèn)識(shí)進(jìn)程調(diào)度的過(guò)程,從而明白內(nèi)核為了進(jìn)程的并發(fā)執(zhí)行而牽引出一系列的相關(guān)東西,真正理解圖1中的進(jìn)程調(diào)度所處的核心位置。
3.2內(nèi)核任務(wù)的并發(fā)執(zhí)行
所謂內(nèi)核任務(wù)是指內(nèi)核態(tài)下可以獨(dú)立執(zhí)行的內(nèi)核例程(一個(gè)或多個(gè)內(nèi)核函數(shù)),每個(gè)內(nèi)核任務(wù)運(yùn)行時(shí)都擁有一個(gè)獨(dú)立的程序計(jì)數(shù)器、棧和一組寄存器。一般來(lái)說(shuō),內(nèi)核任務(wù)包括內(nèi)核線(xiàn)程、系統(tǒng)調(diào)用、中斷服務(wù)程序、異常處理程序、下半部等幾類(lèi)。
如果我們把內(nèi)核看作不斷對(duì)各種請(qǐng)求進(jìn)行響應(yīng)的服務(wù)器,那么,正在CPU上執(zhí)行的進(jìn)程、發(fā)出中斷請(qǐng)求的外部設(shè)備等就相當(dāng)于客戶(hù)。正如服務(wù)器要隨時(shí)響應(yīng)客戶(hù)的請(qǐng)求一樣,內(nèi)核也會(huì)隨時(shí)響應(yīng)進(jìn)程、中斷等的請(qǐng)求。所以說(shuō)內(nèi)核中各個(gè)任務(wù)并不是嚴(yán)格按著順序依次執(zhí)行的,而是相互交錯(cuò)執(zhí)行的。搞清楚各種內(nèi)核任務(wù)的執(zhí)行機(jī)制,猶如把學(xué)
生從森林中引領(lǐng)出來(lái),使學(xué)生體會(huì)操作系統(tǒng)執(zhí)行機(jī)制的奧妙。
4動(dòng)手實(shí)踐
內(nèi)核初學(xué)者對(duì)內(nèi)核各個(gè)核心子系統(tǒng)有個(gè)整體把握,包括它們提供什么樣的服務(wù),為什么要提供這樣的服務(wù),又是怎樣實(shí)現(xiàn)的有了初步了解之后,總希望自己寫(xiě)代碼一試身手。我們的“內(nèi)核之旅”www.kerneltravel.net網(wǎng)站,填補(bǔ)課堂教學(xué)和實(shí)踐開(kāi)發(fā)之間的鴻溝。網(wǎng)上發(fā)布多期原創(chuàng)專(zhuān)題性電子刊物。針對(duì)操作系統(tǒng)愛(ài)好者學(xué)習(xí)Linux之后,苦于無(wú)用武之地的現(xiàn)狀,在網(wǎng)站上討論如何進(jìn)行Linux內(nèi)核層面上的系統(tǒng)軟件開(kāi)發(fā)。并配以大量有實(shí)用價(jià)值或指導(dǎo)意義的實(shí)驗(yàn),深入淺出的教授學(xué)生認(rèn)識(shí)Linux內(nèi)核,學(xué)習(xí)Linux內(nèi)核,開(kāi)發(fā)Linux內(nèi)核。每期都配有相關(guān)的實(shí)驗(yàn)和相應(yīng)的源代碼,供大家下載實(shí)踐。實(shí)踐內(nèi)容如下:
(1) 搭建Linux試驗(yàn)系統(tǒng)實(shí)例:學(xué)生通過(guò)親手構(gòu)建系統(tǒng)的過(guò)程,消除對(duì)Linux的恐懼感;
(2) 構(gòu)建一個(gè)簡(jiǎn)易操作系統(tǒng)(一個(gè)可啟動(dòng)的操作系統(tǒng));
(3) 編寫(xiě)Shell解釋程序;
(4) 編寫(xiě)自己的系統(tǒng)調(diào)用;
(5) 編寫(xiě)一個(gè)內(nèi)存映射;
(6) 編寫(xiě)一個(gè)內(nèi)核共享鏈表同步訪(fǎng)問(wèn)的程序;
(7) 實(shí)現(xiàn)一個(gè)文件系統(tǒng);
(8) 編寫(xiě)自己的中斷系統(tǒng)。
5結(jié)束語(yǔ)
“Linux內(nèi)核分析”是一門(mén)引領(lǐng)初學(xué)者進(jìn)入Linux內(nèi)核的課程,在這樣一條引領(lǐng)的路途上,會(huì)遇到各種困難和絆腳石。如果說(shuō),龐大的Linux內(nèi)核源代碼是一片望不到邊的森林,那么,我們教師恰恰就是要給學(xué)生以引領(lǐng),使大家不被茂密森林中的雜草或荊棘所絆倒,為此,我們編寫(xiě)了《Linux操作系統(tǒng)原理與應(yīng)用》一書(shū),并建設(shè)了配套的Linux內(nèi)核之旅網(wǎng)站的。另外,針對(duì)當(dāng)前2.6內(nèi)核,我們陸續(xù)在網(wǎng)站發(fā)布相應(yīng)的實(shí)驗(yàn)代碼,同時(shí)鼓勵(lì)讀者把網(wǎng)站電子雜志部分的實(shí)驗(yàn)代碼移植到2.6,以讓更多的人分享。在Linux內(nèi)核之旅的討論區(qū)http://www.lupaworld.com/bbs/ forum-255-1.html,設(shè)有專(zhuān)門(mén)解答Linux內(nèi)核問(wèn)題的論壇。同時(shí),在作者的技術(shù)博客http://linuxkernel.lupaworld.com上,不定期發(fā)布與內(nèi)核相關(guān)專(zhuān)題的知識(shí)。Linux教學(xué)與學(xué)習(xí)之路漫漫兮,在課堂之外,我們西郵Linux興趣小組www.xiyouLinux.cn在積極主動(dòng)的學(xué)習(xí)Linux相關(guān)知識(shí)。
Linux最本質(zhì)的思想體現(xiàn)其“自由”和“開(kāi)放”的思想。自由,意味著世界范圍內(nèi)的知識(shí)共享;而開(kāi)放,則意味著Linux對(duì)所有的人都敞開(kāi)大門(mén)。走入Linux內(nèi)核,源于我們的興趣,對(duì)Linux源代碼的深入分析和研究,源于開(kāi)源社區(qū)良好的氛圍。這種氛圍深深影響了我們,于是,我們對(duì)Linux內(nèi)核源代碼的分析結(jié)果也無(wú)償?shù)墓蚕碛陂_(kāi)源社區(qū),希望更多的Linux愛(ài)好者分享到我們的成果。
參考文獻(xiàn):
[1] 陳莉君, 康華. Linux操作系統(tǒng)原理與應(yīng)用[M]. 北京:清華大學(xué)出版社,2006.
[2] ANIEL P. BOVET, MARCO CESATI . 深入理解Linux內(nèi)核[M].3版. 陳莉君,張瓊聲,張宏偉,譯. 北京:中國(guó)電力出版社,2007.
[3] Claudia Salzberg Rodriguez, Gordon Fischer, Steven Smolski. Linux內(nèi)核編程[M]. 陳莉君,賀炎,劉霞林,譯. 北京:機(jī)械工業(yè)出版社,2006.
[4] Robert Love. Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)[M]. 陳莉君,康華,張波,譯. 北京:機(jī)械工業(yè)出版社,2006.