開機和元件間的所有內容

警告:這份文件最近未經過審查,許多詳細資料可能已過時。

本文旨在從高階角度詳細說明機器開機到系統執行軟體元件之間的所有過程。

大綱:

核心

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

核心 (Zircon) 在系統上執行後,主要目標是啟動使用者空間,以便執行程序。由於 Zircon 類似於微核心,因此在這個階段不必執行大量作業 (尤其是與 Linux 相比)。第一個使用者程序的執行檔會烘烤到核心中,核心會將其複製到新程序並啟動。這個程式稱為 userboot。

初始程序

Userboot 經過精心建構,方便核心啟動,否則核心必須實作許多程序啟動功能 (例如程式庫載入器服務),但這些功能在第一個程序啟動後就不會再使用。

Userboot 的工作非常簡單,就是尋找並啟動下一個程序。 核心會將 ZBI 的控制代碼提供給使用者啟動程序,ZBI 內含 <0Userboot 會讀取 ZBI 以找出啟動檔案系統映像檔, 視需要解壓縮,然後複製到新的 <0x0啟動檔案系統映像檔包含唯讀檔案系統,使用者啟動程序接著會存取該檔案系統,以尋找可執行檔及其程式庫。接著,系統會啟動下一個程序,也就是元件管理員。

除非在核心指令列中提供 userboot.shutdown 選項,否則 Userboot 可能會在這一點結束。

下一個程序是元件管理員,由使用者啟動程序 動態連結。因此,對於提早啟動的複雜邏輯而言,這比使用者啟動程序更適合做為首頁,因為它可以運用程式庫。由於這個元件管理員會為子項執行各種 FIDL 服務,因此最值得注意的啟動用途是啟動檔案系統,這是以 FIDL 為基礎的檔案系統,由使用者啟動程序解壓縮的啟動檔案系統映像檔支援。此外,它也會完成 ZBI 的剖析作業、取消不必要的頁面,並使用擷取的資訊代管項目、項目工廠和引數服務。

元件管理員會將程序標示為「重大」,也就是說,如果發生錯誤並導致程序當機,該程序所在的「工作」就會終止。由於這項服務是在根工作中執行,而根工作具有特殊屬性,如果遭到終止,核心會強制重新啟動系統,因此元件管理員當機時會導致重新啟動。

元件管理員

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

元件管理員執行的元件會整理成樹狀結構。其中有一個根元件,並有兩個名為 bootstrap 和 core 的子項。Bootstrap 的子項是系統的必要部分,可讓系統正常運作,進而執行包含使用者體驗的高階軟體。

根目錄、啟動程序和核心元件都是不可執行的元件,也就是說,系統上沒有對應的執行程式。僅供整理用途。

這張圖表顯示 fshost 和驅動程式管理器是 bootstrap 元件的子項,而核心和 bootstrap 則是根元件的子項。

初始系統元件

背景

在 bootstrap 底下有兩個重要元件:fshost 和驅動程式管理器。這兩個元件會共同運作,啟動所有面向使用者的軟體,提供足夠的系統功能。

驅動程式管理器

驅動程式管理員是負責尋找硬體、執行驅動程式來服務硬體,以及向 Fuchsia 公開 devfs 控制代碼的元件。Devfs 即將淘汰,改用驅動程式庫直接公開的服務。(請參閱「與司機通訊」一節)

驅動程式是由 驅動程式主機執行的子程序,每個驅動程式庫都是儲存在啟動檔案系統或套件中的動態程式庫,驅動程式庫執行時,會動態連結至驅動程式代管程序,然後運作執行。

驅動程式管理器啟動時,系統不會提供儲存在套件中的驅動程式,因為這些驅動程式儲存在磁碟上,且必須先執行驅動程式,檔案系統的區塊裝置才會顯示。載入檔案系統前,只能載入及執行 Zircon 開機映像檔 (ZBI) 中的驅動程式。驅動程式索引是元件,可瞭解系統中所有驅動程式的所在位置。Driver Index 會在基礎套件載入完成並找到基礎驅動程式時,通知 Driver Manager。

fshost

Fshost 負責尋找區塊裝置、啟動檔案系統程序來服務這些區塊裝置,以及為這些檔案系統提供控制代碼給 Fuchsia 的其餘元件。為達成此目的,fshost 會嘗試存取其命名空間中的 /dev 控制代碼。這項能力由驅動程式管理器提供。

fshost 找到區塊裝置後,會從每個裝置讀取標頭,偵測檔案系統類型。一開始會找到指向其他區塊裝置分割區的 (fvm) 區塊。Fshost 會使用 devfs,讓驅動程式管理器執行這個區塊裝置的 FVM 驅動程式庫,進而讓其他區塊裝置顯示供 fshost 檢查。如果發現 zxcrypt 分區,也會採取類似做法,因為磁碟必須解密才能使用。載入 fvm 和 zxcrypt 後,fshost 會找出適當的區塊裝置,並啟動 minfs 和 blobfs 檔案系統,這是系統正常運作的必要條件。

啟動順序

一般來說,元件管理工具會根據需求延遲啟動元件,以回應存取元件所提供能力的動作。元件也可以標示為「急切」,這會導致元件在父項啟動的同一時間啟動。

執行後,fshost 會嘗試從驅動程式管理器存取 /dev 控制代碼,這會導致驅動程式管理器啟動。兩者會一起啟動驅動程式和檔案系統,最終執行 pkgfs。此時,fshost 會開始回應 /pkgfs 控制代碼的要求,而元件管理員會繼續啟動其餘的使用者空間。

TODO(https://fxbug.dev/42053321):這個圖表已不準確,請參閱 https://cs.opensource.google/fuchsia/fuchsia/+/124f955ae0d1db1c7e991684c7e8a9b4528d6806。

循序圖:顯示 fshost 和驅動程式庫管理員之間的啟動順序。

啟動完成

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