警告:這份文件未經過近期審查,許多詳細資料可能已過時。
本文件旨在概略說明機器開機和系統上執行的軟體元件之間的所有情況。
大綱:
核心
將 Fuchsia 核心 (zircon) 載入至系統的程序會因平台而異。整體來說,核心會儲存在 ZBI
一旦核心 (zircon) 在系統上執行,其主要目標就是啟動使用者空間,以便執行程序。由於 Zircon 就像微核心,因此在這個階段不必執行太多工作 (尤其是與 Linux 相比)。第一個使用者程序的可執行檔會整合至核心,核心會將其複製到新程序並啟動。這個程式稱為「userboot」。
初始程序
我們精心設計 Userboot,讓核心可以輕鬆啟動,否則核心必須實作許多程序引導功能 (例如程式庫載入器服務),但這些功能在啟動第一個程序後就不會再使用。
Userboot 的工作非常簡單,就是尋找並啟動下一個程序。核心會將 ZBI 的句柄提供給使用者啟動程序,其中包含 Userboot 會透過 ZBI 尋找啟動檔案系統映像檔,並視需要解壓縮,然後複製到新的 啟動檔案系統映像檔包含唯讀檔案系統,使用者啟動程序會存取該檔案系統,以便尋找可執行檔及其程式庫。有了這些,它就會啟動下一個程序,也就是元件管理工具。
除非在核心指令列中提供 userboot.shutdown 選項,否則 Userboot 可能會在此時結束。
元件管理員是下一個程序,會由使用者啟動程序 動態連結。因此,與使用者啟動程序相比,它更適合用於處理早期啟動複雜邏輯,因為它可以使用程式庫。由於這個元件管理員會為子項執行各種 FIDL 服務,其中最值得注意的是啟動檔案系統,這是由使用者啟動程序解壓縮的啟動檔案系統映像檔所支援的 以 FIDL 為基礎的檔案系統。它也會完成 ZBI 的剖析作業,並解除不必要的頁面,並使用擷取的資訊來代管項目、項目工廠和引數服務。
元件管理員會將程序標示為「重要」,這表示如果發生錯誤而導致程序異常終止,則會終止該程序所在的工作。由於元件管理員會在具有特殊屬性的根工作中執行,如果該工作遭到終止,核心會強制重新啟動系統,因此元件管理員發生當機時,系統會重新啟動。
元件管理員
元件管理工具是驅動元件架構的程式。這個架構會控制程式的執行方式和時間,以及這些程式可從其他程式存取哪些功能。由此架構執行的程式稱為
元件管理員執行的元件會以樹狀結構排列。有一個根元件,且有兩個名為 bootstrap 和 core 的子項。Bootstrap 的子項是系統的必要部分,可讓系統運作,以便執行包含使用者體驗的高階軟體。
根、Bootstrap 和核心元件都是不可執行的元件,也就是說,這些元件在對應的系統上沒有任何執行中的程式。這些資料僅供組織用途使用。
初始系統元件
背景
在啟動輔助程式下方有兩個重要的元件,分別是 fshost 和驅動程式管理器。這兩個元件會共同運作,為session啟動所有面向使用者的軟體。
驅動程式管理器
驅動程式是由 每個驅動程式庫都是儲存在啟動檔案系統或套件中的動態程式庫,當驅動程式庫要執行時,會動態連結至驅動程式代管程序,然後執行。
驅動程式管理器啟動時,儲存在套件中的驅動程式無法使用,因為這些驅動程式會儲存在磁碟上,且必須在驅動程式執行後,系統才能顯示檔案系統的區塊裝置。在載入檔案系統之前,只能載入並執行 Zircon 啟動映像檔 (ZBI) 中的驅動程式。驅動程式索引是一種元件,可得知所有驅動程式在系統中的所在位置。驅動程式索引會在基礎套件載入完成且找到基礎驅動程式時,通知驅動程式管理員。
fshost
Fshost 是負責尋找區塊裝置、啟動檔案系統程序來服務這些區塊裝置,以及為這些檔案系統提供句柄的元件。為此,fshost 會嘗試存取其命名空間中的 /dev 句柄。這項能力是由驅動程式管理員提供。
當 fshost 找到區塊裝置時,會讀取每個裝置的標頭,以便偵測檔案系統類型。它會先找到 Fshost 會使用 devfs 讓驅動程式管理器為這個區塊裝置執行 fvm 驅動程式庫,進而讓其他區塊裝置顯示,供 fshost 檢查。當它偵測到 zxcrypt 分割區時,也會執行類似的操作,因為磁碟必須解密才能使用。載入 fvm 和 zxcrypt 後,fshost 會尋找適當的區塊裝置,並啟動 minfs 和 blobfs 檔案系統,這些檔案系統是系統正常運作所需。
啟動順序
元件管理員通常會在需要時延遲啟動元件,以回應存取元件提供的能力。元件也可以標示為「eager」,這會導致元件在父項啟動時一併啟動。
執行後,fshost 會嘗試從驅動程式管理器存取 /dev
句柄,進而啟動驅動程式管理器。它們會一同啟動驅動程式和檔案系統,最後結束 pkgfs 執行作業。此時,fshost 會開始回應 /pkgfs
句柄上的請求,元件管理員會繼續啟動使用者空間的其餘部分。
TODO(https://fxbug.dev/42053321): This diagram is no longer accurate as of https://cs.opensource.google/fuchsia/fuchsia/+/124f955ae0d1db1c7e991684c7e8a9b4528d6806.
啟動完成
此時,系統已準備好透過 FIDL 通訊協定和服務,或直接透過 component_manager 提供的服務,啟動其他元件。