目录表的基础划分为4k,但我的Windows DTB / 4k = x ... 2

问题描述

我做了一些有关记忆分析的实验。 我有一些问题。

我知道,几乎目录表库可以划分4k(4096)。
但是我在Windows 10(1909)中的进程具有0x14695e002 DTB。
这样就不能分割4k。 2个拉面。

为什么我的窗户有这个价值?

解决方法

dirBase /目录表基址是当前进程的CR3寄存器的值。如您所知,CR3是基址寄存器,它(间接地)指向PML4(或PDPT)表的基址,并在进程之间切换时使用,基本上可以切换其整个物理内存。

基本CR3

您可能已经在Intel手册中看到过,CPU应该忽略CR3的低4位(具有4级分页功能的CR3寄存器的格式):

CR3 register

4级分页

现在,如果您仔细阅读英特尔手册(Chapter 4.5; 4-level Paging)上的内容。

如果CR0.PG = 1,CR4.PAE = 1,并且IA32_EFER.LME = 1,则逻辑处理器将使用4级分页

分别:分页;物理地址扩展;长模式启用。

将CR3与4级分页一起使用取决于是否通过设置CR4.PCIDE启用了进程上下文标识符(PCID)。

CR4.PCIDE

CR4.PCIDE已记录在英特尔手册(Chapter 2.5 Control Registers)中:

CR4.PCIDE PCID启用位(CR4的第17位)—设置时启用进程上下文标识符(PCID)。请参见第4.10.1节“进程上下文标识符(PCID)”。只能在IA-32e模式下设置(如果IA32_EFER.LMA = 1)。

enter image description here

因此,当设置CR4.PCIDE时,会将CR3的低12位(0:11)用作PCID,即“进程上下文标识符”(位12至M-1,其中M通常为48 ,用于PML4表基址的物理地址。

PCID

PCID在Intel Manuel(Chapter 4.10.1; Process-Context Identifiers (PCIDs))中有记录:

进程上下文标识符(PCID)是一种工具,逻辑处理器可通过该工具缓存多个线性地址空间的信息。当软件切换到具有不同PCID的不同线性地址空间时,处理器可以保留缓存的信息。

在同一章中还有更多内容:

当逻辑处理器在TLB和分页结构缓存中创建条目时,会将这些条目与当前PCID相关联。

因此,据我所知,基本上PCID是一种有选择地控制在上下文切换发生时如何保留或刷新TLB和分页结构缓存的方法。

一些的用于可缓存性控制的指令(例如CLFLUSH,CLFLUSHOPT,CLWB,INVD,WBINVD,INVLPG,INVPCID和具有非临时提示的内存指令)将检查PCID要么清除与精确PCID有关的所有内容,要么仅清除一部分缓存(例如TLB),并使所有内容都与给定的PCID相关。

例如INVPLG指令:

INVLPG指令通常只刷新指定页面的TLB条目;但是,在某些情况下,它可能会刷新更多条目,甚至是整个TLB。该指令使与当前PCID关联的TLB条目无效,并且对于与其他PCID关联的TLB条目无效。

INVPCID特别使用PCID:

基于进程上下文标识符(PCID)使转换后备缓冲区(TLB)和分页结构缓存中的映射无效

我不知道为什么Windows上它总是2(据我所见,对于系统中的每个进程总是2)。