建立程序

核心提供低階的設施,可用於建立及設定程序。不過,這些設施難以使用,因為這類設施會直接對應執行檔、共用程式庫和堆疊的記憶體。建議您改用其中一項較高層級的機制來建立程序。

fuchsia.process.Launcher

Fuchsia 提供 fuchsia.process.Launcher 服務,可為您執行建構程序的低階工作。您必須將建構程序所需的所有核心物件 (例如應建立程序的工作物件、可執行映像檔,以及標準輸入與輸出控點) 提供給這項服務,服務就會執行剖析 ELF 執行檔格式、設定程序的位址空間,以及傳送啟動訊息的程序。

大多數用戶端不需要直接使用這項服務,大多數用戶端可以改用 FDIO 程式庫中名為 fdio_spawn 的簡易 C 前端。這個函式及其更進階的 fdio_spawn_etcfdio_spawn_vmo 隨附會連線至 fuchsia.process.Launcher 服務,並將適當的訊息傳送給服務來建立程序。傳遞至 fdio_spawn_etcfdio_spawn_action_t 陣列可用來自訂已建立的程序。

無論您是直接使用 fuchsia.process.Launcher 服務還是 fdio_spawn 前端,此方法建立程序最適合在自己的命名空間中建立程序,因為您必須為新程序提供所有核心物件。

fuchsia.sys.Launcher

如要在自己的命名空間中建立程序,Fuchsia 提供 fuchsia.sys.Launcher 服務。您無需提供建構新程序所需的所有核心物件,而是向服務提供所要建立程序的高階說明,且 fuchsia.sys.Launcher 實作會將新程序提供合適的核心物件。舉例來說,如果您在套件中提供元件的網址,fuchsia.sys.Launcher 就會在適合該元件的命名空間中為該元件建立程序,並為該元件建立專屬套件的存取權,以及在資訊清單的 sandbox 區段中宣告的任何其他資源。

fuchsia.sys.Launcher 不會直接傳回 zx::process 控制代碼,而是回傳 fuchsia.sys.ComponentController 介面。此抽象層可讓 fuchsia.sys.Launcher 建立非個別程序支援的元件。例如,如果您啟動以 Diart 編寫的元件,該元件可能會在 Dart VM 執行個體中執行,該執行個體會在多個具有相容安全性限制的元件之間共用。

早期啟動

剛開始進入啟動程序時,系統會手動建立多個程序。舉例來說,核心會手動建立第一個使用者空間程序 userboot

使用者啟動最重要的工作,是從 ZBI 的啟動檔案系統映像檔載入下一個程序 (預設為 component_manager)。

使用工作政策,禁止在 fuchsia 工作樹狀結構中直接建構程序 (例如 userboot 載入 component_manager 的方式)。可能從 fuchsia 工作樹狀結構中使用的程式庫或程式,可能會使用 fdio_spawn (或其隨附應用程式) 建立程序,並遵守安全性政策。