对虚拟化技术的理解

        VMM为每个虚拟机分配一套数据结构来管理状态,包括虚拟处理器的全套寄存器,物理内存使用情况、虚拟设备状态。VMM调度虚拟机时,将其部分状态恢复到主机系统中。Guest OS运行在低特权级,涉及到需要特权级操作的时候,比如写CS或者GDT寄存器的时候,权限不错会导致异常,运行权自动交还给VMM,VMM可以使用一些二进制翻译的技术,比如把压cs寄存器的指令替换成压到栈上面,把读取GDT的指令替换成从栈的某一位置去读取。VMM 需要经过复杂的流程才能完成原本简单的操作。最后 VMM 将运行权还给 Guest OS,Guest OS 从上次被中断的地方继续执行,或处理 VMM “塞”入的虚拟中断和异常。这种经典的虚拟机运行方式被称为 Trap-And-Emulate,这也是虚拟机处理速度慢的原因。
        内存是一种非常重要的系统资源,VMM 必须全权管理,Guest OS 理解的物理地址只是客户机物理地址(Guest Physical Address),并不是最终的主机物理地址(Host Physical Address)。当 Guest OS 发生缺页异常时,VMM 需要知道缺页异常的原因,是 Guest 进程试图访问没有权限的地址,或是客户机线性地址(Guest Linear Address)尚未翻译成 Guest Physical Address,还是客户机物理地址尚未翻译成主机物理地址。一种可行的解决方法是 VMM 为 Guest OS 的每个进程的页表构造一个影子页表,维护 Guest Linear Address 到 Host Physical Address 的映射,主机 CR3 寄存器存放这个影子页表的物理内存地址。VMM 同时维护一个 Guest OS 全局的 Guest Physical Address 到 Host Physical Address 的映射表。之所以去建立这种Guest OS物理地址到host物理的映射,我的理解是,在host OS中维护物理内存使用状况的结构式mem_map[],但这个结构guest os是看不到,它也有自己的mem_map[]的结构,假如每个操作系统都依照自己的这个结构去使用物理内存的话就会出现冲突和覆盖,这时候VMM就需要以host os的物理内存使用状况为依据,对guest os得到的物理内存进行重新映射。
        而对于中断和异常,都是直接发送个VMM接管的,最简单来说,进入中断要保存中断上下文,这个上下文要压入ss,esp,eflag,cs,eip,那压cs的时候也要执行二进制翻译从栈上模拟的寄存器中取得cs的值再压,压完之后由于不同的操作系统有不同的中断异常向量表,VMM还要去找到形影的中断处理程序。
        另外在百度百科上有这么一段话,软件VMM 所遇到的以上挑战从本质上来说是因为 Guest OS 无法运行在它所期望的最高特权级,传统的 Trap-And-Emulate 处理方式虽然以透明的方式基本解决上述挑战,但是带来极大的设计复杂性和性能下降。当前比较先进的虚拟化软件结合使用二进制翻译和超虚拟化的技术,核心思想是动态或静态地改变 Guest OS 对特权状态访问的操作,尽量减少产生不必要的硬件异常,同时简化 VMM 的设计。

        最近才刚开始关注虚拟化技术,如有错误请指正!

你可能感兴趣的:(虚拟化)