天天看点

processor对virtualization的支持

前几天开会大家讨论到processor支持虚拟化supervisor mode,不是很明确与privilege mode间的关系,随查了几篇文章:

Hardware Support for Efficient Virtualization --John Fisher-Ogden

Analysis of the Intel Pentium’s Ability to Support a Secure Virtual Machine Monitor --John Scott Robin et.al

AMD-V™ Nested Paging --AMD

对supervisor mode有一个大概的了解:

其实我们pc上用的vmware或者vbox等都可以跑一个guest os,问题在于如何让guest os能跑的快。方法就是让guest os的指令直接在真正的processor上跑,而不是跑在虚拟机上的processor模拟器。

如果要跑在真正的processor上就对硬件提出了要求,按照我的理解,可以把指令分成两类,一是叫sensitive 指令,例如IO,memory指令(改变memory subsystem 参数,如tlb),改变控制寄存器值,等,令一类是普通计算,程序控制类指令。对于第二类,可以直接放到真正的proc上跑(当然要对运行环境初始化,就像线程切换一样)。对于第一类,如要改变MSR的值,guest os1改变了MSR,os2再访问MSR就有问题了,因为只有一个MSR。所以需要VMM(运行在guest os之下,hardware之上)接管这类操作,即os1写msr将产生trap,vmm接管过来配置后返回。

问题就又产生了,因为sensitive的指令可能会在非特权等级执行(x86里读msr就不会trap到特权级,即该指令可能偷偷的就执行完了,无法被vmm发现并接管),因此要么修改guest os(paravirtualization)或binary translation,要么修改processor来让这些sensitive指令都能发信号给VMM。

对processor修改来支持虚拟化的研究ibm从70年代就开始了,可以说intel和amd多少借鉴了一些ibm的方法。简单说下intel的方法,叫VT-x,就是增加了一个root mode,和non-root mode相对应,原来的4中privilege都算作non-root mode。VMM工作在root mode。此外提供一个结构VMCS(virtual machine control structure)类似于原来进程切换时用到的进程结构(忘记叫什么名字了)。还提供一组方法来进出VM:vmrun 开始vm执行,inv或者访问一些sensitive的寄存器,io,int/exception,退出vm。另外intel还计划对tlb添加一个vpid域来减少vm切换带来的性能损失(每次进出要flash tlb)。

另外值得一提的是 intel 的EPT和amd的NPT,即对从guest physical addr到system physical addr的映射添加了硬件支持。之前都是用软件模拟的,之后page walk步骤变多了,但整体性能提高了。

整体来讲vmm的概念还是比较清楚的。实现细节方面,个人认为NPT/EPT较为繁琐(参考附件1文档)。

processor对virtualization的支持

注:第二副图将重复5次

此外,本人并没有了解常见的vmm软件如何实现所有guestos共享memory。随便猜了一种方法来让自己想的通:vmm软件可以在最后一个一级page walk时(PTE)时在低位设置VPID来标识当前system page是否属于正在walk的guest os,如果不是则要申请一新页并写入pte,如此一来就可以实现每个guest os可以共享所有system memory。

个人拙见,错误,疏漏,不足之处,还望指正。多谢!

继续阅读