1. 主页
  2. 文档
  3. Fuchsia OS 简体中文文档 2021
  4. 概念
  5. 文件系统
  6. 块设备

块设备


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

特定的块设备驱动程序(USB、AHCI/SATA、Ramdisk、GPT 等)实现 ZX_PROTOCOL_BLOCK_CORE 协议 ,其允许客户端对事务进行排队并查询块设备。

Fast Block I/O

块设备驱动程序通常负责占用很大一部分内存,并对对特定设备的请求进行排队,以便对内存的一部分进行“read into”或“write from”。
不幸的是,由于将有限大小的消息通过 RPC 协议传输到“I/O 事务”,访问块设备通常需要重复复制到大缓冲区。

为了避免这种性能瓶颈,块设备驱动程序实现了另一种传输读写的机制:基于 FIFO 的快速协议,作用于共享的 VMO。 文件系统(或称希望与块设备交互的客户端)可以从块设备获取 FIFO,注册“transaction buffer”,并将 VMO 的句柄传递给块设备。 该协议的客户端可以在 FIFO 上发送快速、轻量级的控制消息,指示块设备驱动程序应该直接作用于已经注册的 VMO,而不是发送具有大缓冲区的“读”或“写”消息。例如,在写入文件时,文件系统(将文件表示为 VMO)可以发送一个小的 FIFO 消息,指示“从 VMO Y 的偏移量 X 开始将 N 个字节直接在磁盘上的偏移量 Z 位置开始写入”,而不是直接在 IPC 原语上传递字节,并将它们复制到块设备的内存中的新位置。当与“mmap”内存映射工具结合使用时,这在访问文件时提供了直接从客户端程序到磁盘(或相反方向)的“zero-copy”路径。

这篇文章对您有用吗?

我们要如何帮助您?

Comments

Leave a reply

您的电子邮箱地址不会被公开。 必填项已用*标注