QNX 網絡架構

QNX 網絡架構

  與QNX中微子RTOS中的其他服務進程一樣,網絡服務在內核之外執行。無論涉及的網絡的配置和數量如何,開發人員都會看到一個統一的接口。這個體系結構允許:

  1. 要動態地啓動和停止網絡驅動程序
  2. Qnet和其他協議可以在任何組合中一起運行
      我們的本機網絡子系統由網絡管理器可執行文件(io-pkt-v4、io-pkt-v4-hc或io-pkt-v6-hc)以及一個或多個共享庫模塊組成。這些模塊可以包括協議(例如lsm-qnet.so)和驅動程序(例如devnp-speedo.so)。

Network manager (io-pkt*)

  io-pkt組件是網絡子系統中的活動可執行文件。作爲一種包重定向器/多路複用器,io-pkt負責根據其命令行上給出的配置加載協議和驅動程序模塊(或在啓動後通過mount命令加載)。
  使用零拷貝架構,io-pkt可執行文件有效地動態加載多個網絡協議或驅動程序(例如,lsm-qnet.so)——這些模塊是安裝到io-pkt中的共享對象。
  io-pkt棧在架構上與操作系統中的其他組件子系統非常相似。在底層,是提供向硬件傳遞數據和從硬件接收數據的機制的驅動程序。驅動程序連接到一個多線程的第二層組件(該組件還提供快速轉發和橋接功能),該組件將它們連接在一起,並提供一個統一的接口,用於將數據包定向到堆棧的協議處理組件。這包括,例如,處理單個IP和上層協議,如TCP和UDP。
  在QNX中微子中,資源管理器在堆棧的頂部形成一個層。資源管理器充當堆棧和用戶應用程序之間的消息傳遞中介。它提供了一種標準化的接口,包括open()、read()、write()和ioctl(),這些接口使用消息流與網絡應用程序通信。由用戶編寫的網絡應用程序鏈接到套接字庫。套接字庫將堆棧公開的消息傳遞接口轉換爲標準的bsd樣式的套接字層API,這是當今大多數網絡代碼的標準。
