Fuchsia 系統介面

總覽

Fuchsia 系統介面是 Fuchsia 作業系統用來執行軟體的二進位檔介面。介面的基礎是 vDSO,可以提供系統呼叫的存取權。程式不得直接發出系統呼叫 (例如,複製到核心)。程式改採 vDSO 與核心介面連接。

大部分的系統介面都是透過處理序間通訊通訊協定提供,通常使用 FIDL 定義。這些通訊協定會透過各種核心基元發出,包括管道和通訊端。

fuchsia.io FIDL 程式庫提供檔案和目錄作業的通訊協定。Fuchsia 使用 fuchsia.io 通訊協定為元件提供命名空間,讓元件可透過哪些元件存取系統服務和資源。這些命名空間中的名稱遵循系統 ABI 的特定慣例。詳情請參閱「命名空間」一節。

套件本身也會為目錄結構和檔案格式提供系統介面。系統會使用這項資訊,初始化要執行這些套件中的元件的程序。

術語

系統的應用程式設計介面 (API) 是系統的來源層級介面。您通常會編寫直接使用此介面的軟體。變更系統 API 時,您可能需要更新原始碼來因應 API 的變更。

系統的應用程式二進位檔介面 (ABI) 是系統的二進位檔層級介面。通常您不會編寫直接使用系統 ABI 的軟體。而是使用系統 API 編寫軟體。軟體經過編譯時,由編譯器介面透過 ABI 與系統建立的二進位成果。變更系統 ABI 時,您可能需要重新編譯原始碼,以因應 ABI 中的變更。

ABI 介面

本節說明 Fuchsia 元件的各種 ABI 介面。

vDSO

vDSO 是一種虛擬共用資料庫,可提供核心的存取權。簡單來說,vDSO 是一個稱為 libzircon.so 的 ELF 共用資料庫,可匯出具有 C 呼叫慣例的多個符號。這些符號的可靠資料來源是 //zircon/vdso。如要瞭解其語意,請參閱說明文件

FIDL 通訊協定

大部分的系統介面定義於 Fuchsia 介面定義語言 (FIDL) 中。FIDL 編譯器會針對各種譯文語言產生語言專屬的 API 和執行階段程式庫,稱為 FIDL 繫結。這些繫結提供一個慣用介面,用於透過 Zircon 管道 (和其他原始物件) 傳送及接收處理序間通訊訊息。

電匯格式

FIDL 通訊協定本身和編譯器產生的語言專屬繫結屬於系統 API,但不屬於系統 ABI 的一部分。而序列化訊息的格式稱為「傳輸格式」,其構成 ABI。FIDL 線格式是由規格定義。

使用者信號

除了傳送的訊息外,部分 FIDL 通訊協定也會使用基礎核心物件的使用者信號。目前,這些信號並未在 FIDL 中宣告。一般來說,任何相關聯使用者信號的語意都會記載在 FIDL 定義的註解中。

命名空間慣例

命名空間和傳出目錄中的名稱遵循系統 ABI 的特定慣例。

命名空間

元件

/svc同樣地,按照慣例,pkg 命名空間項目會對應至用來解析元件的套件。

傳出目錄

/svc

資料格式

部分命名空間包含有資料的檔案。這些檔案使用的資料格式也屬於系統 ABI 的一部分。例如,元件會透過包含 certs.pem 檔案的命名空間項目存取根憑證。pem 資料格式是系統 ABI 的一部分。

套件慣例

Fuchsia 套件的目錄結構遵循特定命名慣例。這些慣例也是系統 ABI 的一部分。本節將提供兩個重要的封裝慣例範例。

Meta

按照慣例,套件中的 meta 目錄包含描述套件的中繼資料檔案。

lib

按照慣例,套件中的 lib 目錄包含套件元件使用的共用程式庫。當系統執行套件中的執行檔時,系統會根據這個 lib 目錄解析共用程式庫的要求。

Fuchsia 和其他作業系統之間的一項重要差異,在於共用程式庫本身是由套件建立者提供,而非系統本身。因此,共用資料庫本身 (包括 libc) 並不屬於系統 ABI 的一部分。

系統會提供兩個共用資料庫:vDSOVulkan ICD。詳情請參閱這些章節。

