來自Wiki的圖片:
傳統(tǒng)上,操作系統(tǒng)的“內(nèi)核”是系統(tǒng)上運(yùn)行的所有其他軟件都需要的部分。因此,內(nèi)核對(duì)應(yīng)于可信計(jì)算基礎(chǔ)(Trusted Computing Base ,TCB)的OS部分,這些部分的正確行為是任何其他部分正確操作的先決條件。
微內(nèi)核的基本思想是最小化內(nèi)核,并在TCB之外實(shí)現(xiàn)盡可能多的內(nèi)核。內(nèi)核應(yīng)該只導(dǎo)出簡單的、低級(jí)的操作,希望這些操作能夠?qū)崿F(xiàn)更高效的應(yīng)用程序。這個(gè)想法可以追溯到[Per Brinch Hansen在1970年發(fā)表的<The nucleus of a multiprogramming system>],一個(gè)好的概述可以在[J. Liedtke. Toward Real Microkernels. 1996]中找到。傳統(tǒng)的內(nèi)核是“單結(jié)構(gòu)的”,在某種意義上說,它們?cè)赥CB內(nèi)以相對(duì)非結(jié)構(gòu)化的方式實(shí)現(xiàn)其所有功能。從軟件工程的角度來看,微內(nèi)核的優(yōu)點(diǎn)是顯而易見的:
微內(nèi)核最初受到了極大的熱情,在80年代后期,在學(xué)術(shù)和商業(yè)環(huán)境中都有很多關(guān)于微內(nèi)核的工作。當(dāng)人們開始遇到似乎與微內(nèi)核實(shí)現(xiàn)的靈活性和效率有關(guān)的內(nèi)在困難時(shí),最初的熱情消退了:
通過對(duì)原始微內(nèi)核理想的各種妥協(xié)克服了這些困難。幾個(gè)效率關(guān)鍵的特性被重新引入內(nèi)核,并且通過可下載的二進(jìn)制代碼或可信的“內(nèi)核加載模塊”支持向內(nèi)核添加新特性。
但是,將大多數(shù)驅(qū)動(dòng)程序和服務(wù)器集成回TCB,在很大程度上消除了微內(nèi)核方法的好處,最終導(dǎo)致更復(fù)雜的單內(nèi)核操作系統(tǒng)內(nèi)核。
最近,在微內(nèi)核理念之后出現(xiàn)了幾種第二代實(shí)現(xiàn),它們聲稱可以解決第一代的靈活性和效率問題。這些實(shí)現(xiàn)如何實(shí)現(xiàn)這個(gè)目標(biāo)有很大的不同,以下三個(gè)具有代表性:
目前尚不清楚這些新一代解決方案是否真正適用于實(shí)際操作系統(tǒng)。缺少的是使用上述系統(tǒng)的策略構(gòu)建的真實(shí)操作系統(tǒng)的存在,就像Chorus和Mach是使用第一代微內(nèi)核策略構(gòu)建的真實(shí)操作系統(tǒng)一樣。盡管如此,上述系統(tǒng)的出現(xiàn)給微內(nèi)核方法的未來帶來了巨大的希望。
在八十年代末和九十年代初期,有幾個(gè)真正的基于微內(nèi)核的操作系統(tǒng)。也許其中最引人注目的兩個(gè)是Mach和Chorus。Mach在CMU開發(fā),是最成功的,并且已經(jīng)被應(yīng)用到幾個(gè)商業(yè)系統(tǒng)中,比如NeXTSTEP OS。
OS | microseconds | instructions |
Mach | 115.0 us | 1150 |
L4 | 5.0 us | 50 |
Exokernel | 1.4 us | 30 |
SPIN | 102.0 us | 1100 |
3.1 L4
L4是J. Liedtke和他的團(tuán)隊(duì)在1995年開發(fā)的,是L3的直接后代,L3是第一代微核。L4的從頭開始開發(fā),加上它的小尺寸和簡單的接口,使它能夠擺脫第三種'遺留'代碼類型的微內(nèi)核問題。
L4基于微內(nèi)核是處理器相關(guān)的理論,即像代碼優(yōu)化器一樣,微內(nèi)核本身就不能移植,盡管它們提高了整個(gè)系統(tǒng)的可移植性。L4提供了三個(gè)抽象,地址空間、線程和IPC,并且只實(shí)現(xiàn)了七個(gè)系統(tǒng)調(diào)用。L4中的線程是用戶級(jí)的,但是內(nèi)核支持通信和地址空間管理。最后兩個(gè)抽象,地址空間和IPC,在L4中特別有趣,下面將詳細(xì)討論。
3.1.1 地址空間
L4微內(nèi)核提供了實(shí)現(xiàn)物理內(nèi)存管理和各種保護(hù)方案的基本機(jī)制?;舅枷胧侵С謨?nèi)核之外的地址空間的遞歸構(gòu)建,如下面的圖1所示。
圖1 L4中遞歸構(gòu)造的地址空間
初始地址空間表示物理內(nèi)存,并由初始內(nèi)存服務(wù)器擁有。虛擬頁面的所有者可以使用L4提供的操作,將其所有權(quán)轉(zhuǎn)移到(grant)或與(map)共享,這是一個(gè)同意的接收進(jìn)程。所有者還可以從接收者的地址空間中刪除任何共享頁面(demap),而不需要在兩個(gè)進(jìn)程之間達(dá)成任何協(xié)議。
此功能允許實(shí)現(xiàn)內(nèi)核之外的內(nèi)存管理和分頁。映射和解調(diào)足以在微內(nèi)核之上實(shí)現(xiàn)內(nèi)存管理和分頁。授予僅在特殊情況下使用,以避免雙重簿記(bookkeeping)和地址空間溢出。為了驗(yàn)證進(jìn)程一致性,采用IPC實(shí)現(xiàn)內(nèi)存管理和分頁,進(jìn)一步強(qiáng)調(diào)了快速IPC的必要性。
3.1.2 IPC實(shí)現(xiàn)
L4繼承了L3改進(jìn)版本的IPC實(shí)現(xiàn),速度驚人,其性能如表1所示。IPC時(shí)間的這種數(shù)量級(jí)改進(jìn)是通過各種優(yōu)化技術(shù)實(shí)現(xiàn)的。下面我們將討論其中的一些技術(shù),這些技術(shù)帶來了最大的性能收益。
3.2 Exokernel
Exokernel,于1994 - 1995年在麻省理工學(xué)院開發(fā)。其開發(fā)背后的主要?jiǎng)訖C(jī)是內(nèi)核提供的抽象代價(jià)太高而且限制了靈活性。本論文得到了“end-to-end”論證的支持:應(yīng)用程序比OSs更清楚它們的資源管理決策的目標(biāo)是什么,因此,應(yīng)該盡可能多地控制這些決策。
因此,微內(nèi)核應(yīng)該只提供最小必要的原語集,以安全地多路復(fù)用硬件資源。高級(jí)功能由庫OSs提供,庫OSs是用戶提供的,不受Exokernel信任。為了使Exokernel盡可能簡單和高效,甚至它的導(dǎo)出接口也依賴于硬件。大多數(shù)時(shí)候,Exokernel只是導(dǎo)出硬件功能。
圖2 基于Exokernel的應(yīng)用程序/操作系統(tǒng)的結(jié)構(gòu)
圖2顯示了基于exokernel的系統(tǒng)的結(jié)構(gòu),兩個(gè)應(yīng)用程序使用不同的庫OSs。由于Exokernel必須適應(yīng)不受信任的高級(jí)別OSs,其主要目標(biāo)是安全地導(dǎo)出和復(fù)用硬件原語和資源。Exokernel使用了三種技術(shù)來實(shí)現(xiàn)這一點(diǎn):安全綁定、可見資源撤銷和中止協(xié)議,下面將討論其中的每一種。
3.2.1 安全綁定
由于資源的實(shí)際管理留給了庫操作系統(tǒng),因此必須有一個(gè)將資源保護(hù)與資源管理分開的機(jī)制。安全綁定就是這種機(jī)制,Exokernel使用三種不同的技術(shù)實(shí)現(xiàn)它們:硬件機(jī)制、軟件緩存和可下載的應(yīng)用程序代碼。
一種常見的硬件機(jī)制是TLB。安全綁定可以實(shí)現(xiàn)為從虛擬地址到物理地址的映射,例如,作為TLB入口。如果硬件TLB不夠大,則將其封裝在較大的軟件TLB中,以緩存此類映射。在一些Silicon Graphics系統(tǒng)上可用的另一種硬件機(jī)制是具有與每個(gè)像素相關(guān)聯(lián)的所有權(quán)字段的幀緩沖器。在那里,硬件處理幀緩沖區(qū)的保護(hù),只有當(dāng)像素改變所有權(quán)時(shí)才涉及到Exokernel。還可以將代碼下載到內(nèi)核中,在每個(gè)資源訪問或事件中調(diào)用它來確定所有權(quán)以及內(nèi)核應(yīng)該執(zhí)行的操作。包過濾器就是這種代碼的一個(gè)例子。
實(shí)際上,下載代碼的這個(gè)特性不僅可以用于安全綁定的實(shí)現(xiàn)。更一般地說,可以將特定于應(yīng)用程序的安全處理程序(ASH)下載到內(nèi)核中,并允許它執(zhí)行一般的計(jì)算。這種功能是基于性能的,用于減少內(nèi)核和用戶模式之間的上下文切換,特別是在時(shí)間限制使這些切換不切實(shí)際的情況下,如包接收上的網(wǎng)絡(luò)ack。ASHs和所有下載的代碼都是不受信任的,并且通過代碼檢查(使用類型安全語言)、保護(hù)解釋和沙箱(與SPIN類似)的組合而變得安全。
3.2.2 可見資源撤銷
可見撤銷比傳統(tǒng)的隱形撤銷具有更高的延遲,但允許庫操作系統(tǒng)指導(dǎo)解除分配并了解資源稀缺性。Exokernel導(dǎo)出物理名稱以提高效率和更好的資源管理,因?yàn)檫@允許消除間接級(jí)別,而且物理名稱通常編碼有用的資源屬性。這使得可見撤銷成為必要,因?yàn)閹霴S需要更新它的物理引用。
3.2.3 中止協(xié)議
由于庫操作系統(tǒng)不受信任,因此Exokernel應(yīng)該適應(yīng)他們的不合作。當(dāng)撤銷請(qǐng)求沒有及時(shí)得到滿足時(shí),Exokernel有權(quán)“強(qiáng)制”打破任何相關(guān)的安全綁定,并重新獲得所請(qǐng)求的資源。Exokernel通知不友好的庫操作系統(tǒng)撤銷,但不采取任何更激烈的措施。另一種方法是殺死相關(guān)的應(yīng)用程序,但這是為了減少損失而決定的。
3.2.4 保留
Exokernel方法是非常激進(jìn)的,它激發(fā)了人們對(duì)原始微內(nèi)核的熱情。然而,這些微內(nèi)核的命運(yùn)應(yīng)該有一個(gè)發(fā)人深省的影響。應(yīng)該注意的是,主要的Exokernel論文沒有討論OSs的幾個(gè)關(guān)鍵方面,比如文件系統(tǒng),而且它們對(duì)高效框架緩沖區(qū)的特殊硬件的依賴感覺像是作弊。因此,硬件級(jí)非抽象的Exokernel方法可能只適用于專門的機(jī)器代碼級(jí)應(yīng)用程序。即便如此,這種不完整性可能只是當(dāng)前Exokernel實(shí)現(xiàn)的不成熟的標(biāo)志,而不是該方法的固有問題。確實(shí)有一篇新的論文,它討論了高效的“Exo-file-system”的實(shí)現(xiàn)。
3.3 SPIN
SPIN,基于Mach微內(nèi)核的最新版本,增加了下載安全代碼的能力,從而擴(kuò)展了內(nèi)核。因此,它在某種程度上表明了為抵御第一代微內(nèi)核操作系統(tǒng)的低迷性能而開發(fā)的最新一代技術(shù)。因此,這里的介紹既合適又必要。
SPIN使用語言和鏈接時(shí)機(jī)制來允許動(dòng)態(tài)擴(kuò)展內(nèi)核服務(wù)。應(yīng)用程序可以將新OS服務(wù)的代碼下載到內(nèi)核中,因此可以根據(jù)自己的特定需求創(chuàng)建細(xì)粒度的OS接口。擴(kuò)展由內(nèi)核編譯器轉(zhuǎn)換,動(dòng)態(tài)鏈接到內(nèi)核并在內(nèi)核的虛擬地址空間內(nèi)執(zhí)行。
3.3.1 靈活性
上面的內(nèi)核可擴(kuò)展性方法立即提出了安全問題:用戶提供的代碼可以信任嗎?SPIN通過使用類型安全語言Modula-3和沙箱下載的代碼來解決這個(gè)問題。因此,編譯器執(zhí)行靜態(tài)分析并插入運(yùn)行時(shí)檢查,確保編譯后的代碼不會(huì)違反內(nèi)核、其他模塊或用戶級(jí)代碼的完整性。由于內(nèi)核不對(duì)導(dǎo)入代碼的安全性做出任何假設(shè),因此可以聲稱編譯后的擴(kuò)展不會(huì)增加TCB。每個(gè)單獨(dú)模塊的隔離保證了如果應(yīng)用程序崩潰,例如,由于下載到內(nèi)核的擴(kuò)展模塊錯(cuò)誤,系統(tǒng)的其余部分不會(huì)受到影響。
SPIN提供了一組用于管理內(nèi)存和處理器資源的核心服務(wù)。它們的級(jí)別類似于宏內(nèi)核操作系統(tǒng)中的內(nèi)部接口。內(nèi)核擴(kuò)展可以將核心服務(wù)用作構(gòu)建塊,也可以執(zhí)行任意計(jì)算。核心服務(wù)包括支持對(duì)虛擬內(nèi)存的應(yīng)用程序控制的操作,例如地址的轉(zhuǎn)換服務(wù)。核心服務(wù)還包括用于進(jìn)程管理的低級(jí)接口,定義要由用戶線程包和調(diào)度程序處理的一組事件,以及包括確定事件的接收者線程包的全局調(diào)度程序。
3.3.2 性能
內(nèi)核擴(kuò)展在靈活性和可擴(kuò)展性方面的優(yōu)勢(shì)是顯而易見的,甚至可以在線修改內(nèi)核。至于性能,向內(nèi)核添加功能在一定程度上減少了內(nèi)核和進(jìn)程之間的IPC數(shù)量。這在某種程度上補(bǔ)償了測(cè)量的高IPC成本。即便如此,應(yīng)用于L4的優(yōu)化也可能適用于SPIN,從而降低了剩余IPC操作的成本。
另一個(gè)可能更重要的性能問題是內(nèi)核編譯器的效率。證明代碼模塊安全并不是一項(xiàng)簡單的任務(wù),安裝新內(nèi)核擴(kuò)展所產(chǎn)生的延遲有時(shí)是不可接受的。但是,當(dāng)前版本的SPIN使用了一個(gè)外部編譯器,這是對(duì)以前的解釋器或基于內(nèi)部編譯器的系統(tǒng)的改進(jìn)。在SPIN中,編譯器可以是多任務(wù)的,并且內(nèi)核的大小更小。對(duì)編譯器接口的進(jìn)一步改進(jìn)可能包括緩存已編譯的代碼以減少分?jǐn)偟木幾g時(shí)延遲,以及處理嵌套IPC重定向等事務(wù)的專門優(yōu)化。
4) 總結(jié)
首先讓我們看一下上面檢查的三個(gè)系統(tǒng)如何滿足2.1節(jié)中所述的微內(nèi)核的原始目標(biāo)。與傳統(tǒng)的宏內(nèi)核相比,這三個(gè)系統(tǒng)的性能都是一樣的,或者更好,這三個(gè)系統(tǒng)都可以支持新的應(yīng)用程序結(jié)構(gòu)(分別是遞歸地址空間、庫OSs和內(nèi)核擴(kuò)展)。那么剩下的就是檢查2.1節(jié)的枚舉列表:
從上面可以看出,當(dāng)前的微內(nèi)核已經(jīng)解決了2.2節(jié)中提到的IPC和遺留問題,但是它們似乎并沒有解決微內(nèi)核中高M(jìn)CPI的問題。這實(shí)際上是一個(gè)值得關(guān)注的大問題,因?yàn)殡S著內(nèi)部CPU速度的快速增長,緩存性能越來越成為一個(gè)問題。然而有人指出,使內(nèi)核小到足以完全適應(yīng)緩存,將消除這個(gè)問題。SPIN在內(nèi)核中進(jìn)行計(jì)算的方法也可能解決這個(gè)問題,盡管內(nèi)核很大。
目前這一代微內(nèi)核的一個(gè)共同方面是可擴(kuò)展性,通過下載代碼驗(yàn)證安全。這種能力對(duì)于未來的高速網(wǎng)絡(luò)和分布式OSs顯得至關(guān)重要,特別是在進(jìn)程切換的相對(duì)成本急劇上升的情況下。因此,奇怪的是L4還不支持內(nèi)核可下載擴(kuò)展。然而,閱讀L4的論文就會(huì)發(fā)現(xiàn),該系統(tǒng)實(shí)際上沒有很好的網(wǎng)絡(luò)性能,人們可以猜測(cè),他們用可下載的擴(kuò)展來糾正這一點(diǎn)只是時(shí)間問題。
第二代微內(nèi)核導(dǎo)出的接口的復(fù)雜性差異很大。L4和Exokernel都提供簡單的低級(jí)操作。L4提供了地址空間和線程管理所需的基本內(nèi)核抽象,而Exokernel提供了安全的多任務(wù)資源所需的裸硬件相關(guān)原語。另一方面,SPIN導(dǎo)出各種接口,應(yīng)用程序看到繼承自Mach的第一代微內(nèi)核接口,以及內(nèi)核下載代碼的內(nèi)部接口。Exokernel中ASHes的存在更難以區(qū)分全局描述。因此,適當(dāng)?shù)膬?nèi)核提供的操作集可能是有效的低級(jí)操作和在需要時(shí)使用高級(jí)操作擴(kuò)展內(nèi)核的能力的混合,例如,支持關(guān)鍵時(shí)間的功能,如網(wǎng)絡(luò)。
Exokernel的硬件依賴可能是一個(gè)嚴(yán)重的缺點(diǎn)。我們發(fā)現(xiàn),構(gòu)建非常低層次的抽象(如L4導(dǎo)出的抽象)是非常依賴于CPU的,對(duì)于Intel x86家族的后續(xù)成員,需要完全不同的方法。這似乎表明,在Exokernels之上構(gòu)建低級(jí)庫OSs可能是每一代處理器都需要重新做的事情。如此高的不可移植性將成為任何真正接受基于Exokernel的操作系統(tǒng)的嚴(yán)重障礙。
總之,我們應(yīng)該強(qiáng)調(diào)我們?cè)谝灾幸呀?jīng)指出的內(nèi)容。第二代微內(nèi)核最重要的責(zé)任是完全缺乏基于它們的真實(shí)操作系統(tǒng)。只有每天的實(shí)踐經(jīng)驗(yàn)才能證明操作系統(tǒng)是真正可行的。由于這些微內(nèi)核是最新的,它們的最終判斷還為時(shí)尚早。時(shí)間是他們唯一確定的判斷。
聯(lián)系客服