QNX
是一個分佈式、可擴展、遵從開放系統POSIX API
規範的類Unix
硬實時操作系統。
QNX
爲微內核的架構,微內核只提供進程調度、進程間通信、底層網絡通信和中斷處理四種服務。驅動程序、協議棧、文件系統、應用程序等都在微內核之外內存受保護的安全的用戶空間內運行,組件之間能避免相互影響,在遇到故障時也能重新啓動。
儘管 QNX Neutrino 具有明顯的非 UNIX 架構,但它實現了標準的 POSIXAPI。通過採用微內核架構,操作系統以一種可以輕鬆縮小實時嵌入式系統的規模或根據需要逐步擴大規模的形式提供此 API。
QNX Neutrino通過兩個基本原則,模塊化和簡潔性實現了其獨特的效率:
- 微內核架構
- 基於消息的進程間通信
如下圖所示,真正的微內核提供完整的內存保護,不僅適用於用戶應用程序,還適用於 OS 組件(設備驅動程序,文件系統等):
針對內存保護,有以下幾種情況:
- 不提供內存保護:所有程序位於同一個地址空間,應用程序可以訪問所有空間,效率較高,但是程序指針錯誤可能造成內核崩潰,典型的比如Nuttx平板模式。
圖 1:傳統管理沒有提供內存保護。
- 單內核OS提供部分內存保護:用戶層和系統層進行了隔離,內核和各種驅動、協議棧在同一個地址空間,應用程序在單獨空間。內核模塊處於一個保護空間,效率較高,應用程序無法訪問,系統的穩定性也得到提高。由於內核模塊處於保護空間,調試會比較困難,比如Linux系統。
圖 2:在宏內核(“單內核”)操作系統中,系統進程沒有保護。
- 微內核OS提供完整的內存保護:內核處於一個被保護的地址空間,驅動程序、網絡協議及應用程序等處於程序空間中。
圖 3:微內核提供完整的內存保護。
Tips -> 宏內核(“單內核”)與微內核的差異
操作系統內核的幾個重要的特點:
內核是操作系統的核心部分,它管理着系統的各種資源
內核可以看成連接應用程序和硬件的一座橋樑,是直接運行在硬件上的最基礎的軟件實體
在一些簡單的硬件設備上可以沒有內核或操作系統而直接運行程序,比方單片機等。這些設備通常只是用於特定的場合,也通常功能比較單一。而對於一般計算機來說操作系統是必不可少的。對不同的操作系統,其內核實現也是有所區別的。
目前從內核架構來劃分,可分爲微內核(Micro Kernel)和宏內核(Monolithic Kernel),“宏內核”這個翻譯其實不是很好,翻譯成“單內核”事實上更好一點。
對於微內核,用戶服務和內核服務分別運行在不同的地址空間中;對於宏內核不管是用戶服務還是內核服務事實上都是內核在統一管理,它們是運行在同一地址空間中的。
我們需要好好理解第5點,也就是用戶服務和內核服務運行的地址空間的問題。大家都知道Linux採用的是宏內核,但是它也區分內核空間和用戶空間,那不是有歧義了嗎?我們來看一張圖。
對於Linux來說,不管是應用還是內核都是由內存管理單元來做統一的內存管理的,用戶空間的程序確實不能訪問內核空間,但是對於內核來說,3GB-4GB的線性地址空間對整個內核都是共用的,同時內核中的VFS、System Call等模塊被劃分到內核中,它們之間的地址空間是相同的,這裏的用戶服務按照我的理解就是這幾個內核模塊所需要的報備,如上圖所示。
我們來列張表來對比一下微內核和宏內核的具體區別:
微內核 宏內核 基本概念 用戶服務和內核服務運行在不同的地址空間中 用戶服務和內核服務運行在相同的地址空間中 Size 比較小 比微內大 執行速度 慢 快 安全性 單個服務崩潰不影響全局 單個服務崩潰往往意味着整個系統崩潰 代碼開發 需要開發的代碼量打 平臺提供的代碼多,相對需要開發的代碼量少 系統 QNX, Symbian, L4Linux, Mac OS X, etc. Linux, BSDs (FreeBSD, OpenBSD), Microsoft Windows, etc. 微內核:
內核管理着所有的系統資源,在微內核中用戶服務和內核服務在不同的地址空間中實現。在應用程序和硬件的通信中,內核進程和內存管理的極小的服務,而客戶端程序和運行在用戶空間的服務通過消息的傳遞來建立通信,它們之間不會有直接的交互,這樣一來,微內核中的執行速度相對就比較慢了,這是微內核架構的一個缺點。
在內核架構中,用戶服務是獨立於內核服務的,因此任何用戶服務崩潰都不會影響到內核服務,這就加強了操作系統的健壯性,這是微內核的優勢所在。另一點,微內核的擴展性強,添加一個功能,只需要建立一個新的服務到用戶空間當中,而內核空間不需要任何的修改。因此,微內核可移植性強、安全並且易於擴展。
宏內核:
宏內核同樣管理着用戶程序和硬件之間的系統資源,但是和微內核不一樣的是,在宏內核架構中,用戶服務和內核服務在同一空間中實現。具體一點,就是內核可以代表內核進程運行代碼,就是通常的內核進程;當用戶進程經過系統調用或者中斷進入到內核態時,內核也可以代表它運行代碼。這樣一來,宏內核需要管理的資源多於微內核,其大小就相對大一些了。
在宏內核架構當中,內核管理着CPU調度,內存管理,文件管理和系統調用等各模塊的的工作,由於用戶服務和內核服務被實現在同一空間中,這樣在執行速度上要比微內核快。然而,宏內核的劣勢也是顯而易見的,那就是當內核中的某個服務崩潰了,整個內核也會崩潰。另一點,想要在內核中添加新的功能就意味着內核中的各個模塊需要做相應的修改,因此其擴展性很弱。
操作系統可以視爲一個進程團隊
QNX Neutrino 實時操作系統由一個管理一組協作進程的小型微內核組成。
QNX Neutrino 扮演一種“軟件總線”角色,可讓您在需要時動態插入/拔出 OS 模塊。
一個真正的內核
內核是任何操作系統的核心。在某些系統中,“內核”包含許多功能,無論從哪個角度來看,它都是整個操作系統!
但QNX的微內核確實是一個內核。首先,就像實時執行者的內核一樣,它非常小。其次,它只致力於一些基本服務:
•通過 POSIX 線程創建原語進行線程服務(thread services)
•通過 POSIX 信號原語提供信號服務(signal services)
•消息傳遞服務(message-passing services)-微內核處理整個系統中所有線程之間所有消息的路由。
•通過 POSIX 線程同步原語的同步服務(synchronization services)。
•調度服務(scheduling services)-微內核使用各種 POSIX 實時調度策略調度線程以執行。
•定時器服務(timer services)-微內核提供豐富的 POSIX 定時器服務。
•流程管理服務(process management services)-微內核和流程管理器共同組成一個單元(稱爲
procnto
)。進程管理器部分負責管理進程,內存和路徑名空間。
與線程不同,微內核本身永遠不會被安排執行。處理器僅在顯式內核調用,異常或響應硬件中斷的結果下在微內核中執行代碼。
系統進程
除那些強制性微內核/進程管理器模塊(procnto
)提供的服務外,所有 OS 服務都通過標準進程來處理。
配置豐富的系統可能包括以下內容:
•文件系統管理員
•角色設備管理員
•本地網絡管理員
•TCP/IP
系統進程與用戶編寫的進程
系統進程基本上與任何用戶編寫的程序無法區分-它們使用相同公共 API 和內核服務給任意(適當特權的)用戶進程。正是這種架構爲QNX Neutrino RTOS 提供了無與倫比的可擴展性。由於大多數OS服務都是由標準系統進程提供的,因此增加操作系統本身非常簡單:只需編寫新程序即可提供新的OS服務。實際上,操作系統和應用程序之間的界限可能變得非常模糊。系統服務和應用程序之間唯一真正的區別是OS服務爲客戶端管理資源。
設備驅動
設備驅動程序允許 OS 和應用程序以通用方式使用底層硬件(例如,磁盤驅動器,網絡接口)。雖然大多數操作系統要求設備驅動程序與操作系統本身緊密綁定,但 QNX Neutrino 的設備驅動程序可以作爲標準進程啓動和停止。 因此,添加設備驅動程序不會影響操作系統的任何其他部分—驅動程序可以像任何其他應用程序一樣開發和調試。
參考文獻:
System Architecture - The Philosophy of the QNX Neutrino RTOS