元件是指執行於 紫紅色。每個元件都是可組合函式、採用沙箱機制的模組, 與其他元件一樣這麼做可促進系統安全 因為各個元件之間有清楚的介面 更新或取代
在 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
通訊協定。
任何父項元件及其所有子項都會在樹狀結構中形成一個群組,稱為
運作範圍。運作範圍可讓家長控管要導入哪些功能
從元件的子樹狀結構繪製出能力邊界
元件會決定是否使用
expose
關鍵字:
expose: [
{
protocol: "fuchsia.example.Foo",
from: "self",
},
],
能力公開到領域後,父項就能共用該功能
相同領域中的元件方法是使用 offer
關鍵字:
offer: [
{
protocol: "fuchsia.example.Foo",
from: "self",
},
],
元件管理員 可以解決 要求存取能力 可提供該能力這項功能稱為「功能轉送」。 元件管理服務只能解析已公開且 方案。
練習:元件
在本練習中,您將探索元件執行個體樹狀結構並詳細瞭解 使用某些核心系統元件在能力轉送過程中實際運作
啟動模擬器
如果您尚未擁有執行中的執行個體,請透過網路啟動 FEMU 支援服務:
ffx emu start workstation_eng.x64 --headless
探索系統元件
開啟另一個終端機視窗,然後使用 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
這份清單代表元件執行個體樹狀結構,
bootstrap
、core
和 startup
等元件會形成子樹狀結構
在根目錄底下進行。
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
請注意這裡列出的一些細節:
- 元件執行個體的專屬 ID (稱為「猴子」)。
- 此元件的載入套件網址。
- 元件的執行狀態。
- 執行個體目前執行的工作/程序 ID。
- 一組要求和公開的功能。
追蹤能力路徑
先前的輸出內容列出了三個能力群組:
- 傳入的功能:元件宣告的功能
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
這表示 cobalt
和 feedback
元件會使用這項能力
(也就是說,將這項功能列在「傳入功能」下方)。共同祖系
這些元件之間的 core
會處理這項能力的轉送作業
所有必要的孩子