引言:鴻蒙OS自曝光以來,數次引起軒然大波,對于鴻蒙是不是徹底擺脫了安卓系統的束縛,沒有了安卓的身影,是很多人最為關切的問題。
而鴻蒙采用的微内核是什麼?運行的原理是什麼,我們還沒有徹底弄清,本篇内容部分借鑒微信公衆号的物聯網操作系統中的部分微内核衍變曆程,僅供大家參考。
雖然鴻蒙OS宣布了開源,并且呼籲更多的開發者加入進來,而當下來看,隻有榮耀的新款智慧屏首次搭載了鴻蒙OS,希望能夠看到更多信息的廣大花粉和用戶們,可以期待一下華為2019年的年度旗艦Mate30和Mate30Pro。
首先就需要講到鴻蒙OS的微内核部分。
微内核設計的基本思想是簡化内核功能,在内核之外的用戶态盡可能多地實現系統服務,同時加入相互之間的安全保護。内核隻提供最基礎的服務,比如多進程調度、多進程通信(IPC)等。其中進程通信是作為連接應用與用戶态系統服務的橋梁。
宏内核系統相關的服務基本都是放于内核态内核中,例如文件系統、設備驅動、虛拟内存管理、網絡協議棧等;而微内核則把更多的系統服務(例如文件系統、POSIX 服務、網絡協議棧甚至外設驅動)放到用戶态應用,形成一個個服務,等待其他應用的請求。而後來,為了在宏内核與微内核之間揚長避短,也發展出了中間的混合内核的形态,部分服務也會放置于内核中。
而微内核的發展,大緻經過了三代演變而來
微内核這個概念從提出開始就在不斷地發展、完善進步之中,到目前為止可以分為三代。
第一代微内核:從無到有
第一代微内核的主要代表是 Mach,該系統由美國卡耐基梅隆大學的 Avie Tevanian 和 Richard Rashid 主導開發。在 Mach 剛剛開始設計時,UNIX 的發展正如日中天,所以Mach在設計時的一大目标就是兼容 UNIX,但是與 UNIX 不同的是 Mach 嘗試使用微内核架構去設計。Mach 以 IPC 是作為所有系統服務與内核交換數據的基礎機制,充分運用 IPC、虛拟内存、多進程等特性将冗餘的系統服務移出内核作為進程運行。
1986年,經過兩年的開發,第一版的 Mach 發布後的第二年,Mach 就發布了第2版,不過由于時間倉促,加之沒有足夠的人手與資金,所以此時 Mach 内核并不提供完全的系統服務。
為了支撐系統上層運行,這一版的内核包含了大量 4.3 版本的 BSD 系統(UNIX的一個分支)代碼提供系統服務,并且 BSD 系統服務運行在内核狀态,這導緻 Mach 内核的代碼體積甚至大于常規 UNIX 内核。
第一版和第二版的 Mach 主要做了如下工作:
1. 驗證了微内核的可行性;
2. 在多處理器計算機上進行移植驗證了微内核在多處理器計算機上的運行;
3. 最後為了提高 IPC 的效率,Mach 使用共享内存機制來完成 IPC。
而 Mach 的共享内存機制是在虛拟内存技術的支持下實現的,隻有需要對内存進行寫入時才進行複制。這麼一處理比每次都複制一遍内存節省了内存使用同時又加快了 IPC 機制的處理時間,這個改進稱為寫時複制,并且在如今的通用操作系統如 Linux 中常常用到。
經過測試,Mach 2.5的效率最多比 UNIX 少 25%,但是考慮到 Mach 帶來的可靠性、可拓展性、安全性,這個效率損失尚可以接受。
當然此時 Mach 内核還不算完全的微内核。而考慮到微内核可以更高效地利用多處理器計算機的處理器核心資源,人們期待着等 Mach 把系統服務都搬到内核之外後可以把運行效率損失降下來。
同時 Mach 在微内核方面小小的嘗試迅速吸引了大批公司與組織的注意,開放軟件基金會(Open Software Foundation,OSF)宣布下一代系統 OSF/1 将基于 Mach 的内核, NeXTSTEP 也将使用 Mach2.5, 甚至 IBM 也打算利用 Mach 構建 Workplace OS。蘋果公司這個時候也出手了,蘋果公司也從此基于 Mach2.5 打造其操作系統内核 XNU,XNU的構成如下圖所示,Mach 作為内核的内環,外環右側是蘋果的驅動框架(I/O Kit),外環左側是 BSD 的系統服務代碼提供 UNIX 兼容的服務層,這三者共同協作向上層提供完整的系統服務。XNU 廣泛地使用在蘋果公司的 OSX、IOS等系統中。
這個時候由于 UNIX 系統廣泛使用帶來的商業利益,此時 BSD 系統開發者與 UNIX 的擁有者 AT&T 陷入了法律大戰,Mach 使用的 BSD 相關代碼有了法律風險。
提升性能的期望和規避法律風險的需求推動着 Mach 3.0 的開發,Mach 3.0 的開發目标主要是為了替換 BSD 系統服務,同時盡量多地将系統服務放到内核之外去運行,成為名副其實的微内核設計。
經過衆多開發者 3 年的努力,Mach 3.0 于 1990 年發布,但是由于在系統服務之間完全使用 IPC 通信,而不是向宏内核那樣直接進行函數調用,即便是多處理器機器上運行也性能損失慘重,Mach 3.0 最多比 UNIX 損失 67% 運行效率,這導緻 Mach 3.0 以及其所代表的第一代微内核設計被看衰。此後斷斷續續有在 Mach 的基礎上對性能進行提升的嘗試,但是均不太理想,至此 Mach 成為了微内核第一代先驅者。
第二代微内核:解決性能問題
第二代微内核的主要代表是 L3 和 L4,以及 QNX 系統使用的 Neutrino 内核。前面第一代的微内核 Mach 由于效率問題雖然失敗了,但是微内核的理念并沒有被放棄,德國的計算機科學家 Jochen Liedtke 認為 Mach 的 IPC 效率低下的原因就是因為 IPC 部分不夠精簡,于是他開發了 L3 和 L4 微内核,對 IPC 部分進行了很徹底的精簡:
1. 内核的 IPC 機制隻是單純地傳遞信息,諸如安全權限檢查這類的代碼都省略掉,省略掉的功能全部由用戶進程自己處理。如此一來 IP C功能部分的代碼執行時間大大縮短;
2. IPC 不使用内存傳遞消息,而使用寄存器傳遞消息,同時限制 IPC 每次傳遞的信息長度,這樣省去了對内存的訪問時間。L4 微内核的 IPC 速度經過測試要比 Mach 快 20 倍,這個令人驚訝的優化效果吸引了衆多的目光,使微内核的研究重新火熱起來。後面 L4 内核又發展出了很多相關系統,比如 Pistachio、L4/MIPS 與 Fiasco 等等,這些内核組成了 L4 的大家族。
第二代微内核的代表除了有 L4 内核,也還有其他微内核比如 Exokernel、Rambler 等,不過商業上最成功的則是目前黑莓公司旗下的 QNX 系統所使用的 Neutrino 内核(QNX,1980年誕生,最初以 QUICK UNIX 為名,後改為 QNX;2004 年 QNX 被 Harman 國際收購;2010 年 Harman 國際下被黑莓收購,QNX 成為黑莓旗下的資産),QNX 主要為高可靠領域提供解決方案,比如交通、能源、醫療、航天航空等。
第三代微内核:主要重視安全問題等
在前面兩代的基礎上,第三代微内核蓬勃發展,許許多多微内核都被開發出來,主要代表有:seL4、Fiasco.OC、NOVA 等。
本來第一代微内核的設計隔離了使内核安全性降低的系統服務,讓系統服務漏洞不會影響内核,進而提高了内核安全性,可以說是關上了破壞系統的門, 但是第二代系統卻又給攻擊者開了個窗戶。
由于第二代微内核在内核中省去了關于安全性檢查等步驟,把所有關于安全檢查功能的實現都交給系統服務自己去實現,這導緻系統服務的通信接口直接暴露給用戶态,任何進程都可能無限制地請求系統服務,系統服務不得不花費額外的代價來區分請求是否合法,容易造成拒絕服務攻擊。
比如正常的文件服務應該是從虛拟文件系統服務->文件系統服務->磁盤驅動服務這個流程來完成的,但是如果攻擊者如果繞過虛拟文件系統服務,直接無限制地請求攻擊者本身沒有權限訪問的文件系統服務,使文件系統服務長期處于滿載狀态,讓其他進程無法通過正常的虛拟文件系統得到文件系統服務。為了增強安全性,且不過分影響性能,人們開始研發第三代微内核。
seL4 是在第二代内核 L4 的基礎上發展而來的。seL4 不僅僅繼承了 L4 内核家族的高性能特性,還具備基于端點(enndpoint)的 IPC 機制。
這種 IPC 機制最大的特點是使用了能力空間的概念,進程在使用 IPC 請求系統服務時必須具備相對應的能力,進程持有不可僞造的令牌來表示擁有請求某種服務的能力。令牌可以被複制,可以被轉移,還可以通過 IPC 進行傳輸。令牌其實是一個指向存在于内核空間内核對象的指針,所以普通進程并不能修改自身以及其他進程的權限分配,但是内核可以對令牌指定的權限進行控制,從而保證了用戶态不能繞過能力空間這個機制對系統服務造成濫用。
seL4 還是第一個完全通過形式化驗證的内核,通俗說形式化驗證就是在數學軟件的幫助下使用數學語言自動化地推導檢查系統的每一個運行狀态。seL4 形式化驗證相關論文。
其他的微内核系統:Fuchsia、Minix
Fuchsia 是 Google 開發的一款全新操作系統,試圖覆蓋手機、平闆甚至筆記本等一系列領域。Google 為該系統配備了 Vulkan 圖形接口、3D 桌面渲染 Scenic、Flutter 應用開發框架,還有一個稱為 zircon 的微内核。
zircon 内核是從高通平台的一個 Bootloader 項目:Little Kernel發展而來。zircon内核屬于微内核設計,隻提供 IPC、進程管理、地址空間管理功能。zircon 區别于以進程或者以文件為核心的設計,zircon 是以内存為核心來設計的,内存在 zircon 中是以對象的方式存在,可以通過 channel 通信機制傳遞虛拟内存對象(Virtual memory object)的句柄,進程拿到句柄後可以把這塊内存映射到自己的空間。
Minix 系統則由荷蘭阿姆斯特丹的 Vrije 大學的 Andrew S.Tanenbaum 教授所開發。
該系統最大的特點是可以故障隔離,自動重啟失敗的服務。
Minix 使用分層設計,最底層的微内核提供中斷處理、進程管理、進程通信等服務,這一層運行在内核态;中間層提供輪回服務(Reincarnation Server)、文件服務、進程管理、X 圖形服務以及驅動等,這一層運行在用戶态,最上層為用戶進程。
其中輪回服務負責在中間層的服務出現崩潰時重啟這些服務,從而保證服務的自我修複。Minix 由于其自我修複特性被英特爾管理引擎(ME)所選用,該管理引擎主要負責管理英特爾芯片的内部模塊。
,