日本av網 匯聚海量最新國內、國際資訊

鴻蒙操作係統用的微內核到底是什麽?

2019-06-27已圍觀 來源:互聯網編輯:日本av網

作者 | RT-Thread

責編 | 伍杏玲

【CSDN 編者按】安卓係統是宏內核,而最近熱議的華為鴻蒙操作係統是微內核。什麽是微內核?微內核是如何發展?其優缺點是什麽呢?一起來看看吧。

背景龐大的 UNIX 家族

計算機技術在二戰後快速發展,構成計算機的主要基本單元從電子管發展到分立晶體管,再到後來的大規模集成電路。隨著計算機技術發展,計算機性能越來越強勁,硬件越來越複雜,人們發現很難去直接管理計算機了,於是人們開始設計軟件用於管理越來越複雜的計算機係統,這些軟件稱作係統級軟件。

從最開始的批處理係統,多道程序係統,分時係統到上世紀 60 年代開始出現通用操作係統,計算機係統層出不窮,直到上世紀 70 年代才出現被大家廣泛接受廣泛使用的通用操作係統。其中最經典的當然就是 UNIX 係統了。

UNIX 係統,1971 年誕生於大名鼎鼎的貝爾實驗室的一台 PDP-11/24 機器上,其後經過不斷發展與傳播,在 80 年代取得了巨大成功,UNIX 被移植到眾多的處理器架構,並在眾多行業得到廣泛使用,甚至成為行業標準影響至今。

UNIX 以及類 UNIX 係統如 Linux 都是典型的宏內核設計,也就是把所有係統服務都放到內核裏,因為係統服務代碼之間存在大量數據交換和大量的服務請求,而在同一個代碼段內進行函數調用(C 語言或跳轉匯編或者機器碼時代是最直接、最高效的方法,在同一片地址空間也方便數據交換,所以這樣的宏內核設計是很自然的。

但是隨著 UNIX 內核功能的拓展文件係統、TCP/IP網絡協議棧、進程管理、內存管理、驅動程序等,UNIX 內核代碼也相應增加了很多,進而在可維護性、穩定性、安全性方麵麵臨一些挑戰。為了試圖解決這些挑戰,人們開始嚐試使用微內核的思想來設計係統內核。

什麽是微內核?

微內核設計的基本思想是簡化內核功能,在內核之外的用戶態盡可能多地實現係統服務,同時加入相互之間的安全保護。內核隻提供最基礎的服務,比如多進程調度、多進程通信(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、ioses等係統中。

這個時候由於 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)所選用,該管理引擎主要負責管理英特爾芯片的內部模塊。

微內核的優缺點

一、優點

  1. 內核安全性提高(模塊內部的 Bug 不影響內核穩定,將黑客利用軟件漏洞造成的破壞限製在單個模塊內部);
  2. 可以多套係統服務共存,相當於同時運行多種操作係統;
  3. 在商業上,微內核可以避免代碼受到一些開源協議的影響,比如 GPL 協議;
  4. 內核精簡,可以進行形式化驗證,利用數學證明內核的安全性;
  1. 通過進程通信的方式交換數據或者調用係統服務,而不是使用係統調用,造成額外的操作係統開銷;
  2. 使用一些頻繁使用的係統服務時,比如網絡收發數據,造成的進程上下文切換對操作係統來說也是一個負擔;
  3. 由於係統服務高度模塊化,係統服務之間存在大量的內存複製;
  4. 對互相之間存在複雜調用關係的係統服務,難以設計通信接口;
  5. 係統服務與內核在地址空間上分離,造成代碼局部性差,降低了 cache 命中率。

聲明:本文係投稿,版權歸作者所有。

5G 沙龍來啦!掃描下方二維碼,加小助手微信,回複“5G”,進群獲取直播鏈接!