ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

02 · 虚拟化下的两级地址转换:GVA→GPA→HPA

02 · 虚拟化下的两级地址转换:GVA→GPA→HPA 本系列第 01 篇已经建立了地址空间即映射的基本认知:MMU 依据页表,把进程看到的虚拟地址翻译成物理地址,而缺页异常只是映射暂缺的正常信号。本篇在此基础上引入虚拟化,说明为何会多出一层地址转换,以及硬件如何完成加速。理解这一层,是读懂后续 Xen p2m 表与 HMEM 缺页转发机制的前提。一、问题的由来:虚拟机也需要独立的物理内存视图在非虚拟化环境中,操作系统直接管理真实物理内存,页表完成一次转换即可:虚拟地址(Virtual Address, VA)经 MMU 翻译为物理地址(Physical Address, PA)。引入虚拟化后,同一台物理机上运行着多个虚拟机(guest)。每个 guest 内部都运行着一套完整的操作系统,而该操作系统同样认为自己独占整台机器的物理内存,并按照这一假设去构建和维护自己的页表。问题随之而来:多个 guest 都声称拥有从零开始的连续物理内存,而真实物理内存只有一份,必须由 hypervisor 统一分配与隔离。解决办法是再引入一层间接映射。guest 所认为的物理地址并非真实的机器物理地址,而是一层被虚拟化出来的中间地址。于是地址转换从一级变为两级。二、三类地址与两级转换在虚拟化语境下,需要严格区分三类地址:GVA(Guest Virtual Address):guest 内部进程使用的虚拟地址。GPA(Guest Physical Address):guest 操作系统所认为的物理地址。在 Xen 术语中,以页帧号表示时称为gfn(guest frame number)。HPA(Host Physical Address):真实的机器物理地址。在 Xen 术语中,以页帧号表示时称为mfn(machine frame number)。两级转换的含义是:第一级(GVA → GPA):由 guest 操作系统自己维护的页表完成。guest 对这一级拥有完全控制权,hypervisor 并不干预。第二级(GPA → HPA):由 hypervisor 维护的另一张表完成。guest 无法感知,也无权修改。正是这一级实现了不同 guest 之间的物理内存隔离与分配。guest 页表(guest OS 维护)第二级页表(hypervisor 维护)GVAguest 进程虚拟地址GPA / gfnguest 认为的物理地址HPA / mfn真实机器物理地址三、硬件辅助:EPT 与 NPT早期虚拟化没有硬件支持第二级转换,只能由 hypervisor 用软件维护一张影子页表(shadow page table),直接把 GVA 映射到 HPA。影子页表需要时刻跟踪 guest 页表的每一次改动,维护成本高、性能开销大。现代处理器为第二级转换提供了专门的硬件支持:Intel 平台称为EPT(Extended Page Table,扩展页表)。AMD 平台称为NPT(Nested Page Table,嵌套页表),亦称 RVI。有了硬件二级页表后,MMU 能够在一次地址转换中同时遍历两级页表:先用 guest 页表把 GVA 翻译为 GPA,再用 EPT/NPT 把 GPA 翻译为 HPA,全程无需 hypervisor 介入。在 Xen 中,这张由硬件使用的第二级页表,就是本系列反复提到的 p2m 表(physical-to-machine)。第 03 篇将专门剖析它。CPU / MMU 一次地址转换guest 页表EPT / NPT(即 Xen p2m)GVAGPAHPA四、嵌套页错误(Nested Page Fault)在单级转换中,当某个虚拟地址在页表中没有有效映射时,MMU 触发缺页异常(page fault),交由操作系统处理。在两级转换中,第二级同样可能出现映射缺失的情况:GPA 在 EPT/NPT 中没有对应的有效 HPA 表项。此时触发的异常称为嵌套页错误(Nested Page Fault, NPF),它不会交给 guest 操作系统,而是被 hypervisor 捕获处理。NPF 是理解本系列核心机制的关键。它意味着:hypervisor 可以通过刻意让某段 GPA 在第二级页表中失效,从而在 guest 下次访问该地址时精确地拦截到这次访问。HMEM 机制正是利用这一点——当一段被映射的宿主内存需要重新建立映射时,先令其在 p2m 中失效,待 guest 触发 NPF 时再将访问转发给设备模型处理。这条路径将在第 08 篇详细展开。HypervisorMMUGuestHypervisorMMUGuestalt[第二级映射有效][第二级映射缺失]访问某 GVAguest 页表:GVA → GPAEPT/NPT:GPA → HPA直接完成访问触发 NPF(交由 hypervisor)建立/修复 p2m 映射或转发处理重试指令五、小结虚拟化引入两级地址转换的根本原因,是需要为每个 guest 提供彼此隔离、又可由 hypervisor 统一调度的物理内存视图。第一级(GVA→GPA)由 guest 自主管理;第二级(GPA→HPA)由 hypervisor 掌控,是隔离与共享的真正着力点。EPT/NPT 是第二级转换的硬件实现,在 Xen 中对应 p2m 表。嵌套页错误(NPF)使 hypervisor 能够精确拦截 guest 对特定 GPA 的访问,是后续 HMEM 缺页转发机制的物理基础。下一篇将进入 Xen 的具体实现,剖析 p2m 表、m2p 反向表以及页类型(p2m_type)如何组织每个域的物理内存视图。
返回列表