屏蔽设备

Fuchsia Block 设备驱动程序与系统中的其他驱动程序一样,实现为可通过 IPC 访问的用户空间服务。使用块设备的程序将具有这些底层驱动程序的一个或多个句柄。与文件系统客户端(可通过在 RPC 消息中编码这些请求来向服务器发送“读取”或“写入”请求)类似,程序可以充当客户端来阻止设备,并且可能会将 RPC 消息传输到“设备主机”(在 Zircon 中称为“devhost”)。然后,devhost 进程将这些请求转换为驱动程序理解的“I/O 事务”,在这些事务中,它们实际上传输到特定的块存储设备驱动程序,并最终传输到真实的硬件。

某些块设备驱动程序(USB、AHCI / SATA、Ramdisk、GPT 等)会实现 ZX_PROTOCOL_BLOCK_CORE 协议,该协议可让客户端将事务加入队列并查询块存储设备。

快速块 I/O

块设备驱动程序通常负责占用大部分内存,并将发送到特定设备的请求加入队列,以便“读入”或“从”一部分内存“写入”。遗憾的是,由于将大小有限的消息从 RPC 协议传输到“I/O 事务”,因此访问块设备通常需要重复复制大型缓冲区。

为避免这种性能瓶颈,块设备驱动程序实现另一种机制来传输读写操作:基于 FIFO 的快速协议,对共享 VMO 起作用。文件系统(或希望与块设备交互的任何其他客户端)可以从块设备获取 FIFO,注册“事务缓冲区”,并将句柄传递到 VMO 传递给块设备。使用此协议的客户端可以在 FIFO 上发送快速轻量级控制消息,指示块设备驱动程序应直接在已注册的 VMO 上执行操作,而不是使用大型缓冲区传输“读取”或“写入”消息。例如,在向文件写入数据时,无需直接通过 IPC 基元传递字节并将其复制到块设备内存中的新位置,文件系统(将文件表示为 VMO)可以直接发送一条简短的 FIFO 消息,指示“从 VMO Y 的偏移量 X 中直接写入 N 个字节,以从路径上的其他内存偏移 Z”与“在磁盘上直接复制路径的 Z”。