设备操作

如需了解有关这些方法的说明,请参阅标题注释。

钩子排序保证

钩子排序保证

驱动程序实现的钩子将由其他驱动程序和运行时调用。在某些情况下,这些调用可能会与其他钩子(甚至是同一钩子)的调用并行发生。本部分将介绍您可能依赖的排序属性。

术语

本部分使用 unsequenced、indeterminately sequenced 和 sequenced before 这些术语,它们在 C++ 执行模型中的含义与此处相同。

驱动程序初始化

zx_driver_ops_t init 钩子将在该驱动程序的任何其他钩子之前完全执行。

驱动程序拆解

只有在释放了此驱动程序创建的所有设备后,zx_driver_ops_t release 钩子才会开始执行。

驱动程序绑定

如果启用了测试,zx_driver_ops_t bind 钩子将仅在 run_unit_tests 钩子之后开始执行。

设备生命周期

当某个驱动程序成功调用 device_add() 时,设备生命周期开始。这可能发生在任何线程上。在设备生命周期开始之前或结束之后,不会运行任何 zx_device_ops_t 钩子。

当设备的 release 钩子开始执行时,设备生命周期结束。

除非另有说明,否则 zx_device_ops_t 钩子彼此之间没有顺序。

注意:这意味着,在调用 device_add() 之后出现的任何代码(即使在 bind 钩子中)都与所创建设备的生命周期结束无序。

设备连接生命周期

设备连接生命周期从 zx_device_ops_t open 钩子开始执行时开始。如果有效设备连接的数量为 0,则不会调用任何 zx_device_ops_t read/write/message/close 钩子。

当 zx_device_ops_t close 钩子开始执行时,设备连接生命周期结束。任何 read/write/message hook 的执行都排在它之前。

由于 read/write/message 钩子仅在驱动程序主机的主线程上执行,因此它们永远不会并发执行,但来自不同连接的未完成请求的处理将按不确定的顺序进行。

其他设备 API

zx_device_ops_t 的 get_size 和 get_protocol 钩子与所有钩子(包括自身的并发调用)相比是无序的。唯一的例外情况是,它们在 release 钩子之前按顺序执行。