[轉]QNX簡介_商用RTOS系統總結

如果你認爲本系列文章對你有所幫助,請大家有錢的捧個錢場,點擊此處贊助,贊助額0.1元起步,多少隨意

聲明:本文只用於個人學習交流,若不慎造成侵權,請及時聯繫我,立即予以改正

鋒影

email:[email protected]

 

系統簡介

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

QNX系統架構圖

 

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

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

微內核架構

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

QNX內存保護

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

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

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

     

    平板模式

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

     

    單內核模式

  • 微內核OS提供完整的內存保護:內核處於一個被保護的地址空間,驅動程序、網絡協議及應用程序等處於程序空間中。

     

    微內核模式

QNX Neutrino微內核

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

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

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

 

QNX Neutrino架構

進程及進程間通信

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

  • 文件系統管理器
  • 字符設備管理器
  • 圖形用戶界面
  • 本地網絡管理器
  • TCP/IP

系統進程 vs 用戶進程

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

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

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

進程間通信

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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章