从 Banjo 到 FIDL 迁移的常见问题解答

在您开始执行从 Banjo 到 FIDL 的迁移之前, 下面的问题可以帮助您确定特殊情况或极端情况 可能适用于您的司机的情况。

Banjo 和 FIDL 有什么区别?

Banjo 是一种“转译器”(类似于 FIDL 中的 fidlc)。它可以将 将接口定义语言 (IDL) 转换为目标语言特定文件。 FIDL 是 Fuchsia 的进程间通信 (IPC) 系统。

驱动程序运行时中的新变化

驱动程序可以与驱动程序框架、其他驱动程序等实体通信, 非驱动程序组件。在同一驱动程序主机中的驱动程序中, 可使用由驱动程序运行时支持的 FIDL 绑定来进行通信 传输基元(即 arena、频道和调度程序)。这种新的 FIDL 变种称为驱动程序运行时 FIDL。驱动程序运行时 FIDL 可让驱动程序实现全新驱动程序运行时的优势, 包括稳定的 ABI、线程安全、性能、驱动程序 作者工效学、安全性和弹性。(有关详情,请参阅 此 RFC。)

我需要迁移 DFv1 驱动程序才能使用驱动程序运行时吗?

将 DFv1 驱动程序从 Banjo 迁移到 FIDL 时,驱动程序运行时 仅当您的司机与其他司机通信时,才需要进行迁移 位于同一驱动程序主机中。(请参阅如何知道我的驾驶员 与位于同一进程的其他驱动程序对话?)。

迁移驱动程序以使用新的驱动程序运行时的一个主要优势 它改变了驾驶员与同位客户通信的方式 驱动程序,这通过使用驱动程序运行时 FIDL 来完成。不过, 您可以开始迁移驱动程序以使用驱动程序运行时 正在使用 Banjo 或已在使用 FIDL,但采用的是 Banjo 的原始版本 传输(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 调用(即同步调用或 异步存储)。如果您的原始代码是 围绕班卓琴的同步性质而设计 全部设为异步执行,则不妨考虑使用 同步版本的 FIDL(不过,这可能会导致 性能下降)。稍后,您可以回顾这些内容 并将其优化为使用异步调用

从 Banjo 迁移到 FIDL 后,我需要在驱动程序的单元测试中进行哪些更改?

如果有针对驱动程序的基于 Banjo API 的单元测试, 您需要创建一个模拟 FIDL 客户端(或服务器,具体取决于您 测试服务器或客户端)。如需了解详情,请参阅 更新 DFv1 驱动程序的单元测试,以使用 FIDL