EPT PTE 结构体解析
作成日: 2024年12月22日
作成日: 2024年12月22日
23h2 的 pte64 和 32 的结构体、英特尔的 ept_pte、ept_plm4e、ept_ptpte、ept_pde的结构体
图片一
typedef union _EPT_PTE
{
struct
{
ULONGLONG Read : 1;
ULONGLONG Write : 1;
ULONGLONG Execute : 1;
ULONGLONG MemoryType : 3;
ULONGLONG IgnorePAT : 1;
ULONGLONG Ignored0 : 1;
ULONGLONG Accessed : 1;
ULONGLONG Dirty : 1;
ULONGLONG UserExecute : 1;
ULONGLONG Ignored1 : 1;
ULONGLONG PageFrameNumber : 40;
ULONGLONG Ignored2 : 5;
ULONGLONG VerifyGuestPaging : 1;
ULONGLONG PagingWriteAccess : 1;
ULONGLONG Ignored3 : 1;
ULONGLONG SupervisorShadowStack : 1;
ULONGLONG SubPageWritePermissions : 1;
ULONGLONG Ignored4 : 1;
ULONGLONG SuppressVE : 1;
};
};
图片二
typedef union _IA32_VMX_BASIC_MSR {
struct {
unsigned RevId : 31;
unsigned Always0 : 1;
unsigned szVmxOnRegion : 13;
unsigned Reserved1 : 3;
unsigned PhysicalWidth : 1;
unsigned DualMonitor : 1;
unsigned MemoryType : 4;
unsigned VmExitInformation : 1;
unsigned VMXControlsClearable : 1;
unsigned VmEntryException : 1;
unsigned Reserved2 : 7;
};
ULONGLONG QuadPart;
} IA32_VMX_BASIC_MSR;
typedef union _IA32_FEATURE_CONTROL_MSR {
struct {
unsigned Lock : 1;
};
}
您好!您询问的是关于 Windows 23H2 版本中 64 位和 32 位页面表项(PTE)的结构体,以及英特尔的扩展页表(EPT,Extended Page Tables)相关结构体(如 EPT_PTE、EPT_PLM4E、EPT_PTPTE、EPT_PDE)的定义。以下内容将详细介绍这些结构体的定义及其用途。
在 64 位 Windows 操作系统中,页面表项(PTE)通常使用 64 位结构。以下是一个典型的 PTE64 结构体定义:
ctypedef union _PTE64 { struct { ULONGLONG Present : 1; // 页面存在位 ULONGLONG ReadWrite : 1; // 读/写权限 ULONGLONG UserSupervisor : 1; // 用户/内核模式 ULONGLONG PageWriteThrough: 1; // 写通缓存控制 ULONGLONG PageCacheDisable: 1; // 缓存禁用 ULONGLONG Accessed : 1; // 访问位 ULONGLONG Dirty : 1; // 脏位 ULONGLONG LargePage : 1; // 大页标志 ULONGLONG Global : 1; // 全局页 ULONGLONG Available : 3; // 可用位 ULONGLONG PageFrameNumber : 40; // 页框号 ULONGLONG Reserved : 11; // 保留 ULONGLONG ProtectionKey : 4; // 保护键 ULONGLONG NoExecute : 1; // 禁止执行 }; ULONGLONG Value; // 整个 PTE 的值 } PTE64, *PPTE64;
在 32 位 Windows 操作系统中,页面表项(PTE)通常使用 32 位结构。以下是一个典型的 PTE32 结构体定义:
ctypedef union _PTE32 { struct { ULONG Present : 1; // 页面存在位 ULONG ReadWrite : 1; // 读/写权限 ULONG UserSupervisor : 1; // 用户/内核模式 ULONG PageWriteThrough: 1; // 写通缓存控制 ULONG PageCacheDisable: 1; // 缓存禁用 ULONG Accessed : 1; // 访问位 ULONG Dirty : 1; // 脏位 ULONG LargePage : 1; // 大页标志 ULONG Global : 1; // 全局页 ULONG Available : 3; // 可用位 ULONG PageFrameNumber : 20; // 页框号 }; ULONG Value; // 整个 PTE 的值 } PTE32, *PPTE32;
英特尔的 EPT(Extended Page Tables)是硬件辅助虚拟化技术的一部分,用于优化虚拟机的内存管理。以下是一些主要的 EPT 相关结构体定义:
EPT_PTE 表示 EPT 中的页表项,用于描述虚拟机的页表条目。以下是其定义:
ctypedef union _EPT_PTE { struct { ULONGLONG Read : 1; // 读权限 ULONGLONG Write : 1; // 写权限 ULONGLONG Execute : 1; // 执行权限 ULONGLONG MemoryType : 3; // 内存类型(如 UC, WC, etc.) ULONGLONG IgnorePAT : 1; // 忽略 PAT ULONGLONG Ignored0 : 1; // 保留 ULONGLONG Accessed : 1; // 访问位 ULONGLONG Dirty : 1; // 脏位 ULONGLONG UserExecute : 1; // 用户执行权限 ULONGLONG Ignored1 : 1; // 保留 ULONGLONG PageFrameNumber : 40; // 页框号 ULONGLONG Ignored2 : 5; // 保留 ULONGLONG VerifyGuestPaging : 1; // 验证客户页 ULONGLONG PagingWriteAccess : 1; // 分页写访问 ULONGLONG Ignored3 : 1; // 保留 ULONGLONG SupervisorShadowStack : 1; // 管理员阴影栈 ULONGLONG SubPageWritePermissions : 1; // 子页写权限 ULONGLONG Ignored4 : 1; // 保留 ULONGLONG SuppressVE : 1; // 抑制虚拟化扩展 }; ULONGLONG Value; // 整个 EPT PTE 的值 } EPT_PTE, *PEPT_PTE;
EPT_PDE 表示 EPT 中的页目录项,用于描述虚拟机的页目录条目。以下是其定义:
ctypedef union _EPT_PDE { struct { ULONGLONG Read : 1; // 读权限 ULONGLONG Write : 1; // 写权限 ULONGLONG Execute : 1; // 执行权限 ULONGLONG MemoryType : 3; // 内存类型 ULONGLONG IgnorePAT : 1; // 忽略 PAT ULONGLONG Ignored0 : 1; // 保留 ULONGLONG Accessed : 1; // 访问位 ULONGLONG Reserved1 : 1; // 保留 ULONGLONG PageFrameNumber : 40; // 页框号 ULONGLONG Ignored1 : 11; // 保留 ULONGLONG ExecuteForUser : 1; // 用户执行权限 }; ULONGLONG Value; // 整个 EPT PDE 的值 } EPT_PDE, *PEPT_PDE;
EPT_PLM4E 可能是特定层级的 EPT 页目录项,具体取决于 EPT 结构的实现。以下是一个假设的定义:
ctypedef union _EPT_PLM4E { struct { ULONGLONG Read : 1; ULONGLONG Write : 1; ULONGLONG Execute : 1; ULONGLONG MemoryType : 3; ULONGLONG IgnorePAT : 1; ULONGLONG Ignored0 : 1; ULONGLONG Accessed : 1; ULONGLONG Dirty : 1; ULONGLONG UserExecute : 1; ULONGLONG Ignored1 : 1; ULONGLONG PageFrameNumber : 40; ULONGLONG Ignored2 : 5; ULONGLONG VerifyGuestPaging : 1; ULONGLONG PagingWriteAccess : 1; ULONGLONG Ignored3 : 1; ULONGLONG SupervisorShadowStack : 1; ULONGLONG SubPageWritePermissions : 1; ULONGLONG Ignored4 : 1; ULONGLONG SuppressVE : 1; }; ULONGLONG Value; } EPT_PLM4E, *PEPT_PLM4E;
EPT_PTPTE 表示 EPT 中的页表页表项,以下是一个假设的定义:
ctypedef union _EPT_PTPTE { struct { ULONGLONG Read : 1; ULONGLONG Write : 1; ULONGLONG Execute : 1; ULONGLONG MemoryType : 3; ULONGLONG IgnorePAT : 1; ULONGLONG Ignored0 : 1; ULONGLONG Accessed : 1; ULONGLONG Dirty : 1; ULONGLONG UserExecute : 1; ULONGLONG Ignored1 : 1; ULONGLONG PageFrameNumber : 40; ULONGLONG Ignored2 : 5; ULONGLONG VerifyGuestPaging : 1; ULONGLONG PagingWriteAccess : 1; ULONGLONG Ignored3 : 1; ULONGLONG SupervisorShadowStack : 1; ULONGLONG SubPageWritePermissions : 1; ULONGLONG Ignored4 : 1; ULONGLONG SuppressVE : 1; }; ULONGLONG Value; } EPT_PTPTE, *PEPT_PTPTE;
您还提供了两个 MSR(Model-Specific Register)相关的结构体,以下是它们的定义和说明:
IA32_VMX_BASIC_MSR 用于获取 VMX 基本信息,如 VMX 扩展区域的大小、物理地址宽度等。
ctypedef union _IA32_VMX_BASIC_MSR { struct { unsigned RevId : 31; // 修订版本号 unsigned Always0 : 1; // 始终为 0 unsigned szVmxOnRegion : 13; // VMXON 区域大小 unsigned Reserved1 : 3; // 保留 unsigned PhysicalWidth : 1; // 物理地址宽度 unsigned DualMonitor : 1; // 双监控支持 unsigned MemoryType : 4; // 内存类型 unsigned VmExitInformation : 1; // VM 退出信息 unsigned VMXControlsClearable : 1; // VMX 控制位可清除 unsigned VmEntryException : 1; // VM 入口异常 unsigned Reserved2 : 7; // 保留 }; ULONGLONG QuadPart; // 整个 MSR 的值 } IA32_VMX_BASIC_MSR;
IA32_FEATURE_CONTROL_MSR 用于控制和锁定 VMX 功能,确保在启用 VMX 操作前需要特定的权限设置。
ctypedef union _IA32_FEATURE_CONTROL_MSR { struct { unsigned Lock : 1; // 锁定位 unsigned EnableVmxOutsideSmx : 1; // 在非 SMX 模式下启用 VMX unsigned EnableVmxInsideSmx : 1; // 在 SMX 模式下启用 VMX unsigned Reserved : 29; // 保留 }; ULONGLONG QuadPart; // 整个 MSR 的值 } IA32_FEATURE_CONTROL_MSR;
希望以上内容能够帮助您理解和使用这些结构体。如果您有更多具体的问题或需要进一步的解释,请随时提问!