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
标准的设备,可以使用如下的复用。