设备操作

有关这些方法的说明,请参阅标头注释

钩子排序保证

钩子排序保证

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

术语

本部分使用 C++ 执行模型中会用到的术语“未排序”“不确定性排序”和“之前排序”。

驱动程序初始化

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

驱动程序拆解

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

驱动程序绑定

如果启用了测试,则只有在 run_unit_tests 钩子之后,zx_driver_ops_t bind 钩子才会开始执行。

设备生命周期

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

设备生命周期在设备的释放钩子开始执行时结束。

除非另有指定,否则 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 钩子的执行都在此之前进行。

由于 read/write/message 钩子仅在驱动程序主机的主线程上执行,因此它们绝不会并发执行,但对来自不同连接的待处理请求的处理将是不确定的排序。

其他设备 API

对于所有钩子(包括自身的并发调用),zx_device_ops_t get_sizeget_protocol 钩子均不排序。唯一的例外情况是它们在 release 钩子之前进行排序。