为什么需要IO虚拟化

​ 如果让VM直接管理物理网卡:

  • 正确性问题:所有的VM都使用相同的MAC地址、IP地址无法正常接受发送网络包

  • 安全性问题:恶意VM可以直接读取其他VM的数据

​ 而I/O虚拟化的目标就是,为虚拟机提供正常使用虚拟外部设备,隔离不同虚拟机对于外部设备的访问,提高物理设备的资源利用率。

如何实现IO虚拟化

设备模拟

​ 当虚拟机中的程序试图访问网卡时,就会陷入虚拟机,KVM会使用QEMUQEMU会发起一次系统调用,请求物理机上的网卡驱动。之后再原路返回。

​ 这样的话就可以模拟任何设备,还允许在QEMU的层面检查网络包的内容,还不用修改硬件。但是性能非常差。

半虚拟化方式

​ 让虚拟机知道运行在虚拟化环境下,虚拟机运行前端驱动,VMM运行后端驱动,VMM主动提供HypercallVM,通过共享内存传递指令和命令。

VMMVM之间存在一个传递IO请求的队列:

​ 通过一个IO队列直接将请求发送给VMM,可以将多个IO合并为一个,同时实现简单。但是需要修改虚拟机和操作系统内核。

设备直通

​ 如果让虚拟机直接管理物理设备,会存在诸如DMA恶意读写内存的问题。

SMMUARMIOMMU的实现,这里也存在两阶段地址翻译,IOVA->GPA,第二个阶段进行GPA->HPA

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