概述
本文涵盖通过Intel扩展页表(EPT)实现MMU虚拟化的各项需求与特性。内容涉及初始化与能力检查、MTRR设置、页分裂等关键技术细节。我们将从检查功能可用性开始,了解最新Intel处理器支持的能力,重构VMM结构以支持EPT,进而进行页表分配。本文使用Windows内存管理API进行资源分配与跟踪,但建议开发者实现不依赖OS的自定义内存分配器以避免恶意第三方攻击。
功能可用性检查
首先需要检查处理器是否支持EPT及不同EPT策略。通过读取IA32_VMX_PROCBASED_CTLS2 MSR的次级处理器控制字段,确认支持WB缓存类型、EPT、VPID和INVPCID等功能。若处理器不支持次级处理器控制,则无法实现EPT。
虚拟内存与分页
现代系统启用分页后,每个进程拥有独立的虚拟地址空间,通常以4KB粒度管理。页对齐缓冲区起始地址位于页边界处,可通过检查地址低12位是否清零验证对齐性。地址转换通过页表实现,转换后备缓冲区(TLB)缓存最近使用的页表条目以提升性能。
扩展页表(EPT)
EPT引入了客户物理地址空间(GPA)层,形成GVA→GPA→HPA的二级转换流程。硬件辅助嵌套分页允许处理器同时持有客户页表和主机页表指针,但会带来更高的TLB缺失开销(从4次访问增至24次)。
MTRR实现
内存类型范围寄存器(MTRR)用于关联物理地址范围与缓存类型,包括不可缓存(UC)、写组合(WC)、写通(WT)和写回(WB)等类型。通过IA32_MTRR_CAP_MSR和IA32_MTRR_DEF_TYPE_MSR等模型特定寄存器(MSR)进行配置管理。
EPT页层次结构
初始化EPT需要分配PML4表并配置EPT指针(EPTP)。EPTP包含PML4物理地址、内存类型、地址宽度等信息。EPT页表条目格式与传统页表存在差异,使用独立的读写执行权限位(RD/WR/X)。
身份映射建立
通过获取系统物理内存描述符(MmPhysicalMemoryBlock),为所有物理页面创建4KB粒度的EPT映射。遍历每个物理内存运行(run),调用ept_create_mapping_4k函数逐页建立GPA到HPA的1:1映射关系。
技术实现要点
- 使用自定义的ept_map_page_table函数处理页表分配与验证
- 通过hw_query_mtrr_memtype查询物理地址对应的缓存类型
- 采用联合体(page_entry_t)统一处理传统页表与EPT页表条目格式
- 实现完整的错误回滚机制(ept_teardown_tables)
后续工作
本文完成了EPT基础架构的搭建,后续需要实现页表拆卸、页行走辅助函数、2MB/1GB大页支持、页面合并以及EPT违例处理程序等关键组件。
版权声明:本文采用Digiprove版权保护,保留所有权利。