'熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?'

"

又一波微內核討論,同時也見到網上太多的言論,甚至把RT-Thread物聯網操作系統歸類到微內核行列。所以重新把這篇科普文章發下,並做部分澄清。

本篇文章是RT-Thread新加入夥伴,俊小哥 對微內核學習後的科普文章,本文是第一篇;還有第二篇《Fuchsia微內核的性能指標情況》,已有初稿,後續在整理完畢後再分享給大家,會詳細給出相同硬件平臺下Fuchsia和Linux的應用性能對比指標。

關於微內核的定義,這裡有一份簡單的描述:內核運行在內核態,只包含基本的多任務調度功能;其他系統服務都運行在用戶態,包括文件系統,網絡協議棧,甚至內存管理,驅動都是一個個獨立的用戶態進程,並相互做內存隔離。應用需要使用系統服務時,都通過IPC發送消息來使用其他用戶態服務。而宏內核,用戶應用是通過系統調用直接來使用系統服務。所以微內核,消息傳遞是基本形態。基於這樣的理解,RT-Thread目前是宏內核,更嚴謹些應該是Unikernel(內核與應用都運行在內核態)。

對於十分碎片化物聯網場景,對其中大部分的海量物聯網節點來說,並不適合使用微內核,因為其中Flash、RAM資源非常緊張(例如Cortex-M架構或其他MCU,普遍在數百kB Flash空間,幾十kB RAM空間),甚至是按照字節方式節省著使用,已經負擔不起內核與應用分離的方式來使用。而微內核中常提及的安全隔離優點,在MCU上也沒有硬件來支撐(沒有MMU,或者MPU能保護的區段數也非常受限)。這也是RT-Thread對這類資源受限設備,始終都維持這樣構架的原因。

——熊大

下面讓我們重溫俊小哥的微內核科普文章:

"

又一波微內核討論,同時也見到網上太多的言論,甚至把RT-Thread物聯網操作系統歸類到微內核行列。所以重新把這篇科普文章發下,並做部分澄清。

本篇文章是RT-Thread新加入夥伴,俊小哥 對微內核學習後的科普文章,本文是第一篇;還有第二篇《Fuchsia微內核的性能指標情況》,已有初稿,後續在整理完畢後再分享給大家,會詳細給出相同硬件平臺下Fuchsia和Linux的應用性能對比指標。

關於微內核的定義,這裡有一份簡單的描述:內核運行在內核態,只包含基本的多任務調度功能;其他系統服務都運行在用戶態,包括文件系統,網絡協議棧,甚至內存管理,驅動都是一個個獨立的用戶態進程,並相互做內存隔離。應用需要使用系統服務時,都通過IPC發送消息來使用其他用戶態服務。而宏內核,用戶應用是通過系統調用直接來使用系統服務。所以微內核,消息傳遞是基本形態。基於這樣的理解,RT-Thread目前是宏內核,更嚴謹些應該是Unikernel(內核與應用都運行在內核態)。

對於十分碎片化物聯網場景,對其中大部分的海量物聯網節點來說,並不適合使用微內核,因為其中Flash、RAM資源非常緊張(例如Cortex-M架構或其他MCU,普遍在數百kB Flash空間,幾十kB RAM空間),甚至是按照字節方式節省著使用,已經負擔不起內核與應用分離的方式來使用。而微內核中常提及的安全隔離優點,在MCU上也沒有硬件來支撐(沒有MMU,或者MPU能保護的區段數也非常受限)。這也是RT-Thread對這類資源受限設備,始終都維持這樣構架的原因。

——熊大

下面讓我們重溫俊小哥的微內核科普文章:

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

什麼是微內核

微內核設計的基本思想是簡化內核功能,在內核之外的用戶態儘可能多地實現系統服務,同時加入相互之間的安全保護。內核只提供最基礎的服務,比如進程調度,進程通信(IPC)等。其中進程通信是作為連接應用與用戶態系統服務的橋樑。

下圖是宏內核與微內核的對比示意圖

"

又一波微內核討論,同時也見到網上太多的言論,甚至把RT-Thread物聯網操作系統歸類到微內核行列。所以重新把這篇科普文章發下,並做部分澄清。

本篇文章是RT-Thread新加入夥伴,俊小哥 對微內核學習後的科普文章,本文是第一篇;還有第二篇《Fuchsia微內核的性能指標情況》,已有初稿,後續在整理完畢後再分享給大家,會詳細給出相同硬件平臺下Fuchsia和Linux的應用性能對比指標。

