Geoff Chappell - Software Analyst
For each physical page that’s in general use, the kernel keeps one MMPFN structure. Pages can be put into lists, e.g., of free physical pages. The MMPFNLIST_SHORT structure (formally _MMFPNLIST_SHORT) is a reduction of the MMPFNLIST to serve as the head for lists of pages that belong to the same NUMA node.
The MMPFNLIST_SHORT structure is 0x18 bytes in all releases yet inspected of 64-bit Windows 10:
Offset (x64) | Definition | Versions |
---|---|---|
0x00 |
ULONGLONG Total; |
10.0 and higher |
0x08 |
PFN_NUMBER Flink; |
10.0 and higher |
0x10 |
PFN_NUMBER Blink; |
10.0 and higher |
For each page that’s in a list for a NUMA node, the MMPFN has what are here termed NodeFlink and NodeBlink members set to the Page Frame Number (PFN) of the next and previous page, respectively, or to the terminating value 0x0000000F`FFFFFFFF if the page is at the tail or head.
These terms NodeFlink and NodeBlink are invented here as abstractions. They are each 36 bits but the MMPFN stores them in parts according to where space could be found for them. The high 28 and 20 bits of the forward and backward links, as NodeFlinkHigh and NodeBlinkHigh respectively, are packed into the qwords whose low 36 bits are the Flink and Blink in MMPFN members named u1 and u2. The low 8 and 16 bits, as NodeFlinkLow and NodeBlinkLow, are a full byte and word as direct MMPFN members.