- 記憶體管理
- 時段設定
- 程序間通訊
系統呼叫
使用者空間程式碼會使用系統呼叫,與核心空間中的物件互動。Zircon 具有系統呼叫功能,可執行低階作業,例如:
- 記憶體管理
- 工作和程序管理
- 程序間通訊 (IPC) 和同步
- 例外狀況處理
- 硬體支援服務 (時鐘、熵、裝置 I/O)
使用者空間程序會透過 libzircon.so 存取系統呼叫,這是
<0Zircon vDSO 是 ELF 格式的共用程式庫,核心會將其對應至每個新程序的位址空間。這個程式庫是由核心映像檔直接公開,而非從檔案載入,因此視為「虛擬」程式庫。
大多數系統呼叫會直接與一或多個
<zx_handle_t
工作、程序和執行緒
Zircon 會公開三種主要核心物件,用於執行程式碼:
程序是系統功能的基礎。每個程序都會透過持有的各種控制代碼,獲得一組功能。
Fuchsia 軟體可能會在單一程序範圍內執行,也可能不會。 工作可讓您將由多個程序組成的「應用程式」視為單一實體進行控管。
程序間通訊
由於程序預設會隔離,核心必須提供程序間安全通訊的方式。Zircon 包含下列核心物件類型,用於程序間通訊 (IPC):
- 事件: 兩個程序之間的信號介面。
- 通訊端: 串流資料傳輸,類似管道。
- 串流: 可搜尋的串流資料傳輸,例如檔案。
- 管道: 可傳遞資料和一組控制代碼的訊息式傳輸方式。
- 先進先出 (FIFO): 控制層可存取共用記憶體,並針對小型資料酬載進行最佳化。
在這些物件中,管道特別適合協助啟動新程序,因為管道能夠將控制代碼 (以及功能) 轉移至另一個程序。
管道有兩個端點控制代碼,分別由不同程序擁有。只有擁有者可以讀取或寫入訊息,但端點的擁有權可以從一個程序轉移到另一個程序。控制代碼寫入管道時,會從傳送程序中移除。從管道讀取含有控制代碼的訊息時,控制代碼會新增至接收程序。
Zircon 管道是服務層級 IPC 通訊協定的基礎,這些通訊協定由 FIDL0FIDL 通訊協定是 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.
傾印程序清單
連線至裝置 Shell 提示,並使用 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。 - NAME:提供系統正在執行的元件詳細資料。
根據我們目前討論的內容,以下是一些有趣的細節:
- 每個程序都會連結至父項工作。部分工作有多個程序。
- 所有工作最終都會追溯至
root工作,形成樹狀結構。 - 啟動時,系統會直接在
root工作中啟動幾個程序。大多數其他程序則會在各自的父項工作中啟動。 - 完成初始啟動工作後,許多項目都會有
.cm擴充功能。這些是指元件,您稍後會進一步瞭解。 - 其中有些元件是核心服務,例如檔案系統 (
fshost.cm) 和驅動程式 (driver_manager.cm),這些元件位於與核心不同的使用者空間。
接著,我們將探討 Zircon 如何支援 Fuchsia 安全性模型的基本概念。