From 8e756fbebceca32fbfe3c9fffff23ebb2cdc0f60 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sat, 14 Oct 2006 13:36:21 +0000 Subject: [PATCH] - Use loader memory types in memory allocation bitmap instead of 0 for free memory and 1 for allocated - Slightly change / add comments svn path=/trunk/; revision=24509 --- reactos/boot/freeldr/freeldr/include/mm.h | 6 +-- reactos/boot/freeldr/freeldr/mm/meminit.c | 28 ++++++------ reactos/boot/freeldr/freeldr/mm/mm.c | 52 ++++++++++++++++++----- 3 files changed, 59 insertions(+), 27 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/include/mm.h b/reactos/boot/freeldr/freeldr/include/mm.h index 813bf2cc2eb..83c5fdf00c7 100644 --- a/reactos/boot/freeldr/freeldr/include/mm.h +++ b/reactos/boot/freeldr/freeldr/include/mm.h @@ -50,8 +50,8 @@ typedef struct typedef struct { - ULONG PageAllocated; // Zero = free, non-zero = allocated - ULONG PageAllocationLength; // Number of pages allocated (or zero if this isn't the first page in the chain) + TYPE_OF_MEMORY PageAllocated; // Type of allocated memory (LoaderFree if this memory is free) + ULONG PageAllocationLength; // Number of pages allocated (or zero if this isn't the first page in the chain) } PACKED PAGE_LOOKUP_TABLE_ITEM, *PPAGE_LOOKUP_TABLE_ITEM; // @@ -78,7 +78,7 @@ ULONG MmGetAddressablePageCountIncludingHoles(PBIOS_MEMORY_MAP BiosMemoryMap, U PVOID MmFindLocationForPageLookupTable(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MapCount); // Returns the address for a memory chunk big enough to hold the page lookup table (starts search from end of memory) VOID MmSortBiosMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MapCount); // Sorts the BIOS_MEMORY_MAP array so the first element corresponds to the first address in memory VOID MmInitPageLookupTable(PVOID PageLookupTable, ULONG TotalPageCount, PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MapCount); // Inits the page lookup table according to the memory types in the memory map -VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG PageCount, ULONG PageAllocated); // Marks the specified pages as allocated or free in the lookup table +VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG PageCount, TYPE_OF_MEMORY PageAllocated); // Marks the specified pages as allocated or free in the lookup table VOID MmAllocatePagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG PageCount); // Allocates the specified pages in the lookup table ULONG MmCountFreePagesInLookupTable(PVOID PageLookupTable, ULONG TotalPageCount); // Returns the number of free pages in the lookup table ULONG MmFindAvailablePages(PVOID PageLookupTable, ULONG TotalPageCount, ULONG PagesNeeded, BOOLEAN FromEnd); // Returns the page number of the first available page range from the beginning or end of memory diff --git a/reactos/boot/freeldr/freeldr/mm/meminit.c b/reactos/boot/freeldr/freeldr/mm/meminit.c index 0497551aa39..9a5f20058c4 100644 --- a/reactos/boot/freeldr/freeldr/mm/meminit.c +++ b/reactos/boot/freeldr/freeldr/mm/meminit.c @@ -77,6 +77,7 @@ BOOLEAN MmInitializeMemoryManager(VOID) MmFixupSystemMemoryMap(BiosMemoryMap, &BiosMemoryMapEntryCount); } + // Find address for the page lookup table TotalPagesInLookupTable = MmGetAddressablePageCountIncludingHoles(BiosMemoryMap, BiosMemoryMapEntryCount); PageLookupTableAddress = MmFindLocationForPageLookupTable(BiosMemoryMap, BiosMemoryMapEntryCount); LastFreePageHint = TotalPagesInLookupTable; @@ -90,6 +91,7 @@ BOOLEAN MmInitializeMemoryManager(VOID) return FALSE; } + // Initialize the page lookup table MmInitPageLookupTable(PageLookupTableAddress, TotalPagesInLookupTable, BiosMemoryMap, BiosMemoryMapEntryCount); MmUpdateLastFreePageHint(PageLookupTableAddress, TotalPagesInLookupTable); @@ -248,23 +250,23 @@ VOID MmInitPageLookupTable(PVOID PageLookupTable, ULONG TotalPageCount, PBIOS_ME MemoryMapStartPage = MmGetPageNumberFromAddress((PVOID)(ULONG)BiosMemoryMap[Index].BaseAddress); MemoryMapEndPage = MmGetPageNumberFromAddress((PVOID)(ULONG)(BiosMemoryMap[Index].BaseAddress + BiosMemoryMap[Index].Length - 1)); MemoryMapPageCount = (MemoryMapEndPage - MemoryMapStartPage) + 1; - MemoryMapPageAllocated = (BiosMemoryMap[Index].Type == BiosMemoryUsable) ? 0 : BiosMemoryMap[Index].Type; + MemoryMapPageAllocated = (BiosMemoryMap[Index].Type == BiosMemoryUsable) ? LoaderFree : LoaderFirmwarePermanent;/*BiosMemoryMap[Index].Type*/; DbgPrint((DPRINT_MEMORY, "Marking pages as type %d: StartPage: %d PageCount: %d\n", MemoryMapPageAllocated, MemoryMapStartPage, MemoryMapPageCount)); MmMarkPagesInLookupTable(PageLookupTable, MemoryMapStartPage, MemoryMapPageCount, MemoryMapPageAllocated); } // Mark the low memory region below 1MB as reserved (256 pages in region) DbgPrint((DPRINT_MEMORY, "Marking the low 1MB region as reserved.\n")); - MmMarkPagesInLookupTable(PageLookupTable, 0, 256, BiosMemoryReserved); + MmMarkPagesInLookupTable(PageLookupTable, 0, 256, LoaderFirmwarePermanent); - // Mark the pages that the lookup tabel occupies as reserved + // Mark the pages that the lookup table occupies as reserved PageLookupTableStartPage = MmGetPageNumberFromAddress(PageLookupTable); PageLookupTablePageCount = MmGetPageNumberFromAddress((PVOID)((ULONG_PTR)PageLookupTable + ROUND_UP(TotalPageCount * sizeof(PAGE_LOOKUP_TABLE_ITEM), MM_PAGE_SIZE))) - PageLookupTableStartPage; DbgPrint((DPRINT_MEMORY, "Marking the page lookup table pages as reserved StartPage: %d PageCount: %d\n", PageLookupTableStartPage, PageLookupTablePageCount)); - MmMarkPagesInLookupTable(PageLookupTable, PageLookupTableStartPage, PageLookupTablePageCount, BiosMemoryReserved); + MmMarkPagesInLookupTable(PageLookupTable, PageLookupTableStartPage, PageLookupTablePageCount, LoaderFirmwareTemporary); } -VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG PageCount, ULONG PageAllocated) +VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG PageCount, TYPE_OF_MEMORY PageAllocated) { PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable; ULONG Index; @@ -276,7 +278,7 @@ VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG Page DbgPrint((DPRINT_MEMORY, "Index = %d StartPage = %d PageCount = %d\n", Index, StartPage, PageCount)); } RealPageLookupTable[Index].PageAllocated = PageAllocated; - RealPageLookupTable[Index].PageAllocationLength = PageAllocated ? 1 : 0; + RealPageLookupTable[Index].PageAllocationLength = (PageAllocated != LoaderFree) ? 1 : 0; } DbgPrint((DPRINT_MEMORY, "MmMarkPagesInLookupTable() Done\n")); } @@ -288,7 +290,7 @@ VOID MmAllocatePagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG for (Index=StartPage; Index<(StartPage+PageCount); Index++) { - RealPageLookupTable[Index].PageAllocated = 1; + RealPageLookupTable[Index].PageAllocated = LoaderSystemCode; RealPageLookupTable[Index].PageAllocationLength = (Index == StartPage) ? PageCount : 0; } } @@ -302,7 +304,7 @@ ULONG MmCountFreePagesInLookupTable(PVOID PageLookupTable, ULONG TotalPageCount) FreePageCount = 0; for (Index=0; Index0; Index--) { - if (RealPageLookupTable[Index].PageAllocated != 0) + if (RealPageLookupTable[Index].PageAllocated != LoaderFree) { AvailablePagesSoFar = 0; continue; @@ -350,7 +352,7 @@ ULONG MmFindAvailablePages(PVOID PageLookupTable, ULONG TotalPageCount, ULONG Pa /* Allocate "low" pages */ for (Index=1; Index < LastFreePageHint; Index++) { - if (RealPageLookupTable[Index].PageAllocated != 0) + if (RealPageLookupTable[Index].PageAllocated != LoaderFree) { AvailablePagesSoFar = 0; continue; @@ -384,7 +386,7 @@ ULONG MmFindAvailablePagesBeforePage(PVOID PageLookupTable, ULONG TotalPageCount AvailablePagesSoFar = 0; for (Index=LastPage-1; Index>0; Index--) { - if (RealPageLookupTable[Index].PageAllocated != 0) + if (RealPageLookupTable[Index].PageAllocated != LoaderFree) { AvailablePagesSoFar = 0; continue; @@ -434,7 +436,7 @@ VOID MmUpdateLastFreePageHint(PVOID PageLookupTable, ULONG TotalPageCount) for (Index=TotalPageCount-1; Index>0; Index--) { - if (RealPageLookupTable[Index].PageAllocated == 0) + if (RealPageLookupTable[Index].PageAllocated == LoaderFree) { LastFreePageHint = Index + 1; break; @@ -461,7 +463,7 @@ BOOLEAN MmAreMemoryPagesAvailable(PVOID PageLookupTable, ULONG TotalPageCount, P { // If this page is allocated then there obviously isn't // memory availabe so return FALSE - if (RealPageLookupTable[Index].PageAllocated != 0) + if (RealPageLookupTable[Index].PageAllocated != LoaderFree) { return FALSE; } diff --git a/reactos/boot/freeldr/freeldr/mm/mm.c b/reactos/boot/freeldr/freeldr/mm/mm.c index e1d7fcc7f3b..1e36519f4dc 100644 --- a/reactos/boot/freeldr/freeldr/mm/mm.c +++ b/reactos/boot/freeldr/freeldr/mm/mm.c @@ -271,7 +271,7 @@ VOID MmFreeMemory(PVOID MemoryPointer) // to make sure they are allocated with a length of 0 for (Idx=PageNumber+1; Idx<(PageNumber + PageCount); Idx++) { - if ((RealPageLookupTable[Idx].PageAllocated != 1) || + if ((RealPageLookupTable[Idx].PageAllocated == LoaderFree) || (RealPageLookupTable[Idx].PageAllocationLength != 0)) { BugCheck((DPRINT_MEMORY, "Invalid page entry in lookup table, PageAllocated should = 1 and PageAllocationLength should = 0 because this is not the first block in the run. PageLookupTable[%d].PageAllocated = %d PageLookupTable[%d].PageAllocationLength = %d\n", PageNumber, RealPageLookupTable[PageNumber].PageAllocated, PageNumber, RealPageLookupTable[PageNumber].PageAllocationLength)); @@ -291,7 +291,7 @@ VOID MmFreeMemory(PVOID MemoryPointer) // blocks as free for (Idx=PageNumber; Idx<(PageNumber + PageCount); Idx++) { - RealPageLookupTable[Idx].PageAllocated = 0; + RealPageLookupTable[Idx].PageAllocated = LoaderFree; RealPageLookupTable[Idx].PageAllocationLength = 0; } @@ -322,7 +322,7 @@ VOID VerifyHeap(VOID) for (Idx=0; Idx