關於微內核的定義,這裡有一份簡單的描述:內核運行在內核態,只包含基本的多任務調度功能;其他系統服務都運行在用戶態,包括文件系統,網絡協議棧,甚至內存管理,驅動都是一個個獨立的用戶態進程,並相互做內存隔離。應用需要使用系統服務時,都通過IPC發送消息來使用其他用戶態服務。而宏內核,用戶應用是通過系統調用直接來使用系統服務。所以微內核,消息傳遞是基本形態。基於這樣的理解,RT-Thread目前是宏內核,更嚴謹些應該是Unikernel(內核與應用都運行在內核態)。

對於十分碎片化物聯網場景,對其中大部分的海量物聯網節點來說,並不適合使用微內核,因為其中Flash、RAM資源非常緊張(例如Cortex-M架構或其他MCU,普遍在數百kB Flash空間,幾十kB RAM空間),甚至是按照字節方式節省著使用,已經負擔不起內核與應用分離的方式來使用。而微內核中常提及的安全隔離優點,在MCU上也沒有硬件來支撐(沒有MMU,或者MPU能保護的區段數也非常受限)。這也是RT-Thread對這類資源受限設備,始終都維持這樣構架的原因。

——熊大

下面讓我們重溫俊小哥的微內核科普文章:

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

什麼是微內核

微內核設計的基本思想是簡化內核功能,在內核之外的用戶態儘可能多地實現系統服務,同時加入相互之間的安全保護。內核只提供最基礎的服務,比如進程調度,進程通信(IPC)等。其中進程通信是作為連接應用與用戶態系統服務的橋樑。

下圖是宏內核與微內核的對比示意圖

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

上圖左側表示宏內核的架構,宏內核系統相關的服務基本都是放於內核態內核中,例如文件系統,設備驅動,虛擬內存管理,網絡協議棧等;而微內核,則把更多的系統服務(例如文件系統,POSIX服務,網絡協議棧,甚至外設驅動)放到用戶態應用,形成一個個服務,等待其他應用的請求。

而後來,為了在宏內核與微內核之間揚長避短,也發展出了中間的混合內核的形態,部分服務也會放置於內核中。上圖右側表示即是混合內核的架構。

其實微內核與混合內核,混合內核與宏內核之間並無十分明確的界限,一般情況下把最多隻具備IPC(進程通信),進程調度,內存管理功能的內核稱為微內核、把包含所有系統服務的內核稱為宏內核、有少部分系統服務在用戶態或者比微內核多一些系統服務的內核稱為混合內核。

微內核的發展歷史

微內核這個概念從提出開始就在不斷地發展、完善進步之中,到目前為止可以分為三代。

第一代微內核:從無到有

第一代微內核的主要代表是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等系統中。

"

又一波微內核討論,同時也見到網上太多的言論,甚至把RT-Thread物聯網操作系統歸類到微內核行列。所以重新把這篇科普文章發下,並做部分澄清。

本篇文章是RT-Thread新加入夥伴,俊小哥 對微內核學習後的科普文章,本文是第一篇;還有第二篇《Fuchsia微內核的性能指標情況》,已有初稿,後續在整理完畢後再分享給大家,會詳細給出相同硬件平臺下Fuchsia和Linux的應用性能對比指標。

關於微內核的定義,這裡有一份簡單的描述:內核運行在內核態,只包含基本的多任務調度功能;其他系統服務都運行在用戶態,包括文件系統,網絡協議棧,甚至內存管理,驅動都是一個個獨立的用戶態進程,並相互做內存隔離。應用需要使用系統服務時,都通過IPC發送消息來使用其他用戶態服務。而宏內核,用戶應用是通過系統調用直接來使用系統服務。所以微內核,消息傳遞是基本形態。基於這樣的理解,RT-Thread目前是宏內核,更嚴謹些應該是Unikernel(內核與應用都運行在內核態)。

對於十分碎片化物聯網場景,對其中大部分的海量物聯網節點來說,並不適合使用微內核,因為其中Flash、RAM資源非常緊張(例如Cortex-M架構或其他MCU,普遍在數百kB Flash空間,幾十kB RAM空間),甚至是按照字節方式節省著使用,已經負擔不起內核與應用分離的方式來使用。而微內核中常提及的安全隔離優點,在MCU上也沒有硬件來支撐(沒有MMU,或者MPU能保護的區段數也非常受限)。這也是RT-Thread對這類資源受限設備,始終都維持這樣構架的原因。

——熊大

下面讓我們重溫俊小哥的微內核科普文章:

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

