Zircon 基礎知識

Zircon 是 Fuchsia 運作的核心核心。 這個 API 是由一個核心和一小群使用者空間服務、驅動程式和程式庫所組成,執行核心系統功能 (例如開機) 所需的資料。

相反地,Zircon 式微核心架構可讓 Fuchsia 將系統執行的信任程式碼數量縮減為幾個核心功能:

  • 記憶體管理
  • 時段設定
  • 處理序間通訊

資料表顯示 Fuchsia 核心服務與一般作業系統的比較結果,這表示 Fuchsia 的核心服務數量較少。

系統呼叫

使用者空間程式碼會透過系統呼叫與核心空間中的物件互動。Zircon 可使用系統呼叫來執行低階作業,例如:

  • 記憶體管理
  • 工作與程序管理
  • 處理序間通訊 (IPC) 和同步處理
  • 例外狀況處理
  • 硬體支援服務 (偽裝、熵、裝置 I/O)

libzircon.soZircon vDSO 是 ELF 格式的共用程式庫,核心會對應至每個新程序的地址空間。由於這個程式庫會直接由核心映像檔公開,而非從檔案載入,因此系統會將此程式庫視為「虛擬」。

zx_handle_t

工作、程序和執行緒

Zircon 公開了三個主要物件,用於執行程式碼:

  • 執行緒:指定位址空間內的執行執行緒。
  • 程序:在私人獨立的位址空間中執行一組可執行的操作說明。
  • 工作:相關程序和工作的群組。所有工作都會形成單一根樹狀結構。

說明 Fuchsia 程序階層的樹狀圖。程序會分組為不同的工作,最後由根工作擁有。

這些程序構成系統功能的基礎。每個程序都會透過其持有的不同控點授予一組功能。

Fuchsia 軟體不一定會在單一程序的範圍內執行。 工作允許由多個程序組成的「應用程式」,以單一實體的形式進行控管。

處理序間通訊

由於程序預設是隔離狀態,因此核心需要提供其他方式,讓這些程序安全地相互通訊。Zircon 包含下列核心物件類型,可用於處理序間通訊 (IPC):

  • 事件:兩個程序之間的訊號介面。
  • 通訊端:串流資料傳輸,類似管道。
  • 串流:可搜尋的串流資料傳輸,例如檔案。
  • 管道:能夠同時傳遞資料和一組控點的訊息型傳輸。
  • FIFO:針對共用記憶體存取的控制層,已針對小型資料酬載進行最佳化。

在這些物件中,管道非常適合用來啟動新程序,因為管道可以將控點 (以及功能) 轉移至其他程序。

管道有兩個端點控制代碼,每個帳號代碼由獨立的程序擁有。 只有擁有者可以讀取或寫入訊息,但端點的擁有權可以從一個程序轉移到其他程序。將帳號代碼寫入管道時,這些帳號代碼會從傳送程序中移除。從管道讀取含有帳號代碼的訊息時,系統會將帳號代碼加入接收程序。

這張圖表顯示程序如何透過核心中的共用物件進行通訊。其中最常見的連結是管道。

FIDL 通訊協定是 Fuchsia 程式使用的處理序間通訊 (IPC) 主要方法。您稍後將詳細說明建立及使用 FIDL 通訊協定。

運動:工作和程序

讓我們在跑步系統上探索其中幾個基本概念。在本練習中,您將瞭解工作和程序如何互動以形成樹狀結構。

啟動模擬器

如果您尚未有一個執行中的執行個體,請啟動模擬器:

ffx emu start --headless

啟動完成後,模擬器會輸出下列訊息並傳回:

Logging to "$HOME/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log"
Waiting for Fuchsia to start (up to 60 seconds)........
Emulator is ready.

傾印程序清單

請連線至裝置殼層提示,並使用 ps 指令傾印執行中的工作和程序清單。

fx shell ps

以下是經過剪輯的範例,如下所示:

TASK                     PSS PRIVATE  SHARED   STATE NAME
j: 1027               507.8M  507.4M                 root
  p: 1061             564.4k    564k     36k         bin/bootsvc
  p: 1150            4264.4k   4264k     36k         bin/component_manager
  j: 1479             228.4k    228k
    p: 1583           228.4k    228k     36k         pwrbtn-monitor.cm
  j: 1484             532.4k    532k
    p: 1599           532.4k    532k     36k         svchost.cm
  j: 1544             402.4k    304k
    p: 1633           402.4k    304k    232k         netsvc.cm
  j: 1681             296.4k    296k
    p: 1733           296.4k    296k     36k         console-launcher.cm
  j: 1799            7232.4k   7232k
    p: 1825          7232.4k   7232k     36k         archivist.cm
  j: 1927             660.4k    660k
    p: 1955           660.4k    660k     36k         base-resolver.cm
  j: 2072            1016.4k   1016k
    p: 2088          1016.4k   1016k     36k         driver_manager.cm
  j: 2239             348.4k    348k
    p: 2252           348.4k    348k     36k         device-name-provider.cm
  j: 2364             275.3M  275.3M
    p: 2380          1012.4k   1012k     36k         fshost.cm
    p: 6544           252.1M  252.1M     36k         /pkg/bin/blobfs
    p: 10205         9744.4k   9744k     36k         /pkg/bin/minfs
    p: 10475           12.8M   12.8M     36k         pkgfs

現在我們先專注在輸出內容中的兩個資料欄:

  • 工作:指出每個項目是工作 (j) 或程序 (p),後面接著專屬 ID。
  • 名稱:這個部分將進一步說明在系統中執行的系統部分。

現在,根據我們先前討論的內容,來分析一些有趣的內容:

  1. 每個程序都與父項工作連結。某些工作會有多個程序。
  2. 所有工作均會回溯至 root 工作做為最終父項,形成樹狀結構。
  3. 在啟動期間,系統會直接在 root 工作中啟動幾個程序。其他大多數程序都會在各自的父項工作下啟動。
  4. 初始啟動工作完成後,許多項目都會有 .cm 副檔名。這些元件請參閱「元件」,稍後您將進一步瞭解這些元件。
  5. 其中部分元件是檔案系統 (fshost.cm) 和驅動程式 (driver_manager.cm) 等核心服務,這類服務位於核心之外的使用者空間。

接下來,我們會探討 Zircon 如何實現 Fuchsia 安全性模型的基礎知識。