初步总结。现在我想大家对于处理器虚拟化的看法无非是“让操作系统成为应用程序,虚拟机管理器取代了操作系统的角色。不过,还有异常处理机制可以作为最后一道防线。””好吧”,但得益于x86指令集的发展历史,它有先天的缺点和后天的不平衡,所以处理起来非常困难,因为一些用户态的x86指令也有机会“越界”而降低
让我们看看1974年创建的“Popek和Goldberg虚拟化要求”是如何定义的,用于验证计算机架构是否可以有效地虚拟化
。:不改变系统状态的机器指令应该直接使用底层硬件执行,无需干预。资源控制:VMM(虚拟机管理器)完全控制破坏系统稳定性的虚拟资源行为,然后将其替换。不会造成伤害的东西。等效性:在VMM上运行的操作系统的行为与在本机硬件上运行的行为相同。只要所有改变底层系统状态的关键(敏感)命令都应该包含在系统命令(特权)范围内,操作系统在虚拟机上执行的任何“有害行为”都会触发处理器的异常处理机制和VMM陷阱(Trap)可以绕过它并用安全命令代码替代它。
不幸的是,x86指令集中的18条用户模式指令和大部分I/O指令都不符合上述标准。最著名的案例是POPF命令更改了InterruptEnableEFLAGS字段,该字段在用户模式下不会被激活,但不会引发异常。无论是改变系统底层状态还是处理器不执行,都不会引发异常。这个命令在独立操作系统上不会产生问题,但对于虚拟化来说却是一个巨大的头疼问题。也就是说,必须先抓住这些“麻烦制造者”,然后通过软件模拟或二进制翻译(BinaryTranslation)等手段取而代之,以保证系统的稳定性。
所以在IntelVT-X“Vanderpool”和AMD-V“Pacifica”等硬件辅助虚拟化技术(HardwareAssisted)出现之前,只有两种方法可以实现有效的x86处理器路径:
全虚拟化:像VMware早期的虚拟机监控器(VMMonitor)一样,它会监控用户操作系统的命令代码,首先找到这些有问题的命令,然后使用二进制代码机制(.BinaryTranslation)进行转换它们到安全脚本,但这会降低性能。半虚拟化:修改操作系统代码并替换导致问题的指令,以便所有指令都可以在处理器上本机执行。然而,不同的操作系统需要对不同的虚拟机软件进行不同程度的修改,导致兼容性受到损害,如果微软Windows永远不开放源代码,那就根本没有机会。坦白说,硬件辅助虚拟化技术所做的就是“弥补”,通过添加新的权限级别和“拦截网络”来阻止这些不受控制的命令,然后允许虚拟机管理器执行类似的操作。系统陷阱机制以确保操作系统作为应用程序不会使每个人崩溃的方式启动系统调用。
前面提到了提高切换速度的“执行数据结构”(TSSforx86)和提高应用程序与操作系统、IntelVT-x和AMD之间交互的“标准系统调用接口”-V分别将数据结构VMCS(VMControlStructure)和VMCB(VMControlBlock)定义为x86虚拟化技术的TSS。每当处理器更改、重新启动或退出操作系统时,处理器首先加载并更新其数据。由于它享受原生硬件加速,并且可以使用新增的虚拟机管理命令,因此可以让操作系统反向认识到“原来脚下有公共土地”,加强了操作系统与虚拟机管理器的交互,减少不必要的切换,提高执行效率。
然而,IntelAMD不同努力的结果是,虚拟机管理器开发者将陷入困境,要实现“不停动态传输”将是一项不可能完成的任务。
费了九牛二虎之力,绕了一大圈,终于让x86处理器能够有效虚拟化,但是这些年编译出来的x86虚拟化技术却没有那么简单。敬请期待本专栏,科科科科。
追踪硬科技王者硬件世界考古历险上一篇:属于半虚拟化技术的是
下一篇:虚拟化技术的特点