Skip to content

VirtIO-Blk 规格

1. 设备目标

VirtIO-Blk 将来宾块请求映射到用户通过 --disk 指定的宿主镜像。镜像是外部产物,路径由 CLI 传入且使用仓库根目录相对路径示例,例如 artifacts/disk/rootfs.ext4

2. 基本参数

  • BLK-REQ-001:逻辑扇区固定为 512 字节。
  • BLK-REQ-002:capacity 以 512 字节扇区数公布,来自镜像完整大小向下取整。
  • BLK-REQ-003:镜像大小不是 512 的整数倍时必须在启动阶段拒绝或明确按冻结策略处理,不能无提示截断。
  • BLK-REQ-004:读写模式必须与公布的只读 feature 一致。

3. 请求链布局

每个请求至少包含:

  1. 设备只读的请求头,含 type、reserved、sector。
  2. 一个或多个数据描述符,方向取决于请求类型。
  3. 最后一个长度至少 1 字节且设备可写的 status 描述符。

链结构、字段大小和小端序按 VirtIO 规范校验。状态描述符缺失、方向错误或链过短时不得越界写入。

4. 请求类型

  • BLK-REQ-005:至少支持 VIRTIO_BLK_T_IN,从磁盘读到来宾可写缓冲区。
  • BLK-REQ-006:至少支持 VIRTIO_BLK_T_OUT,从来宾只读缓冲区写入磁盘。
  • Flush、Get ID、Discard、Write Zeroes 只有在实现、测试并公布对应 feature 后才接受。
  • 未支持请求返回 UNSUPP,后端 I/O 或范围错误返回 IOERR

5. 边界与偏移

  • sector × 512offset + total_data_len 必须使用检查运算。
  • 请求不得超出镜像 capacity。
  • 多描述符数据按链顺序形成一个连续块请求。
  • 读请求的来宾缓冲总长度决定实际读取范围;短宿主读取视为错误,不能以未初始化数据补齐。
  • 写请求必须避免宿主部分写被错误报告为成功;失败策略和镜像一致性必须清晰诊断。

6. 完成顺序

  1. 完整验证描述符链和磁盘范围。
  2. 执行宿主 pread/pwrite 等不依赖共享文件偏移的操作。
  3. 写 status 字节。
  4. 写 used element,len 仅统计设备写入来宾的字节数,按规范处理。
  5. 发布 used idx。
  6. 触发 VirtIO 中断并经 PLIC 注入。

失败也必须按适用规范正确完成请求;不能留下驱动永久等待,除非设备进入需要复位状态并明确通知。

7. 宿主文件安全

  • 启动时验证文件类型、访问权限和大小。
  • 不允许自动创建用户未指定的磁盘镜像。
  • 不允许扩展镜像越过启动时公布 capacity。
  • 默认不调用会改变宿主全局状态的缓存策略。
  • 异常退出前已报告成功的写入必须满足冻结的持久性语义;若仅保证页缓存可见,文档必须明确。

8. 验收条件

  • 真实 ext4 镜像可被 Linux 识别、挂载并持续读取。
  • 在允许写入的配置中,来宾创建文件后正常关机并重新启动仍可读取。
  • 覆盖首末扇区、多描述符、零长度、越界、只读和宿主短 I/O。
  • used length、status 与中断顺序符合规范。
  • 恶意描述符不能读写镜像范围之外或宿主其他文件。