系統(tǒng)簡介
QNX是一個分布式、可擴(kuò)展、遵從POSIX規(guī)范的類Unix硬實(shí)時操作系統(tǒng)。
QNX為微內(nèi)核的架構(gòu),微內(nèi)核只提供進(jìn)程調(diào)度、進(jìn)程間通信、底層網(wǎng)絡(luò)通信和中斷處理四種服務(wù)。驅(qū)動程序、協(xié)議棧、文件系統(tǒng)、應(yīng)用程序等都在微內(nèi)核之外內(nèi)存受保護(hù)的安全的用戶空間內(nèi)運(yùn)行,組件之間能避免相互影響,在遇到故障時也能重啟。
QNX系統(tǒng)架構(gòu)圖
QNX Neutrino通過兩個基本的原則,達(dá)到了獨(dú)一無二的有效性、模塊化和簡潔性:
微內(nèi)核架構(gòu)
基于消息的進(jìn)程間通信
微內(nèi)核架構(gòu)
在微內(nèi)核OS中,內(nèi)核精簡,只實(shí)現(xiàn)OS最基本的核心部分并提供相應(yīng)的服務(wù),基于這些服務(wù)可以擴(kuò)展完整的OS功能。設(shè)計一個微內(nèi)核OS的目標(biāo)是模塊化,而并非最小化。
微內(nèi)核提供的IPC服務(wù)用于將操作系統(tǒng)本身“粘合”在一起,這些服務(wù)的性能和靈活性決定了系統(tǒng)最終的性能??梢允褂肐PC服務(wù)和其他附加的服務(wù)來擴(kuò)展內(nèi)核的功能。 用戶編寫的進(jìn)程既可以作為應(yīng)用程序,也可以作為底層OS功能來支持行業(yè)特定的應(yīng)用程序。 操作系統(tǒng)本身變得“開放”并且易于擴(kuò)展。 此外,用戶編寫的OS擴(kuò)展也不會影響核心OS的基本可靠性。
QNX內(nèi)存保護(hù)
對許多依照POSIX1.003.1標(biāo)準(zhǔn)實(shí)現(xiàn)的實(shí)時執(zhí)行程序來說,它們的運(yùn)行時環(huán)境通常是單進(jìn)程、多線程的模型,線程之間沒法做到內(nèi)存保護(hù),而這樣的環(huán)境只是POSIX假設(shè)的多進(jìn)程模型的一個子集,它不支持fork()函數(shù)。相比之下,QNX Neutrino利用MMU,在受保護(hù)的環(huán)境中實(shí)現(xiàn)了POSIX的線程模型。
一個真正的微內(nèi)核會提供完整的內(nèi)存保護(hù),這個不僅適用于用戶程序,也適用于OS組件,比如驅(qū)動程序、文件系統(tǒng)等。
針對內(nèi)存保護(hù),有以下幾種情況:
不提供內(nèi)存保護(hù):所有程序位于同一個地址空間,應(yīng)用程序可以訪問所有空間,效率較高,但是程序指針錯誤可能造成內(nèi)核崩潰,典型的比如Nuttx平板模式。
平板模式
單內(nèi)核OS提供部分內(nèi)存保護(hù):用戶層和系統(tǒng)層進(jìn)行了隔離,內(nèi)核和各種驅(qū)動、協(xié)議棧在同一個地址空間,應(yīng)用程序在單獨(dú)空間。內(nèi)核模塊處于一個保護(hù)空間,效率較高,應(yīng)用程序無法訪問,系統(tǒng)的穩(wěn)定性也得到提高。由于內(nèi)核模塊處于保護(hù)空間,調(diào)試會比較困難。比如Linux系統(tǒng)。
單內(nèi)核模式
微內(nèi)核OS提供完整的內(nèi)存保護(hù):內(nèi)核處于一個被保護(hù)的地址空間,驅(qū)動程序、網(wǎng)絡(luò)協(xié)議及應(yīng)用程序等處于程序空間中。
微內(nèi)核模式
QNX Neutrino微內(nèi)核
內(nèi)核是操作系統(tǒng)的核心,在有些操作系統(tǒng)中,內(nèi)核包含了很多功能,導(dǎo)致內(nèi)核像是個完整的操作系統(tǒng)。而QNX的微內(nèi)核是一個真正的內(nèi)核,它非常小,并且只提供基本的服務(wù):
通過POSIX線程創(chuàng)建原語提供的線程服務(wù);
通過POSIX信號原語提供的信號服務(wù);
消息傳遞服務(wù),微內(nèi)核處理整個系統(tǒng)中所有線程之間的消息路由;
通過POSIX線程同步原語提供的同步服務(wù);
調(diào)度服務(wù),微內(nèi)核使用各種POSIX實(shí)時調(diào)度策略來調(diào)度線程執(zhí)行;
定時器服務(wù),微內(nèi)核提供了豐富的POSIX定時器服務(wù)集;
進(jìn)程管理服務(wù),微內(nèi)核與進(jìn)程管理器一起組成一個叫procnto的單元,進(jìn)程管理器部分負(fù)責(zé)管理進(jìn)程、內(nèi)存,還有路徑名空間。
與線程不同,微內(nèi)核本身不會被調(diào)度執(zhí)行。處理器只在微內(nèi)核中執(zhí)行系統(tǒng)調(diào)用、異常、硬件中斷響應(yīng)等。
QNX Neutrino操作系統(tǒng)的微內(nèi)核,管理一組協(xié)作的進(jìn)程,如下圖所示,這種結(jié)構(gòu)不是一種層級的組織,更像是一個團(tuán)隊(duì),因?yàn)椴煌倪M(jìn)程可以通過內(nèi)核來協(xié)調(diào)交互。QNX Neutrino充當(dāng)一個“軟件總線”的角色,可以在需要的時候動態(tài)的插入和移除系統(tǒng)模塊。
QNX Neutrino架構(gòu)
進(jìn)程及進(jìn)程間通信
除了procnto單元提供的服務(wù)外,所有的系統(tǒng)服務(wù)都是通過標(biāo)準(zhǔn)的進(jìn)程來處理的。一個配置豐富的QNX系統(tǒng)應(yīng)該包括以下功能:
文件系統(tǒng)管理器
字符設(shè)備管理器
圖形用戶界面
本地網(wǎng)絡(luò)管理器
TCP/IP
系統(tǒng)進(jìn)程 vs 用戶進(jìn)程
系統(tǒng)進(jìn)程與任何用戶編寫的進(jìn)程本質(zhì)上是不可區(qū)分的,它們使用相同的公共API和內(nèi)核服務(wù)。正是這種架構(gòu)也讓QNX具備了無與倫比的可擴(kuò)展性。由于大多數(shù)的操作系統(tǒng)服務(wù)由標(biāo)準(zhǔn)的系統(tǒng)進(jìn)程提供,因此增強(qiáng)操作系統(tǒng)本身變得非常簡單:只需編寫新的程序來提供新的操作系統(tǒng)服務(wù)。實(shí)際上,操作系統(tǒng)和應(yīng)用程序之間的界限可能會變得非常模糊,系統(tǒng)服務(wù)和應(yīng)用程序之間唯一真正的區(qū)別是操作系統(tǒng)服務(wù)為客戶管理資源。
假如你需要寫一個數(shù)據(jù)庫的服務(wù)器,這樣一個進(jìn)程怎么分類?
正如文件系統(tǒng)接受請求(通過消息)來打開文件和讀寫數(shù)據(jù)一樣,數(shù)據(jù)庫服務(wù)器也需要接受請求,盡管數(shù)據(jù)庫服務(wù)器的請求可能更復(fù)雜,但是兩者非常相似,需要提供API(由消息實(shí)現(xiàn))給客戶端進(jìn)行資源訪問。此外,它們都是獨(dú)立的進(jìn)程,可以由終端用戶來編寫,并且根據(jù)需要來進(jìn)行啟動和停止。
數(shù)據(jù)庫服務(wù)器可能在某個任務(wù)中充當(dāng)系統(tǒng)進(jìn)程,而在另外的任務(wù)中充當(dāng)應(yīng)用戶進(jìn)程,但是這都不重要,重要的是QNX操作系統(tǒng)可以在不修改操作系統(tǒng)本身的標(biāo)準(zhǔn)組件的情況下,允許用戶實(shí)現(xiàn)這樣的進(jìn)程,對于嵌入式開發(fā)人員來說,提供了很大的靈活性。
設(shè)備驅(qū)動程序允許操作系統(tǒng)和應(yīng)用程序以通用的方式去訪問低層的硬件(例如磁盤設(shè)備驅(qū)動器、網(wǎng)絡(luò)接口)。雖然大多數(shù)的OS要求設(shè)備驅(qū)動程序與OS本身緊密綁定,但是QNX Neutrino的驅(qū)動程序能被當(dāng)成一個標(biāo)準(zhǔn)的進(jìn)程被啟動和停止。因此,添加設(shè)備驅(qū)動程序不會影響OS的其他部分,可以像應(yīng)用程序一樣開發(fā)和調(diào)試驅(qū)動。
進(jìn)程間通信
IPC(Interprocess Communication)進(jìn)程間通信,是將應(yīng)用程序設(shè)計成一組進(jìn)程的關(guān)鍵,確保每個進(jìn)程處理整體中的某一部分。QNX是第一個將消息傳遞作為IPC基本手段的商業(yè)操作系統(tǒng),操作系統(tǒng)的強(qiáng)大、簡單和優(yōu)雅,在很大程度上歸功于消息傳遞在整個系統(tǒng)中的完整集成。
在QNX Neutrino中,消息是從一個進(jìn)程傳遞給另一個進(jìn)程的字節(jié)包,消息的內(nèi)容只對發(fā)送者和接收者有意義。
消息傳遞不僅允許進(jìn)程相互傳遞數(shù)據(jù),而且還提供了一種同步多個進(jìn)程執(zhí)行的方法。當(dāng)進(jìn)程發(fā)送、接收、回復(fù)消息時,它們會經(jīng)歷各種“狀態(tài)變化”,這些“狀態(tài)變化”,會影響它們的執(zhí)行時間和時間長度。了解它們的優(yōu)先級和狀態(tài),微內(nèi)核可以盡可能有效的調(diào)度所有進(jìn)程,最大限度來利用CPU資源。消息傳遞在整個系統(tǒng)中不斷的起作用。
實(shí)時或關(guān)鍵任務(wù),通常需要一套可靠的IPC機(jī)制,因?yàn)榻M成這些任務(wù)的進(jìn)程之間關(guān)聯(lián)很緊密。QNX Neutrino的消息傳遞設(shè)計所強(qiáng)加的規(guī)則,給應(yīng)用程序帶來了秩序和可靠性。