QNX簡介

系統(tǒng)簡介

QNX是一個分布式、可擴展、遵從POSIX規(guī)范的類Unix硬實時操作系統(tǒng)。
QNX為微內核的架構,微內核只提供進程調度、進程間通信、底層網(wǎng)絡通信和中斷處理四種服務。驅動程序、協(xié)議棧、文件系統(tǒng)、應用程序等都在微內核之外內存受保護的安全的用戶空間內運行,組件之間能避免相互影響,在遇到故障時也能重啟。

QNX系統(tǒng)架構圖

QNX Neutrino通過兩個基本的原則,達到了獨一無二的有效性、模塊化和簡潔性:

  • 微內核架構
  • 基于消息的進程間通信

微內核架構

在微內核OS中,內核精簡,只實現(xiàn)OS最基本的核心部分并提供相應的服務,基于這些服務可以擴展完整的OS功能。設計一個微內核OS的目標是模塊化,而并非最小化。
微內核提供的IPC服務用于將操作系統(tǒng)本身“粘合”在一起,這些服務的性能和靈活性決定了系統(tǒng)最終的性能。可以使用IPC服務和其他附加的服務來擴展內核的功能。 用戶編寫的進程既可以作為應用程序,也可以作為底層OS功能來支持行業(yè)特定的應用程序。 操作系統(tǒng)本身變得“開放”并且易于擴展。 此外,用戶編寫的OS擴展也不會影響核心OS的基本可靠性。

QNX內存保護

對許多依照POSIX1.003.1標準實現(xiàn)的實時執(zhí)行程序來說,它們的運行時環(huán)境通常是單進程、多線程的模型,線程之間沒法做到內存保護,而這樣的環(huán)境只是POSIX假設的多進程模型的一個子集,它不支持fork()函數(shù)。相比之下,QNX Neutrino利用MMU,在受保護的環(huán)境中實現(xiàn)了POSIX的線程模型。
一個真正的微內核會提供完整的內存保護,這個不僅適用于用戶程序,也適用于OS組件,比如驅動程序、文件系統(tǒng)等。

針對內存保護,有以下幾種情況:

  • 不提供內存保護:所有程序位于同一個地址空間,應用程序可以訪問所有空間,效率較高,但是程序指針錯誤可能造成內核崩潰,典型的比如Nuttx平板模式。


    平板模式
  • 單內核OS提供部分內存保護:用戶層和系統(tǒng)層進行了隔離,內核和各種驅動、協(xié)議棧在同一個地址空間,應用程序在單獨空間。內核模塊處于一個保護空間,效率較高,應用程序無法訪問,系統(tǒng)的穩(wěn)定性也得到提高。由于內核模塊處于保護空間,調試會比較困難。比如Linux系統(tǒng)。


    單內核模式
  • 微內核OS提供完整的內存保護:內核處于一個被保護的地址空間,驅動程序、網(wǎng)絡協(xié)議及應用程序等處于程序空間中。


    微內核模式

QNX Neutrino微內核

內核是操作系統(tǒng)的核心,在有些操作系統(tǒng)中,內核包含了很多功能,導致內核像是個完整的操作系統(tǒng)。而QNX的微內核是一個真正的內核,它非常小,并且只提供基本的服務:

  • 通過POSIX線程創(chuàng)建原語提供的線程服務;
  • 通過POSIX信號原語提供的信號服務;
  • 消息傳遞服務,微內核處理整個系統(tǒng)中所有線程之間的消息路由;
  • 通過POSIX線程同步原語提供的同步服務;
  • 調度服務,微內核使用各種POSIX實時調度策略來調度線程執(zhí)行;
  • 定時器服務,微內核提供了豐富的POSIX定時器服務集;
  • 進程管理服務,微內核與進程管理器一起組成一個叫procnto的單元,進程管理器部分負責管理進程、內存,還有路徑名空間。
    與線程不同,微內核本身不會被調度執(zhí)行。處理器只在微內核中執(zhí)行系統(tǒng)調用、異常、硬件中斷響應等。

