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 但是以原始傳輸為基礎 (Zircon 基本項目),您必須先進行變更,讓驅動程式庫中的所有通訊才能使用 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.cmnetwork-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」。