章 5. NetworkManager 的基礎技術

內容目錄

5.1. D-BUS
5.2. 硬體抽象層 (HAL)
5.3. 更多資訊

NetworkManager 利用到 D-BUS 和硬體抽象層 (Hardware Abstraction Layer,HAL) 技術的優點。對內,D-BUS 是用來供 NetworkManager 精靈、NetworkManager 各部分和 HAL (提供學習現有和新硬體的能力) 之間進行通訊;對外,D-BUS 則是用於廣播有關各種狀態變更的資訊。

5.1. D-BUS

D-BUS 是以 C 語言寫成的程序間通訊 (IPC) 系統,讓應用程式之間能夠相互溝通。這套系統是於 2002 年由 Havoc Pennington、Alex Larsson 和 Anders Carlsson 開始研發,它原先是 freedesktop.org 專案的一部分,目的是要將桌面的傳訊平台標準化。

D-BUS 的設計是針對兩個特殊狀況──相同桌面工作階段中桌面應用程式之間的通訊,以及桌面工作階段與作業系統之間的通訊。

D-BUS 的架構嚴謹而明確。它包含三個基本層級:

libdbus

供應用程式用來相互連接和交換訊息的低階程式庫。它只支援一對一的連線。

訊息匯流排精靈

可連接多個應用程式的可執行程式。這個精靈可以將訊息從一個應用程式傳給零個或多個應用程式。

包裝函式程式庫

包裝函式程式庫 (也稱為繫結) 會包裝標準低階程式庫 D-BUS,來為開發人員提供更好的環境。包裝函式程式庫包含 libdbus-qt 和 libdbus-glib。

因為 D-BUS 是訊息匯流排系統,所以它不會傳送位元組資料流,而是傳送訊息。訊息擁有含類型識別的標題和包含資料的內文,而且是二進位格式。訊息有幾種不同的內建類型,例如,錯誤訊息或事件通知等。有關訊息類型的資訊儲存在訊息的標題。標題也包含有關訊息路徑和介面的資訊。

做為訊息伺服器的匯流排精靈通常有多個例項。第一個例項是全域性的,而且大致類似典型的精靈,如 httpd 或 sendmail。這個例項有許多安全性限制,而且用於全系統的通訊。其他例項則是針對每個使用者登入工作階段會各建立一個。這些例項是用於使用者工作階段中應用程式之間的通訊。

建立連線以開始通訊之前,應用程式必須先通過驗證。這時會使用以 SASL 為基礎的簡易純文字通訊協定執行這項工作。為了將正確的訊息傳給正確的應用程式,所以必須使用特殊格式的位址和訊息匯流排名稱。這表示每個連線至少有一個名稱。當連線關閉時,會刪除它所擁有的所有名稱。

核心低階 D-BUS API 是以 C 語言寫成,而且目的不是用於開發應用程式架構。D-BUS 為做為這個用途的語言提供各種不同繫結。您可以選擇的項目有很多,包括:

  • GLib

  • Qt

  • Python

  • .NET

  • Java

  • Perl

  • C++

  • Ruby