IO虚拟化

为什么需要IO虚拟化
如果让VM直接管理物理网卡:
-
正确性问题:所有的
VM都使用相同的MAC地址、IP地址无法正常接受发送网络包 -
安全性问题:恶意
VM可以直接读取其他VM的数据
而I/O虚拟化的目标就是,为虚拟机提供正常使用虚拟外部设备,隔离不同虚拟机对于外部设备的访问,提高物理设备的资源利用率。
如何实现IO虚拟化
设备模拟

当虚拟机中的程序试图访问网卡时,就会陷入虚拟机,KVM会使用QEMU,QEMU会发起一次系统调用,请求物理机上的网卡驱动。之后再原路返回。
这样的话就可以模拟任何设备,还允许在QEMU的层面检查网络包的内容,还不用修改硬件。但是性能非常差。
半虚拟化方式
让虚拟机知道运行在虚拟化环境下,虚拟机运行前端驱动,VMM运行后端驱动,VMM主动提供Hypercall给VM,通过共享内存传递指令和命令。

VMM和VM之间存在一个传递IO请求的队列:

通过一个IO队列直接将请求发送给VMM,可以将多个IO合并为一个,同时实现简单。但是需要修改虚拟机和操作系统内核。
设备直通
如果让虚拟机直接管理物理设备,会存在诸如DMA恶意读写内存的问题。

SMMU是ARM中IOMMU的实现,这里也存在两阶段地址翻译,IOVA->GPA,第二个阶段进行GPA->HPA。

除了隔离问题,还要解决设备独占的问题,满足SR-IOV标准的设备,可以使用如下的复用。