程序結構

Fuchsia 上的程序相當具有彈性,且大部分取決於程序中執行的可執行檔,但部分程序的初始結構是由系統和系統 ABI 的一部分控制。

詳情請參閱程式載入一文。

ELF 載入器

Fuchsia 使用 ELF 資料格式執行執行檔。將執行檔載入程序時,載入器會將可執行檔的內容剖析為 ELF。載入器會從執行檔讀取 INTERP 指令,並將該名稱解析為包含執行檔套件的 lib 目錄中的檔案。然後載入器會將 INTERP 檔案的內容剖析為 ELF 共用資料庫,將程式庫重新定位,並將程式庫對應至新建立的程序。

啟動訊息

啟動程序的過程中,程序建立者會提供訊息給程序,其中含有指令列引數、environ、初始控點和處理程序的命名空間等。(傳出目錄包含在程序的一組初始控制代碼中)。

這則訊息的格式 (包括指令列引數和 environ 等欄位的長度限制) 屬於系統 ABI 的一部分,也是訊息內容的慣例。舉例來說,依照慣例,PWD 環境變數是建立者建議此程序使用做為目前工作目錄的名稱。

初始控點與數字 ID 相關聯。這些 ID 的慣例是系統 ABI 的一部分。例如,按照慣例,PA_PROC_SELF 控制代碼是新建立程序處理程序物件的控制代碼。除了這些帳號代碼類型以外,與這些帳號代碼相關聯的權利也是系統 ABI 的一部分。

VMAR 結構

建立者會修改程序的根 VMAR 啟動程序。舉例來說,建立者會對應 vDSO,並為初始執行緒分配堆疊。程序啟動時的 VMAR 結構屬於系統 ABI 的一部分。

工作政策

程序會在工作中執行,因此可對其中的程序和工作套用政策。適用於程序的工作政策屬於 ABI 的一部分。舉例來說,元件會在 ZX_POL_NEW_PROCESS 設為 ZX_POL_ACTION_DENY 的程序中執行。這會強制該元件使用 fuchsia.process.Launcher 通訊協定建立程序,而不是直接發出 zx_process_create 系統呼叫。

Vulkan ICD

針對 libvulkan.so 使用 Vulkan API 進行硬體加速圖形連結的元件,並在資訊清單中指定 vulkan 功能。這個程式庫是由包含元件的套件提供,因此不屬於系統 ABI 的一部分。不過,libvulkan.so 會載入另一個稱為 Vulkan 可安裝用戶端驅動程式 (Vulkan ICD) 的共用資料庫。Vulkan ICD 會使用 fuchsia.vulkan.loader.Loader 載入,這表示程式庫是由系統本身提供,而非包含元件的套件。因此,Vulkan ICD 是系統 ABI 的一部分。

Vulkan ICD 是 ELF 共用資料庫,可匯出三個符號。這些符號僅供 Vulkan ICD 使用,不應直接使用。

  • vk_icdGetInstanceProcAddr
  • vk_icdNegotiateLoaderICDInterfaceVersion
  • vk_icdInitializeOpenInNamespaceCallback

此外,Vulkan ICD 共用資料庫的 NEEDED 區段會列出 Vulkan ICD 依附的多個共用程式庫。您必須提供包含元件的套件,才能提供這些共用程式庫。

Vulkan ICD 同時匯入多個符號。這些匯入的符號 (例如參數和語意) 為系統 ABI 的一部分。

目前,Vulkan ICD 的 NEEDED 區段和匯入符號清單都超出我們的預期。希望我們可以盡量減少系統 ABI 的這些面向。

通訊端

Datagram 取景

用於網路的 Datagram 通訊端包含一個影格,用來指定與資料元組相關聯的網路位址。這個影格也屬於系統 ABI 的一部分。

終端機通訊協定

在終端機中執行的程式會使用 Fuchsia Terminal Protocol 與終端機通訊,Fuchsia Terminal Protocol 是類似 vt100 的文字型通訊協定。此通訊協定也會透過 ssh 在網路上公開,包括預期連入 ssh 連線支援此通訊協定的用戶端,以及預期傳出 ssh 連線支援此通訊協定的伺服器。