第 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 虚拟化术语表

相关新闻

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

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

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

2026/9/24 17:46:43 阅读更多 →
检测链接的前端代码

检测链接的前端代码

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

2026/9/24 17:46:43 阅读更多 →
第10章:常见问题与避坑指南

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

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

2026/9/24 17:46:43 阅读更多 →

最新新闻

JSP+MySQL个人日记本源码运行全攻略:从环境搭建到避坑指南

JSP+MySQL个人日记本源码运行全攻略:从环境搭建到避坑指南

简介:基于jspmysql的JSP个人日记本源码,是一份面向Java Web初学者与课程设计场景的完整Web应用项目。资源以JSP作为视图层、Servlet处理控制逻辑,结合MySQL存储用户、日记与分类数据,覆盖用户登录、会话保持、日记增删改查、分类管…

2026/9/24 18:29:14 阅读更多 →
2026年AirPods全系选购指南:从AirPods 4到Pro与Max,哪款最适合你

2026年AirPods全系选购指南:从AirPods 4到Pro与Max,哪款最适合你

AirPods这个品类,现在真的有点“乱花渐欲迷人眼”了。从最初只有一款标准版,到如今AirPods 4、AirPods Pro、AirPods Max三条线并行,Plus版一般、Lite版传闻满天飞,哪怕是数码圈老手,真要下手买前不花点时间做功课&…

2026/9/24 18:29:14 阅读更多 →
结构可靠性分析:验算点法与直接抽样组合实战

结构可靠性分析:验算点法与直接抽样组合实战

简介:面向结构可靠性与安全度评估的实用算法压缩包,适合结构工程专业学生、科研人员及从事可靠性分析的工程师。资源聚焦验算点法和直接抽样法,同时涉及蒙特卡洛模拟思路,用于计算结构失效概率、评估极端荷载下的安全裕度&#xf…

2026/9/24 18:29:14 阅读更多 →
前后端分离部署实战:systemd托管Java进程+Nginx反向代理

前后端分离部署实战:systemd托管Java进程+Nginx反向代理

1. 部署方案设计与总体思路1.1 为什么是“systemd Nginx”这套组合前后端分离项目的部署,说简单也简单,说麻烦也麻烦。简单在于流程是固定的——后端打成 jar 包跑起来,前端构建出静态文件扔给 Web 服务器。麻烦在于每一个环节都有坑&#x…

2026/9/24 18:29:14 阅读更多 →
腾讯云EdgeOne免费CDN实战:接入配置与成本优化指南

腾讯云EdgeOne免费CDN实战:接入配置与成本优化指南

上个月帮一个朋友的博客站点排查访问慢的问题。他的服务器带宽只有5M,文章里全是高清截图和录屏素材,高峰期十几个人同时打开就卡得不行。我顺手看了眼他用的还是老式按量计费CDN,月底账单里光是流量费就占了一半。我说你这个站,流…

2026/9/24 18:29:14 阅读更多 →
Linux与Windows系统运维:参数查询与配置命令对照实战

Linux与Windows系统运维:参数查询与配置命令对照实战

很多时候,我们干的活儿并不是什么高深莫测的架构设计,反而是那些每天都在重复的“查一下参数、改一个配置”。尤其是当你的手头同时管着 Windows 服务器和 Linux 服务器时,这种“精神分裂”的感觉会特别明显:明明在 Windows 上用图…

2026/9/24 18:28:13 阅读更多 →

日新闻

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

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

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

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

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

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

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

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

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

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →