When the system initializes, the
After this point, the rest of the system virtual address space can be dynamically requested and released through
Region
Description
Limitable
MiVaSessionSpace (0x1)
Addresses for session space
Yes
MiVaProcessSpace (0x2)
Addresses for process address space
No
MiVaBootLoaded (0x3)
Addresses for images loaded by the boot loader
No
MiVaPfnDatabase (0x4)
Addresses for the PFN database
No
MiVaNonPagedPool (0x5)
Addresses for the nonpaged pool
Yes
MiVaPagedPool (0x6)
Addresses for the paged pool
Yes
MiVaSpecialPool (0x7)
Addresses for the special pool
No
MiVaSystemCache (0x8)
Addresses for the system cache
Yes
MiVaSystemPtes (0x9)
Addresses for system PTEs
Yes
MiVaHal (0xA)
Addresses for the HAL
No
MiVaSessionGlobalSpace (0xB)
Addresses for session global space
No
MiVaDriverImages (0xC)
Addresses for loaded driver images
No
Although the ability to dynamically reserve virtual address space on demand allows better management of virtual memory, it would be useless without the ability to free this memory. As such, when paged pool or the system cache can be shrunk, or when special pool and large page mappings are freed, the associated virtual address is freed. (Another case is when the boot registry is released.) This allows dynamic management of memory depending on each component’s use. Additionally, components can reclaim memory through
In addition to better proportioning and better management of virtual addresses dedicated to different kernel memory consumers, the dynamic virtual address allocator also has advantages when it comes to memory footprint reduction. Instead of having to manually preallocate static page table entries and page tables, paging-related structures are allocated on demand. On both 32-bit and 64-bit systems, this reduces boot-time memory usage because unused addresses won’t have their page tables allocated. It also means that on 64-bit systems, the large address space regions that are reserved don’t need to have their page tables mapped in memory, which allows them to have arbitrarily large limits, especially on systems that have little physical RAM to back the resulting paging structures.
EXPERIMENT: Querying System Virtual Address Usage