元件組軟體

元件是指執行於 紫紅色。每個元件都是可組合函式、採用沙箱機制的模組, 與其他元件一樣這麼做可促進系統安全 因為各個元件之間有清楚的介面 更新或取代

在 Fuchsia 中,「所有元件」 (幾乎都是構成要素)回顧先前討論 Zircon 的內容,核心的表面積是故意縮小,大部分核心服務都是在使用者空間中實作。也就是說 我們在 Fuchsia 中運作的軟體是使用元件架構 包括:

  • 面向使用者的應用程式
  • 裝置驅動程式
  • 檔案系統
  • 媒體轉碼器
  • 網路堆疊

核心外,只有少數低階例外狀況使用 例如元件啟動載入程式和 userboot 程序。

元件管理員

元件架構的核心是元件管理工具。是 協調所有元件執行個體的執行作業 賦予他們自己的能力 元件。

元件可以明確啟動 (例如從網址),也可以從特定功能的要求中隱含啟動。元件管理員會執行 判斷是否要啟動新元件或路徑 將要求傳送至現有執行個體如要進行此轉送,每個元件都必須宣告其提供給系統的任何功能,以及使用的任何功能。

元件管理員會剖析每個元件的宣告,以決定如何執行元件並提供必要功能。元件為 通常是透過元件資訊清單檔案 變更元件的套件

以下為說明 ELF 的元件資訊清單的簡單範例 可執行檔,但有一些額外的指令引數:

program: {
    runner: "elf",
    binary: "bin/hello",
    args: [ "Hello", "World!" ],
},

請注意,這個執行階段宣告會告知元件管理員,這個元件需要 ELF 執行程式這是功能的範例!

元件功能

元件可透過功能取得權限,存取更廣泛的系統。每個元件都可以宣告提供給系統的新功能,以及其他元件 (或架構) 提供的功能,以便執行所需的功能。

如您所見,runner 是宣告執行階段的能力範例 元件所用的儲存時間以下列舉幾個常見能力類型 directory:存取檔案系統資源,protocol (用於通訊) 與其他元件互動

開發人員可使用元件資訊清單,宣告元件所需的功能類型。以下是要求取得的元件資訊清單示例 兩項功能:example-data 目錄和服務讀取權限 如 fuchsia.example.Foo FIDL 通訊協定所述。

use: [
    {
        directory: "example-data",
        rights: [ "r*" ],
        path: "/example/data",
    },
    {
        protocol: "fuchsia.example.Foo",
    },
]

元件管理員會使用能力宣告,填入每個元件的 命名空間在這個範例中 會在其命名空間中收到 /example/data/svc/fuchsia.example.Foo

元件組織

系統中的所有元件都組成單一 Root 權限 元件執行個體樹狀結構。這個樹狀結構會管理元件行為的幾個重要層面。

說明元件執行個體的組織方式的樹狀圖。這些父項和子項關係會管理元件行為的多個層面。

樹狀結構中的父項元件負責建立 當做其他元件 即便沒有技術背景,也能因這些工具的功能而受益同時,子元件也可以將功能公開給父項。您可以透過下列任一方式建立子項元件:

  • 靜態:父項會在其元件宣告中宣告子項的存在。
  • 動態:父項將子項加入位於 執行 fuchsia.component.Realm 通訊協定。

任何父項元件及其所有子項都會在樹狀結構中形成一個稱為「realm」的群組。運作範圍可讓家長控管要導入哪些功能 從元件的子樹狀結構繪製出能力邊界 元件會決定是否使用 expose 關鍵字:

expose: [
    {
        protocol: "fuchsia.example.Foo",
        from: "self",
    },
],

能力公開到領域後,父項就能共用該功能 相同領域中的元件這項操作可使用 offer 關鍵字完成:

offer: [
    {
        protocol: "fuchsia.example.Foo",
        from: "self",
    },
],

元件管理員 可以解決 要求存取能力 可提供該能力這項功能稱為「功能轉送」。 元件管理服務只能解析已公開方案

