IO虚拟化 设备对软件来说,就是一堆的寄存器(io端口)和IO内存,以及中断和DMA。而设备虚拟化的过程,就是模拟设备的这些寄存器和内存,然后截获Guest OS里面对IO端口和寄存器的访问,然后通过软件的
方式来模拟真实的硬件。
1)全虚拟化的IO虚拟化
在全虚拟化,因为不修改Guest OS的内核,Guest OS保存了IO设备的原生驱动。但是VMM处理设备的方式会根据VMM位置的不同而有所不同。例如,全虚拟化最有代表性的VMware ESX和VMWare
Workstattion,由于VMM实现模式不同,采用的设备虚拟化方式也不同。
在VMware ESX中,VMM直接运行在物理硬件之上,直接操作硬件设备,而Guest OS看到的则是一组统一的虚拟IO设备。Guest OS对这些虚拟设备的每一个IO操作都会陷入VMM 中,由VMM对IO指令进行解析
并映射到实际的物理设备,然后直接控制硬件完成。
而VMWare WorkStation采用了不同的方式。VMM实际上运行在一个传统的操作系统之上,这类VMM无法获得对硬件资源的完全控制,因此采用软件模拟的方式来模拟IO设备。Guest OS的IO操作会被VMM
捕获,并转发给宿主机(host OS)的一个用户态进程,该进程通过对宿主机操作系统的系统调用来模拟设备的行为。
模拟IO虚拟化方式的最大开销在于处理器模式的切换:包括从Guest OS到VMM的切换,以及从内核态的VMM到用户态的IO模拟进程之间的切换。
2)半虚拟化的IO虚拟化
在半虚拟化的情况下,修改Guest OS的内核,将原生的设备驱动从Guest OS移出,放到一个特殊的设备虚拟机中(对xen来说,就是Dom0了),其余虚拟机中的IO请求都由设备虚拟机处理。而在Guest
OS内部,为每个虚拟设备安装一个特殊的驱动程序,由该驱动程序负责IO请求的传递,设备虚拟机经过VMM授权,解析收到的请求并映射到实际物理设备,最后交给设备的原生驱动来完成IO。实际上在这
种情况下,Guest OS的驱动是消息代理的作用,把io事件转换为消息,发送给设备虚拟机处理。