什麼是微內核

微內核設計的基本思想是簡化內核功能,在內核之外的用戶態儘可能多地實現系統服務,同時加入相互之間的安全保護。內核只提供最基礎的服務,比如進程調度,進程通信(IPC)等。其中進程通信是作為連接應用與用戶態系統服務的橋樑。

下圖是宏內核與微內核的對比示意圖

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

上圖左側表示宏內核的架構,宏內核系統相關的服務基本都是放於內核態內核中,例如文件系統,設備驅動,虛擬內存管理,網絡協議棧等;而微內核,則把更多的系統服務(例如文件系統,POSIX服務,網絡協議棧,甚至外設驅動)放到用戶態應用,形成一個個服務,等待其他應用的請求。

而後來,為了在宏內核與微內核之間揚長避短,也發展出了中間的混合內核的形態,部分服務也會放置於內核中。上圖右側表示即是混合內核的架構。

其實微內核與混合內核,混合內核與宏內核之間並無十分明確的界限,一般情況下把最多隻具備IPC(進程通信),進程調度,內存管理功能的內核稱為微內核、把包含所有系統服務的內核稱為宏內核、有少部分系統服務在用戶態或者比微內核多一些系統服務的內核稱為混合內核。

微內核的發展歷史

微內核這個概念從提出開始就在不斷地發展、完善進步之中,到目前為止可以分為三代。

第一代微內核:從無到有

第一代微內核的主要代表是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等系統中。

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

第二代微內核:解決性能問題

第二代微內核的主要代表是L3和L4,以及QNX系統使用的Neutrino內核。前面第一代的微內核Mach由於效率問題雖然失敗了,但是微內核的理念並沒有被放棄,德國的計算機科學家Jochen Liedtke認為Mach的IPC效率低下的原因就是因為IPC部分不夠精簡,於是他開發了L3和L4微內核,對IPC部分進行了很徹底的精簡:1. 內核的IPC機制只是單純地傳遞信息,諸如安全權限檢查這類的代碼都省略掉,省略掉的功能全部由用戶進程自己處理。如此一來IPC功能部分的代碼執行時間大大縮短;2. IPC不使用內存傳遞消息,而使用寄存器傳遞消息,同時限制IPC每次傳遞的信息長度,這樣省去了對內存的訪問時間。L4微內核的IPC速度經過測試要比Mach快20倍,這個令人驚訝的優化效果吸引了眾多的目光,使微內核的研究重新火熱起來。後面L4內核又發展出了很多相關係統,比如Pistachio,L4/MIPS,與Fiasco等等,這些內核組成了L4的大家族。

"

又一波微內核討論,同時也見到網上太多的言論,甚至把RT-Thread物聯網操作系統歸類到微內核行列。所以重新把這篇科普文章發下,並做部分澄清。

本篇文章是RT-Thread新加入夥伴,俊小哥 對微內核學習後的科普文章,本文是第一篇;還有第二篇《Fuchsia微內核的性能指標情況》,已有初稿,後續在整理完畢後再分享給大家,會詳細給出相同硬件平臺下Fuchsia和Linux的應用性能對比指標。

關於微內核的定義,這裡有一份簡單的描述:內核運行在內核態,只包含基本的多任務調度功能;其他系統服務都運行在用戶態,包括文件系統,網絡協議棧,甚至內存管理,驅動都是一個個獨立的用戶態進程,並相互做內存隔離。應用需要使用系統服務時,都通過IPC發送消息來使用其他用戶態服務。而宏內核,用戶應用是通過系統調用直接來使用系統服務。所以微內核,消息傳遞是基本形態。基於這樣的理解,RT-Thread目前是宏內核,更嚴謹些應該是Unikernel(內核與應用都運行在內核態)。

對於十分碎片化物聯網場景,對其中大部分的海量物聯網節點來說,並不適合使用微內核,因為其中Flash、RAM資源非常緊張(例如Cortex-M架構或其他MCU,普遍在數百kB Flash空間,幾十kB RAM空間),甚至是按照字節方式節省著使用,已經負擔不起內核與應用分離的方式來使用。而微內核中常提及的安全隔離優點,在MCU上也沒有硬件來支撐(沒有MMU,或者MPU能保護的區段數也非常受限)。這也是RT-Thread對這類資源受限設備,始終都維持這樣構架的原因。

——熊大

下面讓我們重溫俊小哥的微內核科普文章:

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

什麼是微內核