QNX Neutrino操作系統(tǒng)的微內核,管理一組協(xié)作的進程,如下圖所示,這種結構不是一種層級的組織,更像是一個團隊,因為不同的進程可以通過內核來協(xié)調交互。QNX Neutrino充當一個“軟件總線”的角色,可以在需要的時候動態(tài)的插入和移除系統(tǒng)模塊。


QNX Neutrino架構

進程及進程間通信

除了procnto單元提供的服務外,所有的系統(tǒng)服務都是通過標準的進程來處理的。一個配置豐富的QNX系統(tǒng)應該包括以下功能:

  • 文件系統(tǒng)管理器
  • 字符設備管理器
  • 圖形用戶界面
  • 本地網(wǎng)絡管理器
  • TCP/IP

系統(tǒng)進程 vs 用戶進程

系統(tǒng)進程與任何用戶編寫的進程本質上是不可區(qū)分的,它們使用相同的公共API和內核服務。正是這種架構也讓QNX具備了無與倫比的可擴展性。由于大多數(shù)的操作系統(tǒng)服務由標準的系統(tǒng)進程提供,因此增強操作系統(tǒng)本身變得非常簡單:只需編寫新的程序來提供新的操作系統(tǒng)服務。實際上,操作系統(tǒng)和應用程序之間的界限可能會變得非常模糊,系統(tǒng)服務和應用程序之間唯一真正的區(qū)別是操作系統(tǒng)服務為客戶管理資源。

假如你需要寫一個數(shù)據(jù)庫的服務器,這樣一個進程怎么分類?
正如文件系統(tǒng)接受請求(通過消息)來打開文件和讀寫數(shù)據(jù)一樣,數(shù)據(jù)庫服務器也需要接受請求,盡管數(shù)據(jù)庫服務器的請求可能更復雜,但是兩者非常相似,需要提供API(由消息實現(xiàn))給客戶端進行資源訪問。此外,它們都是獨立的進程,可以由終端用戶來編寫,并且根據(jù)需要來進行啟動和停止。
數(shù)據(jù)庫服務器可能在某個任務中充當系統(tǒng)進程,而在另外的任務中充當應用戶進程,但是這都不重要,重要的是QNX操作系統(tǒng)可以在不修改操作系統(tǒng)本身的標準組件的情況下,允許用戶實現(xiàn)這樣的進程,對于嵌入式開發(fā)人員來說,提供了很大的靈活性。

設備驅動程序允許操作系統(tǒng)和應用程序以通用的方式去訪問低層的硬件(例如磁盤設備驅動器、網(wǎng)絡接口)。雖然大多數(shù)的OS要求設備驅動程序與OS本身緊密綁定,但是QNX Neutrino的驅動程序能被當成一個標準的進程被啟動和停止。因此,添加設備驅動程序不會影響OS的其他部分,可以像應用程序一樣開發(fā)和調試驅動。

進程間通信

IPC(Interprocess Communication)進程間通信,是將應用程序設計成一組進程的關鍵,確保每個進程處理整體中的某一部分。QNX是第一個將消息傳遞作為IPC基本手段的商業(yè)操作系統(tǒng),操作系統(tǒng)的強大、簡單和優(yōu)雅,在很大程度上歸功于消息傳遞在整個系統(tǒng)中的完整集成。
在QNX Neutrino中,消息是從一個進程傳遞給另一個進程的字節(jié)包,消息的內容只對發(fā)送者和接收者有意義。
消息傳遞不僅允許進程相互傳遞數(shù)據(jù),而且還提供了一種同步多個進程執(zhí)行的方法。當進程發(fā)送、接收、回復消息時,它們會經歷各種“狀態(tài)變化”,這些“狀態(tài)變化”,會影響它們的執(zhí)行時間和時間長度。了解它們的優(yōu)先級和狀態(tài),微內核可以盡可能有效的調度所有進程,最大限度來利用CPU資源。消息傳遞在整個系統(tǒng)中不斷的起作用。
實時或關鍵任務,通常需要一套可靠的IPC機制,因為組成這些任務的進程之間關聯(lián)很緊密。QNX Neutrino的消息傳遞設計所強加的規(guī)則,給應用程序帶來了秩序和可靠性。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容