Implement PFN database initialization and memory descriptor processing

This commit is contained in:
2025-12-28 23:25:07 +01:00
parent 4593a89a9b
commit 0880a0f344
12 changed files with 841 additions and 0 deletions

View File

@@ -93,3 +93,69 @@ MM::Colors::GetPagingColorsMask()
/* Return the mask used for page coloring calculations */
return PagingColorsMask;
}
/**
* Initializes the data structures for page coloring.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
MM::Colors::InitializeColorTables(VOID)
{
PMMMEMORY_LAYOUT MemoryLayout;
PMMPTE PointerPte, LastPte;
ULONG Color;
PMMPTE ValidPte;
/* Get the memory layout */
MemoryLayout = MM::Manager::GetMemoryLayout();
/* Set the base address of the color tables to start right after the PFN database */
FreePages[0] = (PMMCOLOR_TABLES)&((PMMPFN)MemoryLayout->PfnDatabaseAddress)[MM::Pfn::GetHighestPhysicalPage() + 1];
/* Calculate the virtual address range for both color tables */
PointerPte = MM::Paging::GetPteAddress(&FreePages[0][0]);
LastPte = MM::Paging::GetPteAddress((PVOID)((ULONG_PTR)FreePages[0] +
(2 * PagingColors * sizeof(MMCOLOR_TABLES)) - 1));
/* Get a pointer to a PTE template */
ValidPte = MM::Pte::GetValidPte();
/* Ensure the entire virtual address range for the color tables is mapped */
while(PointerPte <= LastPte)
{
/* Check if a page in the range is not mapped */
if(!MM::Paging::PteValid(PointerPte))
{
/* Use the bootstrap allocator to get a physical page */
MM::Paging::SetPte(ValidPte, MM::Pfn::AllocateBootstrapPages(1), 0);
*PointerPte = *ValidPte;
/* Zero out the newly mapped page */
RTL::Memory::ZeroMemory(MM::Paging::GetPteVirtualAddress(PointerPte), MM_PAGE_SIZE);
}
/* Move to the next PTE in the range */
PointerPte = MM::Paging::GetNextPte(PointerPte);
}
/* Set the pointer for the second list */
FreePages[1] = &FreePages[0][PagingColors];
/* Initialize all entries in both color tables */
for(Color = 0; Color < PagingColors; Color++)
{
/* Initialize the FreePageList entry for the current color */
FreePages[FreePageList][Color].Flink = MAXULONG_PTR;
FreePages[FreePageList][Color].Blink = (PVOID)MAXULONG_PTR;
FreePages[FreePageList][Color].Count = 0;
/* Initialize the ZeroedPageList entry for the current color */
FreePages[ZeroedPageList][Color].Flink = MAXULONG_PTR;
FreePages[ZeroedPageList][Color].Blink = (PVOID)MAXULONG_PTR;
FreePages[ZeroedPageList][Color].Count = 0;
}
}