微內核設計的基本思想是簡化內核功能,在內核之外的用戶態儘可能多地實現系統服務,同時加入相互之間的安全保護。內核只提供最基礎的服務,比如進程調度,進程通信(IPC)等。其中進程通信是作為連接應用與用戶態系統服務的橋樑。

下圖是宏內核與微內核的對比示意圖

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

上圖左側表示宏內核的架構,宏內核系統相關的服務基本都是放於內核態內核中,例如文件系統,設備驅動,虛擬內存管理,網絡協議棧等;而微內核,則把更多的系統服務(例如文件系統,POSIX服務,網絡協議棧,甚至外設驅動)放到用戶態應用,形成一個個服務,等待其他應用的請求。

而後來,為了在宏內核與微內核之間揚長避短,也發展出了中間的混合內核的形態,部分服務也會放置於內核中。上圖右側表示即是混合內核的架構。

其實微內核與混合內核,混合內核與宏內核之間並無十分明確的界限,一般情況下把最多隻具備IPC(進程通信),進程調度,內存管理功能的內核稱為微內核、把包含所有系統服務的內核稱為宏內核、有少部分系統服務在用戶態或者比微內核多一些系統服務的內核稱為混合內核。

微內核的發展歷史

微內核這個概念從提出開始就在不斷地發展、完善進步之中,到目前為止可以分為三代。

第一代微內核:從無到有

第一代微內核的主要代表是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等系統中。

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

第二代微內核:解決性能問題

第二代微內核的主要代表是L3和L4,以及QNX系統使用的Neutrino內核。前面第一代的微內核Mach由於效率問題雖然失敗了,但是微內核的理念並沒有被放棄,德國的計算機科學家Jochen Liedtke認為Mach的IPC效率低下的原因就是因為IPC部分不夠精簡,於是他開發了L3和L4微內核,對IPC部分進行了很徹底的精簡:1. 內核的IPC機制只是單純地傳遞信息,諸如安全權限檢查這類的代碼都省略掉,省略掉的功能全部由用戶進程自己處理。如此一來IPC功能部分的代碼執行時間大大縮短;2. IPC不使用內存傳遞消息,而使用寄存器傳遞消息,同時限制IPC每次傳遞的信息長度,這樣省去了對內存的訪問時間。L4微內核的IPC速度經過測試要比Mach快20倍,這個令人驚訝的優化效果吸引了眾多的目光,使微內核的研究重新火熱起來。後面L4內核又發展出了很多相關係統,比如Pistachio,L4/MIPS,與Fiasco等等,這些內核組成了L4的大家族。

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

第二代微內核的代表除了有L4內核,也還有其他微內核比如Exokernel,Rambler,不過商業上最成功的則是目前黑莓公司旗下的QNX系統所使用的Neutrino內核(QNX,1980年時最早以QUICK UNIX誕生;2004年QNX被Harman國際收購;2010年被黑莓收購Harman國際下的QNX資產),QNX主要為高可靠領域提供解決方案,比如交通,能源,醫療,航天航空等。

"

又一波微內核討論,同時也見到網上太多的言論,甚至把RT-Thread物聯網操作系統歸類到微內核行列。所以重新把這篇科普文章發下,並做部分澄清。

本篇文章是RT-Thread新加入夥伴,俊小哥 對微內核學習後的科普文章,本文是第一篇;還有第二篇《Fuchsia微內核的性能指標情況》,已有初稿,後續在整理完畢後再分享給大家,會詳細給出相同硬件平臺下Fuchsia和Linux的應用性能對比指標。

關於微內核的定義,這裡有一份簡單的描述:內核運行在內核態,只包含基本的多任務調度功能;其他系統服務都運行在用戶態,包括文件系統,網絡協議棧,甚至內存管理,驅動都是一個個獨立的用戶態進程,並相互做內存隔離。應用需要使用系統服務時,都通過IPC發送消息來使用其他用戶態服務。而宏內核,用戶應用是通過系統調用直接來使用系統服務。所以微內核,消息傳遞是基本形態。基於這樣的理解,RT-Thread目前是宏內核,更嚴謹些應該是Unikernel(內核與應用都運行在內核態)。

對於十分碎片化物聯網場景,對其中大部分的海量物聯網節點來說,並不適合使用微內核,因為其中Flash、RAM資源非常緊張(例如Cortex-M架構或其他MCU,普遍在數百kB Flash空間,幾十kB RAM空間),甚至是按照字節方式節省著使用,已經負擔不起內核與應用分離的方式來使用。而微內核中常提及的安全隔離優點,在MCU上也沒有硬件來支撐(沒有MMU,或者MPU能保護的區段數也非常受限)。這也是RT-Thread對這類資源受限設備,始終都維持這樣構架的原因。

