核心提供低階的設施,可用於建立及設定程序。不過,這些設施難以使用,因為這類設施會直接對應執行檔、共用程式庫和堆疊的記憶體。建議您改用其中一項較高層級的機制來建立程序。
fuchsia.process.Launcher
Fuchsia 提供 fuchsia.process.Launcher
服務,可為您執行建構程序的低階工作。您必須將建構程序所需的所有核心物件 (例如應建立程序的工作物件、可執行映像檔,以及標準輸入與輸出控點) 提供給這項服務,服務就會執行剖析 ELF 執行檔格式、設定程序的位址空間,以及傳送啟動訊息的程序。
大多數用戶端不需要直接使用這項服務,大多數用戶端可以改用 FDIO 程式庫中名為 fdio_spawn
的簡易 C 前端。這個函式及其更進階的 fdio_spawn_etc
和 fdio_spawn_vmo
隨附會連線至 fuchsia.process.Launcher
服務,並將適當的訊息傳送給服務來建立程序。傳遞至 fdio_spawn_etc
的 fdio_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
(或其隨附應用程式) 建立程序,並遵守安全性政策。