Banjo-to-FIDL 遷移的常見問題

開始著手執行 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