微內(nèi)核的結(jié)構(gòu)
通用操作系統(tǒng)要滿足各種不同用戶的要求,因此對它在功能上的要求是“通用”,所以其功能是越多越好。而嵌入式操作系統(tǒng)就有所不同,因?yàn)榍度胧讲僮飨到y(tǒng)的用戶群以及對功能的要求有某種程度的“專用”性,所以在一個特定的應(yīng)用中,嵌入式操作系統(tǒng)需要哪些功能、不需要哪些功能基本上是固定的。因此,這就給設(shè)計(jì)小內(nèi)核創(chuàng)造了條件。
相對于通用計(jì)算機(jī)系統(tǒng)而言,內(nèi)存在嵌人式系統(tǒng)中是更為稀缺珍貴的資源。因此,作為需要常駐內(nèi)存的操作系統(tǒng)的內(nèi)核,在滿足應(yīng)用的前提下越小越好。
另外,為了滿足不同的應(yīng)用需要,嵌人式實(shí)時(shí)操作系統(tǒng)作為嵌人式系統(tǒng)重要的軟件,應(yīng)支持可裁剪性。換句話說,嵌人式實(shí)時(shí)操作系統(tǒng)的設(shè)計(jì)在結(jié)構(gòu)上應(yīng)高度模塊化,并要提供非常靈活的手段,讓系統(tǒng)開發(fā)者能根據(jù)實(shí)際需要進(jìn)行選用。當(dāng)然,也應(yīng)允許用戶根據(jù)需要編寫自己的功能模塊,并可以很方便地集成到系統(tǒng)中。
目前,從操作系統(tǒng)現(xiàn)有的結(jié)構(gòu)來看,對于嵌入式實(shí)時(shí)操作系統(tǒng)來說,使用微內(nèi)核結(jié)構(gòu)應(yīng)該是一個較好的選擇。
在這里需要強(qiáng)調(diào)的是,微內(nèi)核并不是通過減少內(nèi)核的服務(wù)功能模塊而變小的,而是把內(nèi)核中應(yīng)提供的部分服務(wù)功能模塊移動到內(nèi)核外來實(shí)現(xiàn)的。這一點(diǎn)看起來有些費(fèi)解,其實(shí)也很簡單。還是拿到飯店吃飯為例,如果你按菜單點(diǎn)的某道菜肴,等了一會兒,你可能是吃到了這道菜,你作為一個顧客享受了這道菜肴,但是這道菜真的是這個飯店做的嗎?不一定,有可能就是其他飯店做的菜,只不過這個飯店在接收你的要求之后,它把消息發(fā)到另外一家飯店并讓他們把菜做出來,再拿到你的餐桌上罷了。如果一個飯店的大部分菜肴都可以這樣來提供,那么這個飯店所占用的土地面積一定會小得多。
其實(shí),微內(nèi)核的設(shè)計(jì)思想與上面所舉的例子一樣。如果把內(nèi)核的某些服務(wù)模塊作為一個進(jìn)程放在內(nèi)核以外,那么當(dāng)要求服務(wù)的進(jìn)程有服務(wù)要求時(shí),這個仍然是通過系統(tǒng)調(diào)用接口向內(nèi)核提出服務(wù)申請,而系統(tǒng)調(diào)用接口接收到該申請后,則立即通過向內(nèi)核外的服務(wù)進(jìn)程發(fā)送一個消息來啟動這個服務(wù)進(jìn)程,從而為要求服務(wù)的進(jìn)程提供了相應(yīng)的服務(wù)。顯然,這樣一來,就會使要求服務(wù)的進(jìn)程和提供服務(wù)的進(jìn)程都處在操作系統(tǒng)的用戶區(qū)而處在同一個層次上了,所以內(nèi)核也就變小了。為了區(qū)別兩種不同的進(jìn)程,把要求服務(wù)的進(jìn)程叫做“客戶”,把提供服務(wù)的進(jìn)程叫做“服務(wù)器”,這種微內(nèi)核結(jié)構(gòu)也叫做“客戶/服務(wù)器”結(jié)構(gòu)。微內(nèi)核的“客戶/服務(wù)器”結(jié)構(gòu)示意圖如圖所示。
圖 微內(nèi)核的客戶/服務(wù)器結(jié)構(gòu)示意圖
在微內(nèi)核中,由于客戶/服務(wù)器的這種結(jié)構(gòu)使內(nèi)核變得更便于維護(hù),一旦某部分發(fā)生錯誤,不會影響其他部分的工作,并且很適合嵌人式系統(tǒng)可裁剪性的要求:如果系統(tǒng)不需要某種服務(wù),則只要簡單地把相應(yīng)的服務(wù)器刪掉即可。當(dāng)然,系統(tǒng)設(shè)計(jì)人員也可根據(jù)實(shí)際需要對某一服務(wù)器進(jìn)程進(jìn)行修改,雨不會影響其他部分,再由于內(nèi)核是通過消息與服務(wù)器聯(lián)系的,是動態(tài)鏈接的,因此在修改某個服務(wù)器進(jìn)程后,只要對修改的服務(wù)器進(jìn)行編譯即可,而沒有必要對整個操作系統(tǒng)進(jìn)行編譯。
此外,這種結(jié)構(gòu)也適用于分布式系統(tǒng)。當(dāng)客戶需要遠(yuǎn)程服務(wù)器服務(wù)時(shí),只要在系統(tǒng)調(diào)用的庫函數(shù)中把客戶進(jìn)程的請求裝配成數(shù)據(jù)包轉(zhuǎn)發(fā)給遠(yuǎn)程的服務(wù)器,再接收遠(yuǎn)程服務(wù)器所返回的結(jié)果,把結(jié)果再返回給客戶進(jìn)程。對客戶進(jìn)程來說,它像正常一樣使用系統(tǒng)調(diào)用,而不知道也沒有必要知道這個服務(wù)是來自本地還是來自遠(yuǎn)程主機(jī)。
盡管可把原屬于內(nèi)核的服務(wù)模塊移動到內(nèi)核以外,但有幾項(xiàng)基本服務(wù)是沒有辦法這樣做的。例如,描述進(jìn)程的進(jìn)程控制塊一定應(yīng)該是內(nèi)核的內(nèi)容,于是與進(jìn)程控制塊相關(guān)的進(jìn)程調(diào)度、進(jìn)程創(chuàng)建、進(jìn)程刪除等需要訪問進(jìn)程控制塊的服務(wù)必須要保留在內(nèi)核中;進(jìn)程通信的管理當(dāng)然也要保留在內(nèi)核中;中斷的管理也要保留在內(nèi)核中??傊彩切枰褂锰幚砥魈貦?quán)指令的功能模塊都要保留在內(nèi)核中。