這張圖表顯示如何透過這些功能共享功能
  能力轉送」其說明在 Pod 中
  就特定領域而言

練習:元件

在本練習中,您將探索元件執行個體樹狀結構並詳細瞭解 使用某些核心系統元件在能力轉送過程中實際運作

啟動模擬器

如果您還沒有執行中的執行個體,請啟動模擬器:

ffx emu start --headless

啟動完成後,模擬器會顯示下列訊息並 會傳回:

Logging to "$HOME/.local/share/Fuchsia/ffx/emu/instances/fuchsia-emulator/emulator.log"
Waiting for Fuchsia to start (up to 60 seconds)........
Emulator is ready.

探索系統元件

開啟另一個終端機視窗,然後使用 component list 指令傾印 系統元件樹狀結構:

ffx component list

您應該會看到類似以下 (經截斷) 的輸出內容:

/
/bootstrap
/bootstrap/archivist
/bootstrap/base_resolver
/bootstrap/console
/bootstrap/console-launcher
/bootstrap/decompressor
/bootstrap/device_name_provider
/bootstrap/driver_manager
/bootstrap/fshost
/bootstrap/kernel_debug_broker
/bootstrap/miscsvc
/bootstrap/netsvc
/bootstrap/power_manager
/bootstrap/ptysvc
/bootstrap/pwrbtn-monitor
/bootstrap/shutdown_shim
/bootstrap/sysinfo
/bootstrap/virtual_console
/core
/core/activity
...
/core/detect
/core/font_provider
/core/log-stats
/core/remote-control
/core/sampler
/core/system-update-committer
/core/temperature-logger
/core/test_manager
/core/full-resolver
/startup

這份清單代表元件執行個體樹狀結構bootstrapcorestartup 等元件會形成子樹狀結構 在根目錄底下進行。

component show 指令會提供各組成元素的詳細資訊。

您可以使用這個指令查看 http-client 的詳細資料;這個元件提供的元件 HTTP 要求服務:

ffx component show http-client.cm

這項指令會輸出以下報告:

               Moniker: /core/network/http-client
                   URL: #meta/http-client.cm
                  Type: CML static component
       Component State: Resolved
 Incoming Capabilities: config
                        fuchsia.logger.LogSink
                        fuchsia.net.name.Lookup
                        fuchsia.posix.socket.Provider
                        pkg
  Exposed Capabilities: fuchsia.net.http.Loader
           Merkle root: d9e73f5b061f2f227e596e2e0079ff3a095fc69e192cf85e0d7621826c76356c
       Execution State: Running
          Start reason: '/core/feedback' requested capability 'fuchsia.net.http.Loader'
         Running since: ...
                Job ID: 41268
            Process ID: 41311
 Outgoing Capabilities: fuchsia.net.http.Loader

請注意這裡列出的一些細節:

  1. 元件例項的專屬 ID (稱為「別名」)。
  2. 這個元件載入的套件網址。
  3. 元件的執行狀態。
  4. 執行個體目前執行的工作/程序 ID。
  5. 一組要求和公開的功能。

追蹤能力路徑

在前述輸出內容中,列出了三個能力群組:

  • 傳入功能:元件使用 use 宣告的功能。這些詳細資料是透過其命名空間提供給元件。
  • 傳出功能:元件已發布至其傳出目錄的功能。
  • 公開功能:元件使用 expose 宣告的功能。這些是元件的公開服務

http-client 向其父項 領域公開的其中一項功能是 fuchsia.net.http.Loader. 這可讓其他元件發出 HTTP 要求。

使用 component capability 指令判斷有多少元件與此功能互動:

ffx component capability fuchsia.net.http.Loader

這個指令會列出所有相符的元件:

Exposed:
  /core/network/http-client
  /core/network
Used:
  /core/cobalt
  /core/feedback
  /core

這表示 cobaltfeedback 元件會使用這項功能 (也就是在「Incoming Capabilities」下方列出這項功能)。這些元件之間的共同祖系是 core,可處理將此功能路由至必要子項的作業。