開始著手執行 Banjo-to-FIDL 遷移作業之前,經常會問 以下問題能幫助您辨別特殊情況或極端情況 你可能需要給出不同驅動程式庫費用。
Banjo 和 FIDL 有何不同?
Banjo 是「轉譯器」(與 FIDL 中的 fidlc
類似)。轉換
翻譯成目標語言特定檔案的介面定義語言 (IDL)。
FIDL 是 Fuchsia 的處理序間通訊 (IPC) 系統。
驅動程式庫執行階段有什麼新功能?
駕駛人可能會與驅動程式庫架構、其他駕駛人和 非驅動程式庫元件在同一驅動程式代管程序中 可以使用驅動程式庫執行階段支援的 FIDL 繫結,進行通訊 運輸基元 (亦即運動場、管道和調度工具)。這項新功能 FIDL 的變種版本稱為驅動程式執行階段 FIDL。驅動程式執行階段 FIDL 可讓驅動程式發揮新驅動程式庫執行階段的優點 包括穩定版 ABI、執行緒安全性、效能、驅動程式庫 以及培養人因作業能力、安全性和彈性(若需更多資訊,請參閱 此 RFC)。
我需要遷移 DFv1 驅動程式庫才能使用驅動程式庫執行階段嗎?
將 DFv1 驅動程式庫從 Banjo 遷移至 FIDL 時,驅動程式庫執行階段 只有在駕駛人與其他司機通訊時,才需要遷移 位於同一驅動程式代管程序上。(請參閱「如何判斷我的驅動程式庫? 聯絡位於相同程序的其他駕駛?下文)。
遷移驅動程式庫以使用新的驅動程式庫執行階段的一大優勢 是會改變驅動程式庫與共置地點通訊的方式 使用驅動程式庫執行階段 FIDL 即可。不過, 現在可以開始遷移驅動程式庫以使用驅動程式庫執行階段 (如果驅動程式) 使用的是 Banjo 或已使用 FIDL,但它是根據原版 您需要先進行變更,確保所有 驅動程式是使用 FIDL 進行。
好消息是驅動程式庫執行階段 FIDL 的語法與
FIDL C++ 電線繫結。唯一的差別在於
。一些命名空間
其使用的類別或原始版本為 fdf
,而非原始類別 (例如
fdf::WireServer
),但資料中仍使用 FIDL 電線繫結類型
交易次數 (例如 fidl::VectorView
)。
如何得知駕駛人和位於相同地點的其他司機通訊?
如要確認你的驅動程式庫是否和位於以下地點的其他司機通訊,
相同程序 (在這種情況下,您必須遷移驅動程式庫,才能使用
驅動程式庫執行階段),請檢查
查看驅動程式庫的元件資訊清單檔案 (.cml
),然後找出
colocate
欄位,例如:
program: {
runner: "driver",
compat: "driver/wlansoftmac.so",
bind: "meta/bind/wlansoftmac.bindbc",
colocate: "true",
default_dispatcher_opts: [ "allow_sync_calls" ],
},
use: [
{ service: "fuchsia.wlan.softmac.Service" },
],
(資料來源:wlansoftmac.cml
)
如果 colocate
欄位為 true
,這個驅動程式庫會與其他驅動程式通訊
共存於同一個程序
如要查看共置哪些驅動程式,可以執行
ffx driver list-hosts
指令,例如:
$ ffx driver list-hosts
...
Driver Host: 11040
fuchsia-boot:///#meta/virtio_netdevice.cm
fuchsia-boot:///network-device#meta/network-device.cm
Driver Host: 11177
fuchsia-boot:///#meta/virtio_input.cm
fuchsia-boot:///hid#meta/hid.cm
fuchsia-boot:///hid-input-report#meta/hid-input-report.cm
Driver Host: 11352
fuchsia-boot:///#meta/ahci.cm
...
共同居住的司機使用相同的驅動程式代管程序。在這個範例中,
「virtio_netdevice.cm
」和「network-device.cm
」驅動程式是在同一處。
何時需要使用調度工具?
不建議在驅動程式中建立執行緒。司機改採 請使用調度器。調度員是虛擬執行緒 驅動程式庫執行階段執行緒集區的排程。然後產生一個 FIDL 檔案 用戶端和伺服器範本及資料類型,在這些項目中 用戶端和伺服器結束時的管道,調度器會在每次擷取最終擷取作業時 管道的資料
調度器是驅動程式庫執行階段專用的, DFv1 和 DFv2調度員主要用於 FIDL 通訊 但可以用於其他用途 就會中斷核心作業
將 DFv1 驅動程式庫從 Banjo 遷移至 FIDL 時,新的執行緒模型會有什麼問題?
FIDL 呼叫不是以單一執行緒為基礎,而且在設計上為非同步
(雖然您也可以在 FIDL 呼叫中新增 .sync()
,藉此讓這些物件保持同步
或使用 fdf::WireSyncClient
)。一般不建議駕駛人
同步呼叫,因為它們可能會阻止其他工作執行。
(但如有需要,驅動程式庫可以使用
FDF_DISPATCHER_OPTION_ALLOW_SYNC_CALLS
選項 (僅支援正確格式)
(適用於同步處理調度工具)。
從 Banjo 遷移至 FIDL 的過程中,您可能會遇到第一個問題 不同於 FIDL,Banjo 會翻譯 IDL 定義語言) 轉換為由函式指標 (或稱「函式指標」) 組成的結構 以及資料類型基本上,在 Banjo 的協助下,搭起司機的橋樑, 同步函式呼叫的驅動程式
由於 Banjo 和 FIDL 執行緒模型的差異, 您需要決定哪一種 FIDL 呼叫類型 (即同步或 並想在遷移時使用。如果您的原始程式碼是 他按照 Banjo 同步性質設計,因此難以解開 改為所有非同步的項目 首次使用 FIDL 的同步版本 (但可能會產生 這段期間內成效可能降低)。稍後您可以回頭查看 呼叫並將呼叫最佳化至使用非同步呼叫。
從 Banjo 遷移至 FIDL 之後,我需要在驅動程式庫的單元測試中進行哪些變更?
如果有任何單元測試是根據驅動程式的 Banjo API 開發, 您必須建立模擬 FIDL 用戶端 (或伺服器,取決於您的 測試伺服器或用戶端)。若需更多資訊,請參閲 更新 DFv1 驅動程式庫的單元測試以使用 FIDL。