接前一篇文章:
本文内容参考:
《 QEMU /KVM》源码解析与应用 —— 李强,机械工业出版社
《深度探索 Linux 系统虚拟化原理与实现》—— 王柏生 谢广军, 机械工业出版社
特此致谢!
二、x86架构CPU虚拟化
3. VMX
上一回讲到了VMX的运行模式,再来回顾一下:
CPU提供两种运行模式:VMX Root Mode(VMX根模式)和VMX non-Root Mode(VMX非根模式)。每一种模式都支持ring 0 ~ ring 3。VMM运行在VMX Root Mode,除了支持VMX外,VMX Root Mode和普通的模式并无本质区别;VM运行在VMX non-Root Mode,Guest无须再采用特权级压缩方式,Guest kernel 可以直接运行在VMX non-Root Mode的ring 0中。
1)处于VMX Root Mode的VMM可以通过执行CPU提供的虚拟化指令VMLaunch,切换到VMX non-Root Mode,因为这个过程相当于进入Guest,因此通常也被称为VM entry。
2)当Guest内部执行了敏感指令(如某些I/O操作)后,将触发CPU发生陷入的动作,从VMX non-Root Mode切换回VMX Root Mode,这个过程相当于退出VM,因此也称为VM exit。
3)然后VMM将对Guest的操作进行模拟。
相比于将Guest的内核也运行在用户模式(ring 1 ~ ring 3)的方式,支持VMX的CPU有以下三点不同:
1)运行于Guest模式时,Guest用户空间的系统调用直接陷入Guest模式的内核空间,而不再是陷入Host模式的内核空间。
2)对于外部中断,因为需要由VMM控制系统的资源,所以处于Guest模式的CPU收到外部中断后,则触发CPU从Guest模式退出到Host模式,由Host内核处理外部中断。处理完中断后,再重新切入到Guest模式。为了提高I/O效率,Intel支持外设透传模式。在这种模式下,Guest不必产生VM exit。
3)不再是所有的特权指令都会导致处于Guest模式的CPU发生VM exit,仅当运行敏感指令时,才会导致CPU从Guest模式陷入到Host模式,因为有的特权指令并不需要由VMM介入处理。
更多内容请看下回。