在您开始执行从 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.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 调用(即同步调用或 异步存储)。如果您的原始代码是 围绕班卓琴的同步性质而设计 全部设为异步执行,则不妨考虑使用 同步版本的 FIDL(不过,这可能会导致 性能下降)。稍后,您可以回顾这些内容 并将其优化为使用异步调用
从 Banjo 迁移到 FIDL 后,我需要在驱动程序的单元测试中进行哪些更改?
如果有针对驱动程序的基于 Banjo API 的单元测试, 您需要创建一个模拟 FIDL 客户端(或服务器,具体取决于您 测试服务器或客户端)。如需了解详情,请参阅 更新 DFv1 驱动程序的单元测试,以使用 FIDL。