——熊大

下面讓我們重溫俊小哥的微內核科普文章:

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

什麼是微內核

微內核設計的基本思想是簡化內核功能,在內核之外的用戶態儘可能多地實現系統服務,同時加入相互之間的安全保護。內核只提供最基礎的服務,比如進程調度,進程通信(IPC)等。其中進程通信是作為連接應用與用戶態系統服務的橋樑。

下圖是宏內核與微內核的對比示意圖

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

上圖左側表示宏內核的架構,宏內核系統相關的服務基本都是放於內核態內核中,例如文件系統,設備驅動,虛擬內存管理,網絡協議棧等;而微內核,則把更多的系統服務(例如文件系統,POSIX服務,網絡協議棧,甚至外設驅動)放到用戶態應用,形成一個個服務,等待其他應用的請求。

而後來,為了在宏內核與微內核之間揚長避短,也發展出了中間的混合內核的形態,部分服務也會放置於內核中。上圖右側表示即是混合內核的架構。

其實微內核與混合內核,混合內核與宏內核之間並無十分明確的界限,一般情況下把最多隻具備IPC(進程通信),進程調度,內存管理功能的內核稱為微內核、把包含所有系統服務的內核稱為宏內核、有少部分系統服務在用戶態或者比微內核多一些系統服務的內核稱為混合內核。

微內核的發展歷史

微內核這個概念從提出開始就在不斷地發展、完善進步之中,到目前為止可以分為三代。

第一代微內核:從無到有

第一代微內核的主要代表是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等系統中。

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

第二代微內核:解決性能問題

第二代微內核的主要代表是L3和L4,以及QNX系統使用的Neutrino內核。前面第一代的微內核Mach由於效率問題雖然失敗了,但是微內核的理念並沒有被放棄,德國的計算機科學家Jochen Liedtke認為Mach的IPC效率低下的原因就是因為IPC部分不夠精簡,於是他開發了L3和L4微內核,對IPC部分進行了很徹底的精簡:1. 內核的IPC機制只是單純地傳遞信息,諸如安全權限檢查這類的代碼都省略掉,省略掉的功能全部由用戶進程自己處理。如此一來IPC功能部分的代碼執行時間大大縮短;2. IPC不使用內存傳遞消息,而使用寄存器傳遞消息,同時限制IPC每次傳遞的信息長度,這樣省去了對內存的訪問時間。L4微內核的IPC速度經過測試要比Mach快20倍,這個令人驚訝的優化效果吸引了眾多的目光,使微內核的研究重新火熱起來。後面L4內核又發展出了很多相關係統,比如Pistachio,L4/MIPS,與Fiasco等等,這些內核組成了L4的大家族。

熊大微評微內核|華為“鴻蒙”所涉及的微內核究竟是什麼?

第二代微內核的代表除了有L4內核,也還有其他微內核比如Exokernel,Rambler,不過商業上最成功的則是目前黑莓公司旗下的QNX系統所使用的Neutrino內核(QNX,1980年時最早以QUICK UNIX誕生;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)所選用,該管理引擎主要負責管理英特爾芯片的內部模塊。

微內核的優缺點

優點
  • 系統服務模塊化,可移植性高;

  • 內核安全性提高(模塊內部的bug不影響內核穩定,將黑客利用軟件漏洞造成的破壞限制在單個模塊內部);

  • 可以多套系統服務共存,相當於同時運行多種操作系統;

  • 穩定統一的接口(可以獨立維護私有驅動以及服務,不需要跟內核源碼綁定);

  • 在商業上,微內核可以避免代碼受到一些開源協議的影響,比如GPL協議。

  • 內核精簡,可以進行形式化驗正,利用數學證明內核的安全性;

  • 數學可證明的實時性;

  • 非常適合多處理器系統設計,在多處理器核心計算機上,互相依賴的系統服務可以同時運行;

缺點
  • 通過進程通信的方式交換數據或者調用系統服務,而不是使用系統調用,造成額外的操作系統開銷。

  • 使用一些頻繁使用的系統服務時,比如網絡收發數據,造成的進程上下文切換對操作系統來說也是一個負擔。

  • 由於系統服務高度模塊化,系統服務之間存在大量的內存複製。

  • 對互相之間存在複雜調用關係的系統服務,難以設計通信接口。

  • 系統服務與內核在地址空間上分離,造成代碼局部性差,降低了cache命中率。

"

相關推薦

推薦中...