張治國,孫智軍
(1.河南工程學(xué)院 計算機(jī)科學(xué)與工程系,河南 鄭州 451191;2.河南省腫瘤醫(yī)院 信息科,河南 鄭州 450003)
操作系統(tǒng)的實(shí)踐教學(xué)一直都是整個操作系統(tǒng)教學(xué)環(huán)節(jié)中的難點(diǎn),大多數(shù)操作系統(tǒng)原理方面的教材都重理論而輕實(shí)踐.由于大部分的操作系統(tǒng)源代碼是不公開的,學(xué)生在學(xué)習(xí)完操作系統(tǒng)原理之后,對如何構(gòu)建一個操作系統(tǒng)仍然是一知半解.鑒于這種情況,荷蘭阿姆斯特丹自由大學(xué)的Andrew教授領(lǐng)導(dǎo)開發(fā)了一個用于教學(xué)的開放源代碼的類UNIX操作系統(tǒng),這就是MINIX[1]操作系統(tǒng).由于MINIX操作系統(tǒng)的源代碼開放,并且相對于另一個源代碼開放的操作系統(tǒng)LINUX,MINIX操作系統(tǒng)更小,代碼量更少,使得人們更加容易理解操作系統(tǒng)的構(gòu)建,從而能夠?qū)Σ僮飨到y(tǒng)做出更好的改進(jìn).事實(shí)上,LINUX操作系統(tǒng)的作者最初就是以MINIX操作系統(tǒng)為樣本,開發(fā)了最初的LINUX操作系統(tǒng)內(nèi)核.由于種種原因,LINUX操作系統(tǒng)得到了商業(yè)支持,其內(nèi)核也變得越來越大,全面地學(xué)習(xí)LINUX操作系統(tǒng)內(nèi)核幾乎是不可能的.因此,MINIX操作系統(tǒng)仍然是學(xué)習(xí)操作系統(tǒng)實(shí)際構(gòu)建的第一選擇.
所謂宏內(nèi)核指的是操作系統(tǒng)的進(jìn)程管理功能、存儲管理功能、文件系統(tǒng)的實(shí)現(xiàn)和設(shè)備管理功能等均在內(nèi)核空間運(yùn)行[2].這樣的操作系統(tǒng)內(nèi)核包含的可執(zhí)行代碼量大,可以認(rèn)為宏內(nèi)核就是一個非常巨大的包含可執(zhí)行代碼的文件.
操作系統(tǒng)內(nèi)核應(yīng)當(dāng)被設(shè)計得足夠健壯,但是宏內(nèi)核架構(gòu)的操作系統(tǒng)由于兩個方面的主要原因而變得不夠穩(wěn)定和安全,一是操作系統(tǒng)的內(nèi)核太大;二是沒有錯誤隔離機(jī)制.軟件的穩(wěn)定性研究表明,基本上每1 000行的可執(zhí)行代碼中包含6~16個錯誤,所以對于像LINUX或Windows XP這樣內(nèi)核包含幾百萬行代碼的操作系統(tǒng),其中包含的錯誤可想而知的.更糟的是,70%的內(nèi)核可執(zhí)行代碼都是設(shè)備的驅(qū)動程序[3],而設(shè)備驅(qū)動程序更容易出現(xiàn)錯誤.缺乏有效的錯誤隔離機(jī)制同樣也是操作系統(tǒng)容易崩潰的一個原因,因為設(shè)備驅(qū)動程序、進(jìn)程管理程序、內(nèi)存管理程序等都運(yùn)行在內(nèi)核空間,所以當(dāng)其中某一個模塊功能出現(xiàn)錯誤以后,都可能會引起整個內(nèi)核空間的數(shù)據(jù)結(jié)構(gòu)被破壞,從而引起操作系統(tǒng)的崩潰.如果有了有效的錯誤隔離機(jī)制,當(dāng)操作系統(tǒng)的某一功能運(yùn)行不正常時,人們可以通過某種方法重新啟動引起錯誤的功能模塊,從而不會影響操作系統(tǒng)其他功能的正常運(yùn)行,這樣,操作系統(tǒng)內(nèi)核甚至都感知不到有模塊發(fā)生錯誤.
微內(nèi)核的操作系統(tǒng)就是為了要解決上面提到的問題而提出的[2].在微內(nèi)核架構(gòu)的操作系統(tǒng)中,內(nèi)核被盡可能地設(shè)計得足夠小.內(nèi)核代碼只完成一些最基本的功能,如中斷與異常的管理、最基本的存儲管理、對系統(tǒng)中的進(jìn)程通信進(jìn)行管理等.操作系統(tǒng)的其他功能,如進(jìn)程管理、存儲器管理、文件管理、設(shè)備管理等功能都不是微內(nèi)核的功能,這些功能也都不在內(nèi)核空間實(shí)現(xiàn),而全部在用戶空間實(shí)現(xiàn).當(dāng)應(yīng)用程序需要某些系統(tǒng)服務(wù)時,內(nèi)核只提供消息傳遞的機(jī)制,通知運(yùn)行在用戶空間的進(jìn)程管理模塊或其他的管理模塊為用戶提供服務(wù).由于操作系統(tǒng)的大多數(shù)管理功能轉(zhuǎn)移到了用戶空間來實(shí)現(xiàn),所以當(dāng)某一管理功能出現(xiàn)問題時,并不會引起內(nèi)核空間的錯誤,使得操作系統(tǒng)并不會因為某一模塊的異常而崩潰.
微內(nèi)核架構(gòu)的操作系統(tǒng)的優(yōu)點(diǎn)是靈活性好、開放性好和擴(kuò)充性好,系統(tǒng)的健壯性也比宏內(nèi)核的操作系統(tǒng)要好.但是,由于微內(nèi)核的操作系統(tǒng)需要頻繁地進(jìn)行消息的傳遞,同時也需要不斷在內(nèi)核模式和用戶模式之間進(jìn)行切換,這使得微內(nèi)核操作系統(tǒng)的效率比宏內(nèi)核的操作系統(tǒng)效率要低.
現(xiàn)在,MINIX操作系統(tǒng)的發(fā)展已經(jīng)歷經(jīng)3代.不同于MINIX1和MINIX2操作系統(tǒng),MINIX3操作系統(tǒng)內(nèi)核在設(shè)計上與前兩代有了根本的改變.MINIX3操作系統(tǒng)不再采用以前的宏內(nèi)核的設(shè)計架構(gòu),而是采用微內(nèi)核的系統(tǒng)架構(gòu).MINIX3的內(nèi)核只有大約4 000行的可執(zhí)行代碼,這與動輒幾百萬行執(zhí)行代碼的LINUX、WINDOWS、MAC OX操作系統(tǒng)有著明顯的區(qū)別.
圖1 MINIX3操作系統(tǒng)架構(gòu)Fig.1 Architecture of the MINIX3 operating system
MINIX3操作系統(tǒng)定義4層結(jié)構(gòu),每一層都完成特定的功能,如圖1所示.
從圖1可以看出,和其他宏內(nèi)核的操作系統(tǒng)相比,MINIX3最顯著的特點(diǎn)在于,它將操作系統(tǒng)中提供最基本服務(wù)的功能,如進(jìn)程管理、文件系統(tǒng)、設(shè)備管理等放在了用戶空間執(zhí)行,而在內(nèi)核空間只執(zhí)行一些最基本的進(jìn)程調(diào)度、通信以及一些中斷和異常管理程序.
MINIX3操作系統(tǒng)自身是由許多進(jìn)程組成(層1~層3),這些系統(tǒng)進(jìn)程之間通過消息傳送機(jī)制相互通信,用戶進(jìn)程也可以通過消息傳送機(jī)制與操作系統(tǒng)進(jìn)程之間通信,從而請求操作系統(tǒng)的服務(wù),這種設(shè)計提供了更好的模塊機(jī)制和靈活性.例如,人們可以不用重新編譯操作系統(tǒng)內(nèi)核就可以用一個新的文件系統(tǒng)替換老的文件系統(tǒng),這種靈活性在宏內(nèi)核的操作系統(tǒng)中是不容易實(shí)現(xiàn)的.
如圖1所示,內(nèi)核處在系統(tǒng)架構(gòu)的最底層.內(nèi)核的主要功能有:(1)管理進(jìn)程的調(diào)度和進(jìn)程的狀態(tài)轉(zhuǎn)換.要注意的是,進(jìn)程的創(chuàng)建、撤銷、進(jìn)程內(nèi)存空間的分配、進(jìn)程資源的分配等功能并不在內(nèi)核中實(shí)現(xiàn),它們?nèi)坑捎脩艨臻g的進(jìn)程管理(PM)模塊實(shí)現(xiàn).(2)內(nèi)核要處理進(jìn)程之間的通信.例如,在MINIX3中,如果用戶需要創(chuàng)建一個新的進(jìn)程,就需要向進(jìn)程管理模塊發(fā)送一個請求服務(wù)的消息,這時就需要調(diào)用內(nèi)核的消息處理功能,內(nèi)核會檢查消息接收者是否合法,分配發(fā)送緩沖區(qū)和接收緩沖區(qū),然后將數(shù)據(jù)從發(fā)送者復(fù)制給接收者.(3)內(nèi)核代碼用來訪問I/O端口和處理中斷.在現(xiàn)代處理器中,訪問I/O端口和處理中斷需要內(nèi)核模式的指令,這些指令都是不能在用戶模式下執(zhí)行的.
在內(nèi)核空間執(zhí)行的還有兩個模塊,一個是時鐘任務(wù)模塊,另一個是系統(tǒng)任務(wù)模塊.時鐘任務(wù)模塊和產(chǎn)生時鐘信號的硬件交互,它為內(nèi)核的進(jìn)程調(diào)度功能服務(wù),時鐘任務(wù)模塊只與內(nèi)核作用,用戶的應(yīng)用程序是不能訪問時鐘任務(wù)模塊的.系統(tǒng)任務(wù)模塊的作用是為其上層的設(shè)備驅(qū)動層和系統(tǒng)服務(wù)進(jìn)程(圖1中的層2與層3)提供內(nèi)核調(diào)用接口.例如,因為設(shè)備驅(qū)動程序需要訪問I/O端口,但由于它們處于用戶空間,不能直接執(zhí)行訪問I/O端口的指令,所以需要向系統(tǒng)任務(wù)模塊提出請求,系統(tǒng)任務(wù)模塊在接收到請求消息之后,與內(nèi)核交互,最終由內(nèi)核為其執(zhí)行指令.盡管時鐘任務(wù)模塊和系統(tǒng)任務(wù)模塊被編譯進(jìn)了內(nèi)核的地址空間,但它們在運(yùn)行時都是獨(dú)立的進(jìn)程,也都有各自獨(dú)立的調(diào)用棧.時鐘任務(wù)模塊、系統(tǒng)任務(wù)模塊以及大部分的內(nèi)核代碼都是用C語言書寫的,內(nèi)核中只有與中斷處理相關(guān)的代碼、進(jìn)程上下文切換的代碼以及與內(nèi)存管理硬件交互的代碼是用匯編語言編寫的,這就使得MINIX3可以較為方便地移植到其他的硬件平臺上.
MINIX3系統(tǒng)架構(gòu)的其他3層都處于用戶空間執(zhí)行,它們都不能執(zhí)行特權(quán)指令,不能執(zhí)行I/O指令,它們都是作為一個個獨(dú)立的進(jìn)程被內(nèi)核所調(diào)度.當(dāng)然,在這3層之間,它們相對于內(nèi)核調(diào)度而言具有不同的優(yōu)先級.例如,設(shè)備驅(qū)動層(層2)的優(yōu)先級比服務(wù)進(jìn)程層(層3)高,同樣層3也比層4的優(yōu)先級高.優(yōu)先級高的進(jìn)程會先被執(zhí)行,這樣可以保證設(shè)備驅(qū)動程序執(zhí)行完以后,才會執(zhí)行進(jìn)程管理功能.同樣,只有當(dāng)進(jìn)程管理功能完成執(zhí)行以后,用戶的應(yīng)用程序才會被調(diào)度.
2.3.1 驅(qū)動程序?qū)?/p>
設(shè)備驅(qū)動層可以向內(nèi)核的系統(tǒng)任務(wù)進(jìn)程發(fā)出讀/寫I/O端口的請求消息,包括磁盤、打印機(jī)、終端、網(wǎng)卡等設(shè)備,都必須有相應(yīng)的設(shè)備驅(qū)動程序.設(shè)備驅(qū)動程序通過內(nèi)核調(diào)用可以將設(shè)備讀到的數(shù)據(jù)復(fù)制到另一個進(jìn)程的地址空間中.
2.3.2 服務(wù)器層
圖1中的第3層也叫做服務(wù)器層,它們?yōu)橛脩暨M(jìn)程提供必要的服務(wù).在服務(wù)器層中,最重要的兩個服務(wù)是進(jìn)程管理和文件系統(tǒng)模塊.在MINIX3操作系統(tǒng)中,進(jìn)程管理服務(wù)不但實(shí)現(xiàn)了進(jìn)程的創(chuàng)建、啟動與終止等系統(tǒng)調(diào)用,它還負(fù)責(zé)存儲空間的管理,比如MINIX3的進(jìn)程管理模塊負(fù)責(zé)實(shí)現(xiàn)MALLOC系統(tǒng)的調(diào)用.而文件系統(tǒng)模塊負(fù)責(zé)實(shí)現(xiàn)所有的文件系統(tǒng)的調(diào)用功能,比如READ、WRITE等系統(tǒng)調(diào)用.用戶的應(yīng)用程序可以通過系統(tǒng)調(diào)用來請求進(jìn)程管理和文件系統(tǒng)的服務(wù),但是用戶的應(yīng)用程序不能使用內(nèi)核調(diào)用,內(nèi)核調(diào)用只提供給設(shè)備驅(qū)動程序?qū)雍头?wù)器層的模塊.
在服務(wù)器層中,包含兩個MINIX3特有的服務(wù)器,一個叫做信息服務(wù)器(IS),它主要負(fù)責(zé)提供其他服務(wù)器和驅(qū)動程序的調(diào)試信息和狀態(tài)信息,這對于MINIX3用于實(shí)驗教學(xué)方面是非常有用的;另一個服務(wù)器叫做再生服務(wù)器RS(Reincarnation Server).當(dāng)RS服務(wù)器檢測到某一個設(shè)備驅(qū)動程序出現(xiàn)錯誤后,RS服務(wù)器就會自動重載該設(shè)備驅(qū)動程序,因為設(shè)備驅(qū)動程序被放在用戶空間運(yùn)行,這樣的重載并不會對操作系統(tǒng)內(nèi)核產(chǎn)生太大的影響,這就在很大程度上提高了系統(tǒng)的健壯性,也是MINIX3操作系統(tǒng)的一個鮮明的特點(diǎn).事實(shí)上,RS服務(wù)器進(jìn)程是操作系統(tǒng)中除了內(nèi)核進(jìn)程之外,所有其他進(jìn)程的父進(jìn)程,當(dāng)某個進(jìn)程異常終止時,RS進(jìn)程就會收到一個信號,RS進(jìn)程通過這種方式可以判斷設(shè)備驅(qū)動程序是否出現(xiàn)了問題.
服務(wù)器層也可以包含其他的服務(wù)器,比如網(wǎng)絡(luò)服務(wù)器等.服務(wù)器層的進(jìn)程不能直接執(zhí)行I/O請求,但它們可以通過設(shè)備驅(qū)動層來請求I/O服務(wù),服務(wù)器進(jìn)程也可以通過系統(tǒng)任務(wù)進(jìn)程與內(nèi)核進(jìn)行通信.
當(dāng)計算機(jī)加電的時候,計算機(jī)會按照CMOS中的配置信息去讀取啟動設(shè)備(軟盤、硬盤或光盤)的第一個扇區(qū).如果發(fā)現(xiàn)第一扇區(qū)在第510字節(jié)處是0XAA55標(biāo)志的話,就將第一扇區(qū)的內(nèi)容讀取到內(nèi)存的固定位置0x00∶0x7C00[4]處,并跳轉(zhuǎn)到這個內(nèi)存區(qū)域,執(zhí)行這里的代碼.這個處理過程是由BIOS程序自動完成的,與要加載的操作系統(tǒng)沒有關(guān)系.
如果MINIX3系統(tǒng)是從軟盤引導(dǎo)的,那么加載到0x00∶0x7C00內(nèi)存處的代碼就是MINIX3操作系統(tǒng)的引導(dǎo)程序(BOOTSTRAP),BOOTSTRAP的作用是將一個引導(dǎo)監(jiān)督程序(BOOT MONITOR)加載到內(nèi)存地址為0X1000∶0X0030中,并將CPU的控制權(quán)將給BOOT MONITOR.然后,BOOT MONITOR程序就會在磁盤上尋找一個文件,就是引導(dǎo)映象文件(BOOT IMAGE),并將其加載到特定的內(nèi)存位置,這樣就完成了MINIX3操作系統(tǒng)的加載.BOOT IMAGE文件主要包含的是內(nèi)核的可執(zhí)行代碼、系統(tǒng)任務(wù)代碼、時鐘任務(wù)代碼,還有進(jìn)程管理、文件系統(tǒng)的可執(zhí)行代碼等,MINIX3的引導(dǎo)映像文件一般都存放在/boot/文件夾下.
如果MINIX3是從硬盤引導(dǎo)的話,情況會有所不同.硬盤可以有多個分區(qū),硬盤的第一個扇區(qū)包含有一個分區(qū)表和一小段程序,這就是硬盤的主引導(dǎo)記錄,被BIOS程序讀到0X00∶0X7C00處的主引導(dǎo)記錄中包含的程序會將其自身復(fù)制到另一個內(nèi)存地址處0X00∶0X0600,然后跳轉(zhuǎn)到該處執(zhí)行指令,如圖2所示.
圖2 讀入主引導(dǎo)記錄后的內(nèi)存分布圖Fig.2 Memory layout after reading the master boot record
之所以要將主引導(dǎo)記錄的代碼復(fù)制到另一個內(nèi)存區(qū)域(0X0000∶0X0600),是因為從主引導(dǎo)記錄找到的可引導(dǎo)分區(qū),可能包含子分區(qū),子分區(qū)中仍然可以包含另一個主引導(dǎo)記錄,這時就需要將子分區(qū)中的子引導(dǎo)記錄復(fù)制到0X0000∶0X7C00處,直到最終找到的是引導(dǎo)程序(BOOTSTRAP),它就在內(nèi)存0X0000∶0X7C00處執(zhí)行.
引導(dǎo)監(jiān)督程序(BOOT MONITOR)程序主要完成的工作有決定內(nèi)存的布局、CPU的型號和當(dāng)前的顯示模式等.引導(dǎo)監(jiān)督程序也用來設(shè)置內(nèi)核映像加載之前的環(huán)境參數(shù),最后引導(dǎo)監(jiān)督程序?qū)?nèi)核映像(BOOTIMAGE)讀入內(nèi)存,并且將CPU控制權(quán)交給它.此時,操作系統(tǒng)需要做一些初始化的工作,BOOTIMAGE程序在執(zhí)行之后,會調(diào)用其中的boothead.s程序?qū)PU切換到保護(hù)模式,之后會調(diào)用MPX386.S文件中設(shè)置全局描述符表、局部描述符表及中斷描述符表等,具體的流程如圖3所示.
圖3 操作系統(tǒng)初始化圖Fig.3 Initialization of the MINIX3 operating system
MINIX操作系統(tǒng)是一個不斷發(fā)展和完善的操作系統(tǒng),它采用了微內(nèi)核的系統(tǒng)架構(gòu),與傳統(tǒng)的宏內(nèi)核的操作系統(tǒng)相比,微內(nèi)核操作系統(tǒng)的設(shè)計目標(biāo)是提供高可靠性、安全和可擴(kuò)展的平臺.MINIX3操作系統(tǒng)的內(nèi)核非常小,便于人們研究,微內(nèi)核架構(gòu)的操作系統(tǒng)也是目前操作系統(tǒng)研究領(lǐng)域的一個熱點(diǎn).
參考文獻(xiàn):
[1] Andrew S T,Albert S.Operating Systems:Design and Implementation[M].北京:清華大學(xué)出版社,2008.
[2] Le V J,Uhlig V,Stoess J, et al.Unmodified device driver reuse and improved system dependability via virtual machines[J].Proc 6th Symp on Operating Systems Design and Implementation,2004(6):17-30.
[3] Andrew S T,Jorrit N, Herder,et al.Can We Make Operating Systems Reliable and Secure[M].Amsterdam:Vrije Universiteit,2006.
[4] Andrew S.Boot sequence Overview[EB/OL].http://www.os-forum.com/minix/boot/bootsequence.