这里描述符的是virito的通用基础组件,不依赖于总线类型,如PCI,MMIO, Channel IO 等
0. virtio基本基础组件
- Device status 域
- Feature bits
- Device Configuration space
- 一个或多个 virtqueues
1. Device status 域
驱动在发现和加载设备过程中,会经历一系列加载步骤,device status 就是在底层提示加载步骤的完成状态,底层设备通过这些状态值,知道需要完成的事情
- 状态
- ACKNOWLEDGE (1) 客户系统发现了设备,并且知道是一个virtio设备
- DRIVER (2) :客户系统找到了对应的驱动
- FAILED (128): 客户系统的驱动有问题,加载失败
- FEATURES_OK (8): 驱动已经取得了所有的features bit并协商完成了
- DRIVER_OK (4) :驱动安装完成
- DEVICE_NEEDS_RESET (64) :设备有问题且问题设备无法恢复
- 驱动
- 按照初始化步骤,不断设定device status域
- 不能清除,只能写入
- 设置了FAILED,在重新初始化前,必须对设备进行reset
- 不可以依赖DEVICE_NEEDS_RESET来处理in flight数据,应在在设备重启后,重新发送
- 设备
- 设备在reset的时候,device status域必须归零
- 在 DRIVER_OK 前,不能处理数据
- 设备进入错误状态的时候,必须设置 DEVICE_NEEDS_RESET 位,然后发送 device configuration change 中断
2. Feature Bits
设备提供所有支持的 features bit,在设备初始化期间,驱动读取 features bit 并告诉设备哪些 features 被接受,一旦协商完成,再需要协商的话,需要reset设备。通过 features bit 可以完成向后兼容,驱动可以选择最新能力的feature bit或者选择不接受没有实现的feature
- feature 位分配
- 0 to 23 特定类型设备的 feature bits
- 24 to 32 queue 的 feature bits
- 33 and above 保留.
- 有些feature bit 会表示设备有新的configuration space域
- 驱动
- 不能接受没有实现的特性的feature bits,包括关联的
- 如果设备提供的feature bits比较旧,驱动应切换为老模式,或者停止初始化
- 设备
- 不能提供没有实现的特性的feature bits,包括关联的
- 接受并校验驱动提供的feature bits的子集
- 当dirver写回feature bits后,设定FEATURES_OK状态