IO 设备的虚拟化 物理设备仿真 对传统物理设备进行仿真是 KVM 最早期采用的支持虚拟机 IO 的方式。 这种方式的特点是客操作系统看到的设备和通常裸机操作系统上看到的设备有相同的格式和规范,如同样格式的 PCI 配置空间,同样的 MMIO 区域尺寸和格式,同样的 PIO 寄存器和功能。 因此客操作系统能使用已有的传统物理设备的驱动来访问这些仿真的设备。这种方式的好处是不要求客操作系统做任何软件上的改变linux。 设备仿真的实现过程主要是让 VMM 截取客操作系统对设备 MMIO 和 PIO 空间的访问,然后分派不同的后端来处理与 MMIO 或 PIO 访问对应的逻辑。 就 KVM 而言,一般平台型设备,如 PIT, PIC, APIC 等是直接在 KVM内核中实现后端的代码的, 而 PCI 总线上的设备或更外围的方式连接的设备,由于其逻辑的复杂性,都是通过 qemu-kvm 在用户空间来仿真的linux。 在 KVM 内核空间的 MMIO 和PIO 实现比较简单, KVM 实现了一个抽象的 IO_BUS模型,把所有的设备都按 struct kvm_io_device 抽象实现,要求每个都提供自己的 struct kvm_io_dev_ops 接口的实现, 每个平台设备的 structkvm_io_dev_ops 的 read/write 函数的主要功能就是根据 IO 地址读写该设备内核数据结构的不同部分, 并根据数据的值变化实现一定的逻辑。
|