第 3 篇 · p2m 内存类型分类

发布时间:2026/9/24 17:46:43

第 3 篇 · p2m 内存类型分类 p2m 表项不只记对应哪个 MFN还带一个类型标签p2m_type决定访问它时的行为。这一篇把 Xen 的 p2m 类型讲透完整枚举 各自用例以及它们之上两个容易混淆的分组/空间概念——类型组掩码把类型归类和XENMAPSPACE往 physmap 放页时的来源空间。1. p2m_type 是什么Xen 的 p2m 表项 MFN 类型 权限。类型p2m_type_t告诉 Xen当 guest 访问这个 GFN 时该怎么处理缺页/写入/权限。p2m[GFN] { mfn, p2m_type, access_rights }同一个 GFN类型不同行为天差地别有的直接读写真实内存有的一访问就 exit 给 qemu 模拟有的写入时标脏。2. 完整的 p2m 类型枚举x86x86 的p2m_type_t一共 16 种xen/arch/x86/include/asm/p2m.h值类型含义典型用例0p2m_ram_rw普通可读写 RAMguest 绝大多数常规内存1p2m_invalid此处什么都没映射physmap 空洞访问触发缺页2p2m_ram_logdirty临时只读写触发标脏热迁移追踪脏页3p2m_ram_ro只读 RAM写被静默丢弃只读区4p2m_mmio_dm读写都交给 device model模拟设备寄存器转 qemu5p2m_mmio_direct直通真实 MMIOPCI passthrough 的 BAR6p2m_populate_on_demand空内存占位PoD超额分配 / 延迟落地气球7p2m_grant_map_rw读写 grant 映射跨域共享netfront/blkfront8p2m_grant_map_ro只读 grant 映射同上只读9p2m_ram_paging_out正在换出的内存mem paging10p2m_ram_paged已换出mem paging11p2m_ram_paging_in正在换入mem paging12p2m_ram_shared可共享 / 已共享内存去重CoW / mem sharing13p2m_ram_broken坏页硬件故障页访问即崩 domain14p2m_map_foreign映射另一个域的 RAM 页跨域直接映射15p2m_ioreq_server交给 ioreq server 处理用户态设备模型介入的内存如显存脏页跟踪小注ARM 上 foreign 细分成p2m_map_foreign_rw/rox86 只有一个p2m_map_foreign读写权限用访问位区分。3. 类型分组type 之上的region概念Xen 内部几乎不逐个判断具体类型而是把类型按位掩码归成组配一组p2m_is_*谓词来判断。这就是每个 type 归属哪个类别的 region 概念asm/p2m.h组掩码大致包含谓词语义P2M_RAM_TYPESram_rw / ro / logdirty / paging* / shared / ioreq_serverp2m_is_ram映射到真实机器帧P2M_MMIO_TYPESmmio_dm / mmio_directp2m_is_mmio设备内存P2M_GRANT_TYPESgrant_map_rw / rop2m_is_grantgrant 跨域映射P2M_RO_TYPESlogdirty / ram_ro / grant_ro / sharedp2m_is_readonly只读写需特殊处理P2M_SPECIAL_TYPESgrant p2m_map_foreign mmio_directp2m_is_special需专门访问器建立/拆除P2M_PAGING_TYPESpaging_out / paged / paging_inp2m_is_paging换页中P2M_POD_TYPESpopulate_on_demandp2m_is_pod按需填充占位单类p2m_map_foreignp2m_is_foreign别的域的页作用建 EPT/NPT 表项、缺页处理、迁移、CoW、换页……都用这些组统一判断而不是写死某个类型。例如写一个p2m_is_readonly的页会统一走写处理logdirty 标脏、grant_ro 丢弃、shared 破 CoW。新增/调整一个类型时只要把它放进对的组全套逻辑自动适配。4. 另一个空间概念XENMAPSPACE来源空间type 描述的是这个 GFN 现在是什么。而当你要往 guest physmap 里放一个页时XENMEM_add_to_physmap[_batch]还要给一个space参数——告诉 Xen这个页从哪来。space 决定了 Xen 怎么取 MFN、以及最终装成哪种 p2m 类型xen/include/public/memory.hXENMAPSPACE_*值来源落成的 p2m 类型shared_info0Xen 的 shared_info 页p2m_ram_rwgrant_table1grant 表页p2m_ram_rwgmfn2本域已有的一个 GFN重定位类型随源gmfn_range3本域一段 GFN同上批量gmfn_foreign4另一个域的 GFNp2m_map_foreignRAM/p2m_mmio_direct设备页dev_mmio5设备 MMIO 区ARM直通 MMIO还有一个值为 6 的扩展 space留到下一篇结合具体机制讲。要点space 是入口/来源type 是结果/属性。同一段 GFN 经不同 space 放进来会得到不同的 type——例如经gmfn_foreign放进来的 RAM 页落成的就是p2m_map_foreign。所以回答每个 type 下有没有 space 概念它俩是入口→结果的对应关系而非从属关系一张对照表就能把 space 和 type 串起来。type / region / space / class 一图看清把前面几节的四个概念放在一起它们的关系是决定落成哪种按位掩码归类表级与 type/space 正交spaceXENMAPSPACE放页时的『来源』gmfn / gmfn_foreign / grant_table / dev_mmio ...typep2m_type单个表项的『属性』16 种: ram_rw / mmio_* / grant_* / map_foreign ...region类型组P2M_*_TYPES p2m_is_*is_ram / is_mmio / is_grant / is_special ...classp2m_class整张表的『维度』host / nested / altp2mspace → type入口决定结果——同一 GFN 换个 space落成的 type 不同。type → region每个 type 按掩码归入若干组Xen 用组p2m_is_*统一判断而非逐个类型。class是这是哪张 p2m 表的维度和 type / space正交日常用p2m_host。5. 跨域共享的两类 typegrant 与 foreign5.1 为什么单独讲这两类前面的 RAM/MMIO 类型都是本域自己的内存。而有两类 type 专门表示这一页其实属于另一个域——它们让同一块物理页同时出现在两个域里是跨域零拷贝共享的地基也是理解后续机制的关键值得单独讲透。先厘清独占 vs 跨域、所有权 vs 映射这是理解后续所有机制的基石先分清两组概念独占一个 host 物理页MFN只出现在一个domain 的 physmap 里只有它能访问——普通的p2m_ram_rw就是这样每个 guest 的 RAM 都是分配给它私有的 MFN。跨域共享同一个 MFN 同时出现在多个 domain 的 physmap 里于是这块真实物理内存能被多个域同时看到、访问。独占: MFN_X ◄── domA 的某个 GFN 只有一条 跨域: MFN_X ◄── domA 的 GFN ◄── domB 的 GFN 同一个 MFN,多条再区分所有权和映射——这点最容易混所有权owner每个物理页永远只有一个 owner domainpage_get_owner共享不改变所有权。映射mapping跨域做的是——在另一个域的 physmap 里也加一条指向这个 MFN 的项。所以准确的说法是跨域 一个页仍归某一个域所有但被额外映射进了别的域的地址空间。为防止 owner 在别人还用着时回收它跨域映射会对该页get_page加一次引用计数撤映射remove_from_physmap时再put_page释放。下面两类 type就是这种额外映射的两种建立方式区别只在谁是 owner、谁主动、往哪个方向映射。5.2 为什么这是虚拟化能用的性能基石跨域共享看着只是个内存技巧实则决定了虚拟化 I/O 是能跑还是慢到不能用。先把两层分开CPU / 内存虚拟化EPT/NPT 两级翻译——靠硬件本身没有拷贝问题和共享无关解决的是能跑。I/O、设备、GPU 数据通路——这层才是拷贝 vs 共享的战场决定跑得快不快。设想没有共享的 PV 网络guest 发一个包要先拷到 dom0 的 backendbackend 再交给网卡收包反向再来一遍。每个包至少两次内存拷贝 跨域切换10/40Gbps 下光拷贝就吃满 CPU 和内存带宽。grant table 的设计初衷正是干掉这次拷贝——backend 直接读写 guest 那块内存包零拷贝地过去。这也是 Xen PV 驱动能接近裸机的关键。GPU 更极端几十 GB 的显存 blob任何一次拷贝都不可接受所以必须让 host GPU 栈与 guest 共享同一份物理页——没有跨域共享GPU 虚拟化根本无从谈起。但共享有代价它削弱隔离。这正是虚拟化设计的核心张力——拷贝共享性能差好零拷贝隔离强各自独立弱同一页两个域都能碰所以下面 grant/foreign 才要那套授权 引用计数 notifier XSM 校验本质是在尽量不破坏隔离的前提下换取零拷贝的性能。跨域共享机制的全部复杂度都是在这架天平上找平衡。5.3 grant 映射p2m_grant_map_rw/ro谁发起源域内存拥有者主动授权——它在自己的 grant table 里登记一条 grant entry“允许 domX 访问我的第 N 页”拿到一个 grant ref 交给对方。谁映射被授权方拿着 grant ref 发 hypercall把那一页映射进自己的physmap落成p2m_grant_map_rw/ro。方向拥有者 → 授权给使用者。典型是 guest 把自己的收发缓冲授权给后端netfront 授权给 dom0 的 netback。一个细节Xen 认为 grant 项随时可能被源域撤回所以p2m_is_valid特意不把 grant 算作 valid——用它的人必须容忍随时失效。5.4 foreign 映射p2m_map_foreign谁发起有特权的目标域通常 dom0主动把另一个域的某个 GFN塞进自己的physmap落成p2m_map_foreign内部走set_foreign_p2m_entry。不需要源域授权靠发起方的特权配xsm_map_gmfn_foreign做 XSM 校验源域甚至不感知。方向使用者主动去借拥有者的页。典型是 dom0 的工具 / 设备模型要读写某个 guest 的内存。引用计数映射时对源页get_page加引用XENMEM_remove_from_physmap时释放——保证映射期间源页不被回收/搬走。5.5 两者对比grantforeign谁主动源域授权目标域特权直接映射需授权需要grant ref不需要特权 XSM典型方向owner → useruser 主动借 ownerp2m 类型p2m_grant_map_rw/rop2m_map_foreign建立入口grant map hypercallXENMAPSPACE_gmfn_foreign/set_foreign_p2m_entry生命周期源域可随时撤显式 remove 前有效两者本质相同——让同一块物理页同时落在两个域的地址空间里实现跨域零拷贝区别只在谁发起、要不要授权、怎么维护一致性。后面要讲的机制正是选了foreign 这一支来扩展原因也正是上表透露的由特权方主动、不依赖源域配合、适合成片大范围映射。至于它在 foreign 之上具体加了什么留到下一篇。6. 再往上一层p2m 的类host / nested / altp2mtype项属性、space入口都是单张表层面的。整张 p2m 表还分类p2m_class_tp2m_host正常的 guest p2m落到 EPT/NPTp2m_nested嵌套虚拟化里L1 guest 给它的 L2 guest 用的 p2mp2m_alternatealtp2m同一个 guest 的多份 p2m 视图可运行时切换安全监控、写保护等用。这是表级的 region 概念和 type项级、space入口互相正交。日常内存虚拟化主要用p2m_host。7. 本篇小结 下一步p2m 项 MFN 类型 权限类型决定访问行为。x86 共16 种p2m 类型覆盖 RAM / MMIO / grant / foreign / paging / PoD / shared / broken / ioreq_server。跨域共享靠两类 typep2m_grant_map_*源域授权与p2m_map_foreign特权域主动借——它们让同一物理页出现在两个域是后续机制的地基。两个易混的空间/分组概念①类型组掩码P2M_*_TYPESp2m_is_*是对项属性的分类②XENMAPSPACE是往 physmap 放页时的来源空间决定落成哪种类型——space 是入口type 是结果。再往上还有表级的p2m_classhost / nested / altp2m。下一篇04 · 跨域协作全景一张 p2m 表的五种填法 —— 有了这张类型 space地图下一篇把p2m_map_foreign这条主线铺成完整全景p2m 被填充的5 种情形1 种单域基准 4 种跨域协作讲清每种的方向、授权模型、以及用什么标识源页GFN 还是 hva。之后再逐个深入具体机制——hmem 从第 5 篇起。关联阅读附录AXen 虚拟化术语表
延伸阅读

