開機和元件間的所有內容

WARN:這份文件最近沒有經過審查,許多詳細資料可能已過時。

本文件概略介紹了開啟機器電源及系統上執行的軟體元件之間發生的所有事情。

大綱:

核心

將 Fuchsia 核心 (zircon) 載入系統中的程序會因平台而異。

核心 (zircon) 在系統上執行後,其主要目標是啟動可執行程序的使用者空間。由於 zircon 就像是微型核心,因此在這個階段中不必全面執行 (尤其是與 Linux 相比)。系統會將第一個使用者程序的執行檔封裝至核心中,而核心會複製到新的程序並啟動。這類程式稱為「userboot」

初始流程

建構 Userboot 是方便核心啟動,否則核心必須實作許多程序 Bootstrap 功能 (例如程式庫載入器服務),其在第一個程序啟動後絕不會使用。

Userboot 的工作非常簡單,可用來尋找並展開下一個程序。 啟動檔案系統映像檔包含唯讀檔案系統,使用者啟動程序後即可存取尋找執行檔及其程式庫。之後會啟動下一個程序,也就是「元件管理員」

除非核心指令列提供了 userboot.off 選項,否則此時可能會結束 Userboot。

元件管理員 (下一個程序) 是由使用者啟動程序啟動動態連結。因此,前者可以使用程式庫,因此比早期啟動複雜邏輯的使用者啟動程序啟動作業更理想。由於這個元件管理員會為其子項執行各種 FIDL 服務,因此啟動用途最值得注意的地方就是啟動檔案系統,此檔案系統是由使用者啟動程序啟動解壓縮的啟動檔案系統映像檔所支援的 FIDL 型檔案系統。它還會完成剖析 ZBI 及完成不必要的頁面,並使用擷取的資訊託管項目、項目工廠和引數服務。

元件管理員會將自身程序標示為「重要」,這表示如果發生任何問題並當機,系統就會終止其執行的工作。當它在具備特殊屬性的根工作中執行時,如果因終止核心而強制重新啟動系統,元件管理員停止運作便會重新啟動。

元件管理員

元件管理員是驅動元件架構的程式。這個架構可控製程式的執行方式和時間,以及這些程式可從其他程式存取哪些功能。

元件管理員執行的元件會整理成樹狀結構。有一個根元件,其中包含兩個名為 bootstrap 和核心的子項。Bootstrap 的子項是系統所需的部分,能讓系統功能足以執行包含使用者體驗的高階軟體。

根元件、啟動程序和核心元件是不可執行的元件,代表這些元件並未在與其對應的系統上執行。這些資料僅供機構使用。

顯示 fshost 和驅動程式管理器工具是 Bootstrap 元件的子項,而核心和啟動程序是根元件的子項的圖表

初始系統元件

背景

Bootstrap 底下有兩個重要元件:Fshost 和驅動程式管理器。

驅動程式管理器

行車管理員

駕駛 每個驅動程式庫都是儲存在啟動檔案系統或套件中的動態程式庫,執行驅動程式庫時,會以動態方式連結至驅動程式代管程序並執行。

驅動程式管理器啟動時無法使用儲存在套件中的驅動程式,因為這些驅動程式儲存在磁碟中,驅動程式必須執行,系統才會顯示檔案系統封鎖裝置。載入檔案系統前,只有 Zircon Boot Image (ZBI) 中的驅動程式才能載入並執行。驅動程式索引是元件,會知道所有驅動程式在系統中的位置。驅動程式管理員會在基本套件載入完成且找到基本驅動程式時通知驅動程式管理員。

Fshost

Fshost 是元件的元件,負責找出封鎖裝置、啟動檔案系統程序來為這些區塊裝置提供服務,並向 Fuuchsia 的其他部分提供這些檔案系統的帳號代碼。為達成此目的,fshost 會嘗試存取其命名空間中的 /dev 控制代碼。這項能力由驅動程式管理員提供

當 Fshost 尋找封鎖裝置時,會讀取每部裝置的標頭,以偵測檔案系統類型。 Fshost 會使用 devfs 使驅動程式管理器針對這個區塊裝置執行 fvm 驅動程式庫,而會顯示其他區塊裝置進行檢查。此方法同樣用於發現 zxcrypt 分區,因為磁碟必須解密才能使用。載入 fvm 和 zxcrypt 後,fshost 會尋找適當的區塊裝置,然後啟動 minfsblobfs 檔案系統,這是正常運作的系統所需的資源。

啟動順序

元件管理員通常會視需要延遲元件啟動元件,以回應存取元件所提供能力的行為。元件也可能會標示為「eager」,導致元件從父項開始的時間點開始。

執行後,Fshost 會嘗試從驅動程式管理器存取 /dev 控制代碼,進而啟動驅動程式管理器。這些系統共同啟動驅動程式和檔案系統,最終會在執行 pkgf 時釋放。此時,Fshost 會開始透過 /pkgfs 控制代碼回應要求,而元件管理員則會繼續啟動剩餘的使用者空間。

TODO(https://fxbug.dev/42053321):自 https://cs.opensource.google/fuchsia/fuchsia/+/124f955ae0d1db1c7e991684c7e8a9b4528d6806 起,這張圖表不再準確。

顯示 Fshost 和驅動程式庫管理員之間的啟動順序的序列圖表。

啟動完成

此時,系統已準備好透過 FIDL 通訊協定和服務啟動其他元件,或利用 component_manager 提供的服務直接啟動這些元件。