目录Table Base 分了4k,但是我的windows DTB / 4k = x ... 2

Directory Table Base divided 4k, but my windows DTB / 4k = x ... 2

我做了一些关于内存分析的实验。 我有一些问题..

几乎是目录Table我知道基数可以除以 4k(4096)。
但是我在 windows 10 (1909) 中的进程有 0x14695e002 DTB。
所以那不能划分4k。 2拉面。

为什么我的 windows 有那个值??

dirBase / Directory Table base 是当前进程的 CR3 寄存器的值。您可能知道 CR3 是基址寄存器,它(间接)指向 PML4(或 PDPT)table 的基址,并在进程之间切换时使用,这基本上切换了它们的整个物理内存。

基础 CR3

正如您在 Intel 手册中看到的那样,CR3 的低 4 位应该被 CPU(具有 4 级分页的 CR3 寄存器格式)忽略:

4级分页

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

A logical processor uses 4-level paging if CR0.PG = 1, CR4.PAE = 1, and IA32_EFER.LME = 1

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

Use of CR3 with 4-level paging depends on whether process context identifiers (PCIDs) have been enabled by setting CR4.PCIDE.

CR4.PCIDE

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

CR4.PCIDE PCID-Enable Bit (bit 17 of CR4) — Enables process-context identifiers (PCIDs) when set. See Section 4.10.1, “Process-Context Identifiers (PCIDs)”. Can be set only in IA-32e mode (if IA32_EFER.LMA = 1).

所以当设置CR4.PCIDE时,CR3的低12(0:11)位作为PCID,即一个“Process-Context标识符”(bits 12 to M-1 ,其中 M 通常为 48,用于 PML4 table).

基址的物理地址

PCID

英特尔手册中记录了 PCID (Chapter 4.10.1; Process-Context Identifiers (PCIDs)):

Process-context identifiers (PCIDs) are a facility by which a logical processor may cache information for multiple linear-address spaces. The processor may retain cached information when software switches to a different linear address space with a different PCID.

同一章更进一步:

When a logical processor creates entries in the TLBs [...] and paging-structure caches [...], it associates those entries with the current PCID.

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

部分操作可缓存性控制的指令(如CLFLUSH、CLFLUSHOPT、CLWB、INVD、WBINVD、INVLPG、INVPCID,内存指令non-temporal 提示) 将检查 PCID 以刷新与精确 PCID 有关的所有内容或仅刷新缓存的一部分(例如 TLB)并保留与给定 PCID 相关的所有内容。

例如INVPLG指令:

The INVLPG instruction normally flushes TLB entries only for the specified page; however, in some cases, it may flush more entries, even the entire TLB. The instruction invalidates TLB entries associated with the current PCID and may or may not do so for TLB entries associated with other PCIDs.

INVPCID具体使用PCIDs:

Invalidates mappings in the translation lookaside buffers (TLBs) and paging-structure caches based on process-context identifier (PCID)

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