问题描述
我做了一些有关记忆分析的实验。 我有一些问题。
我知道,几乎目录表库可以划分4k(4096)。
但是我在Windows 10(1909)中的进程具有0x14695e002 DTB。
这样就不能分割4k。 2个拉面。
为什么我的窗户有这个价值?
解决方法
dirBase /目录表基址是当前进程的CR3寄存器的值。如您所知,CR3是基址寄存器,它(间接地)指向PML4(或PDPT)表的基址,并在进程之间切换时使用,基本上可以切换其整个物理内存。
基本CR3
您可能已经在Intel手册中看到过,CPU应该忽略CR3的低4位(具有4级分页功能的CR3寄存器的格式):
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)。
因此,当设置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)。