Figure49

  在驅動程序層,有用於以太網通信的接口(所有以太網驅動程序都使用),以及用於來自無線驅動程序的802.11管理幀的堆棧接口。堆棧的hc變體還包括一個單獨的硬件加密API,該API允許堆棧在加密或解密安全鏈接的數據時使用加密卸載引擎。可以使用。將驅動程序(構建爲動態鏈接的dll,並以devnp作爲前綴—用於新類型驅動程序,devn用於舊驅動程序)加載到堆棧中,使用io-pkt 的-d選項。
  在以太網或IP層提供連接到數據流的api允許協議在堆棧進程中共存。協議(如Qnet)也構建爲dll。協議直接鏈接到IP層或以太網層,並在堆棧上下文中運行。它們以lsm(可加載的共享模塊)爲前綴,您可以使用-p選項將它們加載到堆棧中。tcpip協議(-ptcpip)是一個堆棧可以識別的特殊選項,但是它不鏈接(因爲已經內置了IP堆棧)。您仍然使用-ptcpip選項將附加參數傳遞給應用於IP協議層的堆棧(例如,-ptcpip前綴=/alt使IP堆棧註冊/alt/dev/socket作爲其資源管理器的名稱)。
  需要來自位於堆棧進程外部的應用程序的交互的協議可能包括它自己的資源管理器基礎結構(這就是Qnet所做的),以允許通信和配置發生。
  除了驅動程序和協議,堆棧還包括用於包過濾的掛鉤。支持過濾的主要接口有:

  • Berkeley Packet Filter (BPF) interface
      一個套接字級別的接口,它允許您讀寫包,但不允許修改或阻塞包,並且您可以通過在應用層使用套接字接口進行訪問(參見http://en.wikipedia.org/wiki/Berkeley_Packet_Filter)。這是基本的原始數據包攔截和傳輸選擇的接口,併爲堆棧進程域之外的應用程序提供對原始數據流的訪問。
  • Packet Filter (PF) interface
      一個讀/寫/修改/阻塞接口,它完全控制那些被上層接收或從上層傳輸的包,並且與io-net過濾器API關係更密切。

線程模型

  默認的操作模式是io-pkt爲每個CPU核創建一個線程。
  io-pkt堆棧在第2層是完全多線程的。但是,只有一個線程可以獲得的“堆棧上下文”去處理上層包。如果多箇中斷源需要同時進行服務,則可以通過多個線程進行服務。在任何時候,只有一個線程將服務於一個特定的中斷源。通常,網絡設備上的中斷表示有要接收的數據包。負責處理接收的同一個線程可能稍後將接收到的包發送到另一個接口。例如,第2層橋接和IP包的“ipflow”快速轉發。
  堆棧使用線程池來服務從系統的其他部分生成的事件。這些事件可能是:

  1. 超時
  2. ISR事件
  3. 由堆棧或協議模塊生成的其他內容
      可以使用命令行選項來控制線程接收包時的優先級。客戶端連接請求以浮動優先級模式處理。(線程優先級與訪問堆棧資源管理器的客戶端應用程序線程的優先級匹配)。一旦一個線程收到一個事件,它檢查事件類型,看看它是一個硬件事件,堆棧事件,或“其他”事件:
  4. 如果該事件是硬件事件,則爲硬件提供服務,對於接收包,線程確定是否需要橋接或快速轉發。如果是這樣,線程執行適當的查找,以確定數據包應該排隊等待哪個接口,然後負責傳輸它,然後返回檢查硬件是否需要再次服務。
  5. 如果包是針對本地堆棧的,則線程在堆棧隊列上對包進行排隊。然後,線程返回並繼續檢查和服務硬件事件,直到沒有其他事件爲止。
  6. 一旦一個線程完成了對硬件的服務,它就會檢查當前是否有一個堆棧線程正在運行,以服務可能由於其操作而生成的堆棧事件。如果沒有堆棧線程在運行,該線程就成爲堆棧線程並循環運行,處理堆棧事件,直到沒有事件爲止。然後返回到線程池中,處於“等待事件”狀態。
    &emps; 這種將線程從硬件服務線程直接更改爲堆棧線程的功能消除了上下文切換,並極大地提高了接收性能(for locally terminated IP flow)。

協議模塊

  網絡協議模塊負責實現特定協議(如Qnet)的細節。
  每個協議組件都打包爲一個共享庫(例如,lsm-qnet.so)。一個或多個協議組件可以併發運行。
例如,構建文件中的以下行顯示了io-pkt-v4通過-p協議命令行選項加載Qnet協議:io-pkt-v4 -dne2000 -pqnet
NOTE:io-pkt管理器包括TCP/IP棧*
  Qnet是QNX中微子本地網絡協議。它的主要目的是擴展操作系統強大的消息傳遞(message-passing)IPC——在微內核上網絡透明的IPC。Qnet還提供了服務質量策略,以幫助確保可靠的網絡事務。

驅動模塊

  網絡驅動模塊負責管理特定網絡適配器的細節(例如,一個NE-2000兼容的以太網控制器)。每個驅動程序都打包爲一個共享庫,並安裝到io-pkt組件中。
  一旦io-pkt
運行,您可以使用mount命令在命令行上動態加載驅動程序。例如,以下命令啓動io-pkt-v6-hc,然後裝入Broadcom 57xx芯片組適配器的驅動程序:io-pkt-v6-hc & mount -T io-pkt devnp-bge.so。 所有的網絡設備驅動程序都是共享對象,它們的名字都是devnp-driver.so的形式。
NOTE:io-pkt-管理器還可以加載遺留的io-net驅動程序。這些驅動程序的名稱以devn-開頭
  一旦加載了共享對象,io-pkt將對其進行初始化。然後,驅動程序和io-pkt有效地綁定在一起——驅動程序將調用io-pkt*(例如,當數據包從接口到達時),而io-pkt*將調用驅動程序(例如,當需要將包從應用程序發送到接口時).
  要卸載遺留的io-net驅動程序,可以使用umount命令。例如:umount /dev/io-net/en0 要卸載一個新風格的驅動程序或一個遺留的io-net驅動程序,使用ifconfig銷燬命令:ifconfig bge0 destroy。

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