深入理解操作系统内核架构(送书)!
近年來,我國自主研發操作系統被反復提及。近期,一個計算機領域內非常專業的詞來到了幾乎所有人的視線內,這就是——微內核。人們對操作系統內核的討論越來越熱烈,甚至有人說我不懂什么叫微內核,什么是宏內核,接下來本文將帶領大家了解操作系統內核架構,微內核與宏內核到底孰優孰劣?
操作系統內核架構
隨著操作系統功能的不斷增多和代碼規模的不斷擴大,提供合理的層級結構,對于降低操作系統復雜度、提升操作系統安全與可靠性來說變得尤為重要。圖1列舉了一些常見的操作系統內核架構。下面我們對這些結構進行簡要的分析。
圖1 操作系統內核架構的頻譜:簡要結構(如DOS)、宏內核(如UNIX/Linux)、
微內核、外核與多內核等
1.1 簡要結構
一些功能較為簡單的操作系統,會選擇將應用程序與操作系統放置在同一個地址空間(addressspace)中,無須底層硬件提供復雜的內存管理、特權級隔離等功能。MS-DOS(MicroSoft Disk Operating System)是采用了簡要結構的一個典型例子。該結構的一個優勢在于,應用程序對操作系統服務的調用可直接通過函數調用高效完成,但缺點也同樣明顯,任何一個應用或操作系統模塊出現了問題,均有可能使整個系統崩潰。隨著操作系統功能的不斷增加,簡要結構會使操作系統的設計與實現難度越來越高,難以持續演進。
盡管缺乏隔離能力,簡要結構的操作系統依然采用了一定的模塊化與層次結構以降低復雜度。圖2展示了MS-DOS的內部結構:MSDOS.Sys模塊通過命令行接口與用戶交互,并負責與設備驅動交互以實現對硬件設備的管理;I/O子系統(IO.Sys)實現對硬件設備I/O訪問的管理,并以I/O請求作為抽象為MSDOS.Sys和設備驅動I/O提供服務。
圖2? MS-DOS的系統結構
除了MS-DOS外,當前采用簡要結構的操作系統還包括FreeRTOS與uCOS等。這些操作系統主要運行在微控制單元(MicroController Unit,MCU)等相對比較簡單的硬件上,這些硬件通常沒有提供現代意義上的內存管理單元(MemoryManagement Unit,MMU),隔離能力較弱或缺失,難以運行(往往也不需要運行)復雜的操作系統。
1.2 宏內核架構
宏內核(Monolithic kernel)又稱單內核,其特征是操作系統內核的所有模塊(包括進程調度、內存管理、文件系統、設備驅動等)均運行在內核態,具備直接操作硬件的能力,這類操作系統包括UNIX/Linux、FreeBSD等。圖3展示了一個典型的宏內核架構。在操作系統代碼中,通常會有類似arch/arm/的目錄,用于封裝與體系結構相關的功能實現。
圖3 宏內核的基本結構
由于操作系統內核的功能日趨復雜,宏內核架構的操作系統也逐步采用M.A.L.H方法對功能進行模塊化、抽象、分層、層級等,以控制其不斷增長的復雜度。下面是一些典型的方法。
1.模塊化:現代操作系統(如UNIX、Linux、Windows等)的內核均采用模塊化的策略來組織各個功能。為進一步提高功能的可擴展性,現代操作系統通常還提供了可加載內核模塊(Loadable Kernel Module,LKM)機制。例如,當前大部分設備驅動是以可加載模塊的形式存在的,與內核其他模塊解耦,使驅動開發與驅動加載更加方便、靈活。
2.抽象:現代操作系統內核均廣泛采用抽象的方法來降低復雜度并提高可維護性。例如,UNIX將文件作為一個重要的抽象,提出“一切皆是文件”(everythingis a file),將數據、設備、內核對象等均抽象為文件,并為上層應用提供統一的接口。
3.分層:宏內核架構的操作系統一開始就采用了分層的架構。例如,圖靈獎獲得者EdsgerDijkstra在1968年提出的“THE”操作系統將操作系統分為6層,如圖4所示。現代操作系統內核也均存在一定程度的分層結構,以更好地組織各種功能。圖5展示了Linux文件系統的分層結構。
4.層級:層級的概念同樣被廣泛應用于內核的資源管理中,如調度子系統中對進程優先級的分類,控制組(cgroup)對進程層級的分類,內存分配器對不同內存的分類等。
?????? ?圖4 “THE”操作系統的分層結構??
圖5 文件系統的分層結構
通過各種復雜度控制方法,Linux已經演進為一個超過2800萬行代碼的復雜系統,成為世界上最大的開源協作項目,每年有超過1800人為Linux提交補丁來修復問題以及添加新功能。然而Linux同樣面臨挑戰:一個通用的、適用于大部分場景的設計,常常意味著很難滿足特定場景下對安全性、可靠性、實時性等方面的需求;同時,在一個龐大的系統中進行創新也變得越來越困難,這使得一些較大的創新(如網絡、文件系統、設備驅動等)開始往用戶態遷移。
1.3 微內核架構
隨著宏內核操作系統的內核功能不斷增長,系統的復雜度也持續增加,在可靠性、安全性等方面導致了更多的問題。這是因為在宏內核架構下,所有內核模塊均運行在特權空間,一個單點的錯誤就可能會導致整個系統崩潰或者被攻破。哪怕是具有極強編程能力的操作系統內核程序員編寫的內核系統也很難避免bug。在Andrew Tanenbaum等人的論文中提到,在一般的工業界系統中每千行代碼大約會有6~16個缺陷。雖然很多缺陷在正常運行時不會被觸發,部分缺陷即使被觸發也不會引起顯著后果,但對于一個千萬行代碼級的軟件而言,潛在的缺陷數量也是觸目驚心的。
因此,研究人員嘗試對宏內核架構的操作系統進行解耦,將單個功能或模塊(如文件系統、設備驅動等)從內核中拆分出來,作為一個獨立的服務部署到獨立的運行環境中;內核僅保留極少的功能,為這些服務提供通信等基礎能力,使其能夠互相協作以完成操作系統所必需的功能。這種架構被稱為微內核(Microkernel)。在微內核架構下,服務與服務之間是完全隔離的,單個服務即使出現故障或受到安全攻擊,也不會直接導致整個操作系統崩潰或被攻破,從而能有效提高操作系統的可靠性與安全性。此外,微內核架構帶來了機制與策略的進一步分離,也可以更方便地為不同場景定制不同的服務,從而更好地適應不用的應用需求。
Tips
小知識:最早的微內核操作系統
一些讀者可能認為微內核架構是一個比較新的設計。事實上,早在1969年,UNIX系統開始設計的時候,類似微內核架構的操作系統就已經出現。Per Brinch Hansen開發的RC 4000多路編程系統在歷史上第一次將操作系統的組件分離為各個相互交互的功能組件,以及一個負責消息通信的內核。Per Brinch Hansen在RC 4000中也首次提出了分離機制與策略的原則,以及管程(Monitor)這個概念。
微內核的發展到目前為止經歷了三代。Mach是第一代微內核的代表。1975年,Mach起源于羅徹斯特大學,后來主要在卡內基梅隆大學開發。Mach將很多內核功能以單獨服務的形式運行在用戶態;然而,Mach對進程間通信(Inter-ProcessCommunication,IPC)的設計過于通用,加上Mach微內核自身資源(包括內存與CPU緩存等)占用過大的問題,使得其性能與同時期的宏內核相比存在差距,甚至有人據此將微內核與性能差關聯起來。
微內核的性能一定差嗎?德國國家信息技術研究中心的JochenLiedtke深入分析了Mach微內核系統的性能,指出較差的性能不是微內核的必然結果。Jochen認為,高性能IPC的設計與實現必然是與體系結構相關的,過度抽象將極大影響IPC的性能,而利用體系結構相關的狀態進行優化則可將IPC性能提升到極致。為此,Jochen Liedtke設計并實現了L4微內核系統,并提出了微內核的最小化原則:一個操作系統內核的功能只有在將其放在內核態以外會影響整個系統的功能時,才能被放置在內核態。通過高性能的IPC實現以及極小化的微核(即微內核系統的內核態部分,又稱祂ernel),微內核架構操作系統的性能可以達到甚至超過同時期的宏內核架構操作系統。L4被認為是第二代微內核操作系統的代表。
隨著L4等微內核操作系統在實時、高安全等場景的廣泛應用,研究人員開始對微內核的安全性進行進一步的增強。EROS首次將能力(Capability)機制引入微內核操作系統中,并高效地實現了該機制(關于Capability機制詳見《現代操作系統:原理與實現》 16.2.6節)。Capability機制允許更精確、更細粒度地給不同應用程序授予對內核對象的調用權,從而能更好地提升系統安全性。seL4[10-11]是一個典型的基于Capability機制的微內核;谷歌正在實現的Fushcia微內核操作系統同樣基于Capability機制實現了訪問控制。此外,seL4還引入了形式化證明方法(詳見第18章),通過數學的方式證明了其微核部分滿足從設計到實現的一致性,以及微核上的服務具有互不干擾(non-interference)等屬性。這些安全增強能力成為第三代微內核架構操作系統的重要特征。
宏內核vs.微內核
自宏內核與微內核這兩種操作系統架構出現伊始,人們就兩者的優劣與特點展開了多次深入的討論。當前,隨著一些新場景、新訴求的出現,使類似微內核架構的操作系統架構再次受到關注。
1.彈性擴展能力:對于一個宏內核來說,很難僅僅通過簡單的裁剪或擴展,使其支持資源訴求從KB到TB級別的場景。
2.硬件異構性:異構硬件往往需要一些定制化的方式來解決特定問題,這種定制化對于宏內核來說很難得到長期的支持。
3.功能安全:由于宏內核在故障隔離和時延控制等方面的缺陷,截至目前尚無通過高等級功能安全認證(例如,汽車行業的ASIL-D)的先例。
4.信息安全:宏內核架構的操作系統存在較大的信息安全隱患,例如內核態驅動容易導致低質量的驅動代碼入侵內核,粗粒度權限管理容易帶來權限漏洞等。
5.確定性時延:由于宏內核架構資源隔離較為困難,且各模塊耦合度高導致難以控制系統調用的時延,因此較難做到確定性時延;即便為時延做一些特定優化(例如Linux-RT補丁),時延抖動仍然較大。
在真實世界中,正如體系結構領域的RISC與CISC之爭一樣,宏內核與微內核往往會互相借鑒。例如,Intel處理器采用了CISC的指令集架構,但其微架構實現則采用了RISC架構;類似地,Linux等宏內核架構操作系統也采用了一些微內核的設計思想。例如,盡管Linux的創始人Linus Torvalds在20世紀90年代與AndrewTanenbaum論戰時表明將驅動放到用戶態是個不靠譜的想法,但近期Linux也逐步采用了一些用戶態驅動模型(如UIO與VFIO等);Android操作系統在Treble項目中同樣將部分驅動放到了用戶態,并通過名為Binder的IPC機制來與這些驅動進行交互。
Tips
小思考:小的操作系統內核就是微內核嗎?
不是。有一些操作系統內核(如FreeRTOS、uCOS-II等)雖然很小,但是不具備現代意義上的操作系統功能,包括虛擬內存、用戶態和內核態分離等。因此它們應該被歸為本章提到的簡要結構內核。
軟件是計算系統的“靈魂”,而操作系統則是軟件運行和支撐技術的核心,“CPU+操作系統”更是成為信息產業生態的核心、信息時代安全的基石。自1956年第一個實用操作系統誕生以來,操作系統已歷經60多年的發展。它一方面是伴隨以CPU為代表的硬件及其組成結構的發展,另一方面是為了支持多機、分布和網絡環境,以及滿足新型計算模式和新型應用的需求。迄今,以20年左右為周期,操作系統已出現從主機計算時代到個人計算時代,再到移動計算時代的兩次重大變遷,每次變遷均涉及計算設備及其用戶兩方面的數量級的躍升,同時誕生了新的“CPU+操作系統”生態。當然,從技術本質看,操作系統“向下管理各種計算資源,向上為應用程序提供運行環境和開發支撐,為用戶提供交互界面”的角色定位未變。
當前,萬物互聯、人機物融合計算的泛在計算時代正在開啟。以云計算、大數據、人工智能和物聯網等為代表的新型應用場景,多種不同架構的CPU、GPU和加速器與以新型存儲、傳感設備等為代表的新型硬件,以及嵌入式、移動計算、邊緣計算、云計算等不同規模的計算系統,使得操作系統的內涵和外延均發生了重大變化,新一輪的重大變遷正在孕育中。支撐泛在計算的“泛在操作系統”將成為新的操作系統形態,并催生新的“CPU+操作系統”生態。這一輪變遷將促進新的操作系統研究與實踐,在帶來新機遇的同時,也會產生新的挑戰和更激烈的競爭。
本文摘編自《現代操作系統:原理與實現》一書。
作者:陳海波 夏虞斌 等
陳海波作品,結合前沿研究與工業界實踐
面向真實場景與真實問題
全新打造ChcCore微內核系列課程實驗
建立對操作系統的第一手實踐經驗
操作系統和系統安全領域國際知名學者、上海交通大學陳海波、夏虞斌領銜撰寫。由淺入深介紹現代操作系統經典理論與方法。本書以三個“面向”為導向,即面向經典基礎理論與方法,面向國際前沿研究,面向工業界實踐,深入淺出地介紹操作系統的理論、架構、設計方法與具體實現。本書是首本以ARM64為主體介紹操作系統的教材,將學術前沿與工業實踐充分結合,不僅介紹了現有的Linux宏內核操作系統架構,而且介紹了微內核、外核等操作系統架構。
如果覺得這本書不錯 歡迎?在看丨留言丨分享至朋友圈?三連 在文末留言區參與討論,留言聊聊你和操作系統的故事或對操作系統的看法,我們精選出3條走心留言(點贊數,三連),將獲贈你這本書。總結
以上是生活随笔為你收集整理的深入理解操作系统内核架构(送书)!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解消息队列(场景,对比,原理和设计
- 下一篇: QUIC 是如何解决TCP 性能瓶颈的?