尧图精选

第 1 篇 · Xen 内存虚拟化整体框架

🕒 发布时间:2026/9/24 17:46:22 📁 来源:尧图网络
内存虚拟化是虚拟化技术的核心一环如何让 guest 与 host 高效互访、尽量减少数据拷贝直接决定了整体性能。本系列就以「guest ↔ host 内存互访」为主线层层拆解它背后的机制。搞清楚guest 看到的内存和真实内存之间隔了几层、由谁翻译。理解了这一篇后面所有具体的内存类型都只是这张地图上的一块拼图。1. 三层地址整个框架的骨架Xen 内存虚拟化的一切都围绕这三个地址概念缩写全称含义谁管理VAVirtual Addressguest 进程的虚拟地址guest 内核页表GFN / GPFNGuest Frame Numberguest 眼中的物理帧号guest 以为自己在管MFNMachine Frame Number真实机器物理帧号Xen hypervisor 独占管理关键认知guest 看到的物理内存是假的。guest 的 GFN 必须再经过一层翻译才能落到真实的 MFN。这层翻译表就是p2mphysical-to-machine。guest 进程 VA ──(guest 页表)──► GFN ──(Xen 的 p2m 表)──► MFN(真实内存)第一级VA → GFN是 guest自己内核用它自己的页表CR3做的和普通 Linux 完全一样Xen 不掺和。第二级GFN → MFN是虚拟化专属的一层由 Xen 通过 p2m 表控制。设备直通、内存气球等所有花样都发生在这一级。2. p2mGFN→MFN 翻译表p2mphysical-to-machine是每个 guest 一份的映射表记录guest 的每个 GFN 对应哪个真实 MFN以及这段内存是什么类型、什么权限。它有两个物理落地方式取决于虚拟化模式1. HVM / PVH硬件辅助用 CPU 硬件的二级页表Second Level Address Translation SLATIntel 叫EPTExtended Page TableAMD 叫NPT / RVINested Page Table此时p2m 表的物理载体就是 EPT/NPT。CPU 硬件在一次内存访问中自动走两级guest VA ──(guest CR3 页表, 第一级, 硬件走)──► GFN ──(EPT/NPT, 第二级, 硬件走)──► MFNguest 完全无感知性能接近原生。Xen 只负责在必要时修改 EPT 表项建映射、撤映射、改权限。2. PV半虚拟化 —— 了解即可没有二级页表。guest 直接用真实 MFN 建自己的页表但每次改页表都必须通过 hypercall 请求 Xen 审批。这样 guest 本身就知道真实 MFN。现代基本被 PVH 取代本场景用的是 PVH/HVM不走这条。3. 两种模式对比维度PV半虚拟化HVM / PVH硬件辅助GFN→MFN 翻译无二级页表guest 页表直接用 MFNEPT/NPT 二级页表硬件翻译guest 是否感知感知需改造内核基本无感知改页表每次 hypercall 审批硬件自动缺页时才 exit缺页处理入口hypercall / page faultEPT violation → VM exit本场景不用用 PVHdom0 HVM/PVHguest对本系列最重要的一句HVM/PVH 下guest 访问一个 p2m 里没有 MFN 的 GFN会触发 EPT violationCPU 陷入VM exit到 Xen。这正是第 2 篇的主题。4. 一个具体例子guest 访问 0x7f1234567890 如何落到 host PFN假设 guest 里一个进程访问虚拟地址0x7f1234567890HVM/PVH 模式。一次访存要连着走两级翻译全部由 CPU 硬件自动完成步骤谁来翻译输入输出① VA → GFNguest 内核页表CR3VA0x7f1234567890GFN0x1A2B3页内偏移0x890② GFN → MFNEPT/NPTXen 维护GFN0x1A2B3MFN0x3F0C4host PFN拼起来看guest 进程 VA 0x7f1234567890 │ ① guest 页表CR3 — guest 自己翻译Xen 不掺和 ▼ guest 物理 GFN 0x1A2B3 : 偏移 0x890 │ ② EPT/NPTXen 维护 — 硬件二级翻译 ▼ 机器物理 MFN 0x3F0C4 : 偏移 0x890 host PFN 0x3F0C4最终落到的真实机器物理地址 MFN(0x3F0C4) 12 | 偏移(0x890)0x3F0C4890对应 host 的PFN0x3F0C4。几个要点页内偏移0x890全程不变两级翻译只换页号VA 页→GFN→MFN偏移直接携带。两级在一次访存里连续完成CPU 做的是二维页表游走2D page walkguest 完全无感知。第 ① 步的 GFN 是假物理guest 以为0x1A2B3就是物理帧实际它只是个编号还得靠第 ② 步才能变成真实的 MFN。如果第 ② 步的 EPT 项是空的GFN 还没对应 MFN就触发EPT violation → VM exit 到 Xen由 Xen 决定填什么——这正是第 2 篇的入口。5. 全景图谁在操作 p2mDom0 (特权域)Xen Hypervisor (Ring -1)Guest (domU, PVH/HVM)guest 页表EPT/NPT 二级翻译维护VM exit普通 RAM 自己填特殊内存转交进程 VAGFN 猜的物理地址p2m 表 / EPTXen 管理MFN 真实机器内存p2m 管理建/撤/改 EPT 表项QEMU Device ModelGFN 无 MFN EPT violation要点Xen是唯一能改 p2m/EPT 的角色它在 Ring -1独占真实内存。dom0里的 device modelQEMU只能通过hypercall请求 Xen 改 p2m自己不能直接动。普通 RAM 由 Xen 自己填而某些特殊内存Xen 会把缺页转交给 dom0QEMU去决定填什么具体有哪些类型见第 3 篇。6. 本篇小结 下一步记住三层地址VA → GFN → MFN以及中间那层翻译表p2m。HVM/PVH 下 p2m EPT/NPT硬件二级页表页内偏移全程不变。guest 访问无 MFN 的 GFN →EPT violation → VM exit 到 Xen这是所有按需映射/设备模拟的共同入口。Xen 独占改 p2mdom0 只能发 hypercall 请求。下一篇02 · EPT violation:二级缺页路径 —— 顺着这条二级缺页走到底看它怎么从 Xen 转交到 qemu、再把真实页填进 p2m。关联阅读附录A xen 虚拟化术语表
上一篇/下一篇内容由系统自动关联 返回资讯列表 →