virtio协议1.0 -- PCIe 类型的 Virtio 设备

引子

  • virtio 可以使用不同类型的总线,这里讲解PCIe类型的virtio设备
  • virtio通常实现为PCIe类型
  • virtio可以是PCI设备也可以是PCIe设备
  • 设备
    • 设备暴露给客户机的接口需要符合PCI/PCIe规范

PCI 设备发现

  • vendor id:   0x1af4
  • device id:   0x1040 + ${Virtio Device ID},确定具体设备类型,Legacy的是 0x1000 到 0x103F
  • 设备
    • PCI Vendor ID 必须是 0x1AF4
    • device id:   0x1040 + ${Virtio Device ID}(从1开始),Legacy的是 0x1000 到 0x103F
  • 区别
    • device id:   0x1040 + ${Virtio Device ID}(从1开始),Legacy的是 0x1000 到 0x103F

PCI 设备布局

  • 通过IO 和 MMIO 的方式配置 Virtio PCI Capabilities 结构
  • device configuration regions 有不同的长度
  • 64-bit; 32-bit; 16-bit 都是按照小端序处理
  • 64-bit 作为2个32-bit处理, 高32-bit 后面是 低32-bit
  • 驱动
    • 8-bit 方式访问 8-bit域
    • 16-bit 方式对齐访问 16-bit域
    • 32-bit 方式对齐访问 32-bit域 和 对齐访问 64-bit域
    • 64-bit 域的高、低32-bit访问是独立进行的
  • 设备
    • 64-bit device configuration,设备必须支持驱动高、低32-bit 进行独立访问

Virtio PCI Capabilities 结构

  • virtio device configuration 布局结构组成
    • Common configuration
    • Notifications
    • ISR Status
    • Device-specific configuration (可选)
    • PCI configuration access
  • 结构访问方式
    • Base Address register (BAR) 映射
    • 访问 PCI configuration space 的 special VIRTIO_PCI_CAP_PCI_CFG 域
  • 结构的位置
    • PCI configuration 空间中的 capability 列表中的 vendor特定的 PCI capability 类型来指定的具体capability位置
    • virtio capability 结构使用小端序
    • 除了stated 其他所有的域都是只读的
    • virtio capability 定义,根据 cfg_type,结构后面可以跟 extra data
      • cap_vndr:0x09,标明是一个 vendor-specific capability
      • cap_next:连接到 PCI configuration space 的下一个capability
      • cap_len:capability 结构长度,包括 struct virtio_pci_cap 和 extra data,可能含有padding
      • cfg_type:标明了 结构的类型,其他值保留,每种结构可以出现2次,先出现的结构优于后出现的结构,如两个 PCI_CAP_NOTIFY_CFG
      • bar:0x0 到 0x5,指定该function使用 PCI Configuration Space 10h 处的哪个BAR,映射到 Memory 或 I/O Space
      • offset :结构相对于BAR指定地址的偏移量
      • length:结构长度
    • 驱动
      • 驱动必须忽略cfg_type为保留值的 vendor-specific capability 结构或 bar为保留值的 vendor-specific capability
      • 驱动应该使用最先匹配到的某类型的 virtio 结构
      • 驱动不能对capability结构进行写入
    • 设备

      • 如果同一个类型的capability结构出现多次,按照优先级排序
      • 如果有extra data,必须包含在 cap_len. 中,cap_len.中可能还有padding
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值