更多相关文章

2026/9/24 17:46:43

计算机毕业设计之基于MySQL的校园二手商城的设计及实现

随着新世纪无纸化办公方式的普及,自动化信息处理和基于网络的信息交互方式已被广泛应用。现在很多行业基本上都是交由计算机进行管理和测试,网络与计算机已成为整个线上管理体系中的重要组成部分。虽然信息技术广泛应用和数据存取更加方便,但…

2026/9/24 17:46:43

检测链接的前端代码

##任务1:在WEB前端中,提取所有图片URL和图片绑定的响应跳转链接。##任务2:在WEB前端中,提取所有外站链接的地址。##任务3:在WEB前端中,提取所有带文字描述的内部链接及其对应的文字标题。##任务4&#xff1…

2026/9/24 17:46:43

第10章:常见问题与避坑指南

第10章:常见问题与避坑指南 本章目标 汇总 Git / TortoiseGit 使用中最高频的 30 个问题:症状 → 原因 → 解决。建议遇到问题时用 CtrlF 搜索报错关键字。 1. 中文乱码问题 1.1 git log / git status 中文显示为八进制(\344\275\240&#x…

2026/9/24 23:12:32

Tableau LOD函数详解:FIXED/INCLUDE/EXCLUDE实战

在Tableau里做了好几年数据分析,我遇到的第一个真正让人头疼的问题,不是图表不好看,而是“明明想算每个客户的总消费,但拖出来的数字总感觉不对”。换成区域维度,指标变了;换成订单维度,数字又变…

2026/9/24 23:12:32

从AI获客工具到Web AI交互层:开源AI助手的重写实践

我们最早那个版本,其实算不上一个真正的 AI 助手。它是一个挺标准的 AI 获客工具——输入产品介绍,自动生成客户画像、销售话术、批量打招呼内容。上线第一周数据不错,注册量涨得很快,但第二周我就开始慌:用户的会话时…

2026/9/24 23:12:32

AMD锐龙PBO超频实战:从BIOS设置到进阶调优

PBO这三个字母,在AMD玩家群里出现的频率极高,但每次聊起来总有人是一脸问号——有人开了以后游戏帧数几乎没变化,有人开了以后CPU温度直接冲到九十几度,还有人进BIOS翻半天都找不到这个选项藏在哪。实际上PBO并不复杂,…

2026/9/24 23:12:32

把日期变成项目:倒排计划与目标拆解实操指南

26.1.20 是我某天在手账扉页上随手写下的日期。当时旁边还有一句话:“到这天,手里的事要有结果。”后来这个日期慢慢变成了一个代号,微信文件、笔记本封面、日程表标题里全是它。说实话,真正重要的不是那天具体会发生什么&#xf…

2026/9/24 23:02:08

树的重心详解:DFS求重心、带权重心与换根DP进阶

做算法题的人应该都有体会:树形结构里但凡牵扯到“删一个点”、“找一个最优位置”、“算所有点到某点的距离和”,最后十有八九会落到一个东西上——树的重心。洛谷的P1670、P1395、P2986这三道题,恰好是一条非常完整的进阶链路:从…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码