我做了一些关于记忆分析的实验。我有些问题..。
我知道,几乎目录表库可以除以4k(4096)。
但是我在windows 10 (1909年)中的进程有0x14695e002DTB。
所以这不能除以4k。2个萝卜。
为什么我的窗户有这个价值??
发布于 2020-09-16 14:00:07
dirBase / Directory表库是当前进程的CR3寄存器的值。正如您可能知道的那样,CR3是基本寄存器,它(间接)指向PML4 (或PDPT)表的基座,并在进程之间切换时使用,这基本上切换了它们的整个物理内存。
碱基CR3
正如您在英特尔手册中所看到的,CR3的4个较低的位应该被CPU忽略(带有4级分页的CR3寄存器的格式):

4级分页
现在,如果你仔细看看英特尔手册(Chapter 4.5; 4-level Paging)。
逻辑处理器使用4级分页,如果CR0.PG = 1,CR4.PAE = 1,IA32_EFER.LME =1
分页;物理地址扩展;长模式启用。
使用4级分页的CR3取决于通过设置CR4.PCIDE是否启用了进程上下文标识符(PCID)。
CR4.PCIDE
CR4.PCIDE记录在“英特尔手册”(Chapter 2.5 Control Registers)中:
CR4.PCID-EnableBit(CR4的第17位)在设置过程上下文标识符(PCID)时启用。见4.10.1节,“过程-上下文标识符(PCID)”。只能在IA-32e模式下设置(如果IA32_EFER.LMA = 1)。

因此,当设置CR4.PCIDE时,将CR3的12 (0:11)较低的位用作PCID,即“进程上下文标识符”(通常为48的从12到M1的位用于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:
基于进程上下文标识符(
)的转换旁路缓冲区(TLBs)和分页结构缓存中的映射无效。
为什么在Windows上总是2(据我所见,系统中的每个进程总是2),我不知道。
https://stackoverflow.com/questions/63913493
复制相似问题