Author: fireball Date: Sun Jan 27 20:38:15 2008 New Revision: 32031
URL: http://svn.reactos.org/svn/reactos?rev=32031&view=rev Log: - Finally switch to the new memory manager, which is compatible both with ReactOS and NT-style boot types. - Added: memory types for each allocation request, ability to alloc and free memory from the heap, ability to use 1 megabyte of low memory too (which was just wasted previously). - Removed: a bunch of hacky stuff.
Modified: trunk/reactos/boot/freeldr/freeldr/mm/meminit.c trunk/reactos/boot/freeldr/freeldr/mm/mm.c
Modified: trunk/reactos/boot/freeldr/freeldr/mm/meminit.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/mm/mem... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/mm/meminit.c (original) +++ trunk/reactos/boot/freeldr/freeldr/mm/meminit.c Sun Jan 27 20:38:15 2008 @@ -1,6 +1,6 @@ /* * FreeLoader - * Copyright (C) 1998-2003 Brian Palmer brianp@sginet.com + * Copyright (C) 2006-2008 Aleksey Bragin aleksey@reactos.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -43,6 +43,9 @@ ULONG FreePagesInLookupTable = 0; ULONG LastFreePageHint = 0;
+extern ULONG_PTR MmHeapPointer; +extern ULONG_PTR MmHeapStart; + BOOLEAN MmInitializeMemoryManager(VOID) { BIOS_MEMORY_MAP BiosMemoryMap[32]; @@ -93,10 +96,56 @@ MmInitPageLookupTable(PageLookupTableAddress, TotalPagesInLookupTable, BiosMemoryMap, BiosMemoryMapEntryCount); MmUpdateLastFreePageHint(PageLookupTableAddress, TotalPagesInLookupTable);
+ // Add machine-dependent stuff + // FIXME: this is only for i386 + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x00, 1, LoaderFirmwarePermanent); // realmode int vectors + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x01, 7, LoaderFirmwareTemporary); // freeldr stack + cmdline + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x08, 0x70, LoaderLoadedProgram); // freeldr image (roughly max. 0x64 pages) + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x78, 8, LoaderOsloaderStack); // prot mode stack. BIOSCALLBUFFER + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x80, 0x10, LoaderOsloaderHeap); // File system read buffer. FILESYSBUFFER + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x90, 0x10, LoaderOsloaderHeap); // Disk read buffer for int 13h. DISKREADBUFFER + MmMarkPagesInLookupTable(PageLookupTableAddress, 0xA0, 0x60, LoaderFirmwarePermanent); // ROM / Video + MmMarkPagesInLookupTable(PageLookupTableAddress, 0xFFF, 1, LoaderSpecialMemory); // unusable memory + + // This one is strange, without it WinNT crashes with PHASE0_EXCEPTION + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x59, 0x5, LoaderFirmwarePermanent); + FreePagesInLookupTable = MmCountFreePagesInLookupTable(PageLookupTableAddress, TotalPagesInLookupTable); + + MmInitializeHeap(PageLookupTableAddress);
DbgPrint((DPRINT_MEMORY, "Memory Manager initialized. %d pages available.\n", FreePagesInLookupTable)); return TRUE; +} + +VOID MmInitializeHeap(PVOID PageLookupTable) +{ + ULONG PagesNeeded; + ULONG HeapStart; + + // HACK: Make it so it doesn't overlap kernel space + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, LoaderSystemCode); + + // Find contigious memory block for HEAP:STACK + PagesNeeded = HEAP_PAGES + STACK_PAGES; + HeapStart = MmFindAvailablePages(PageLookupTable, TotalPagesInLookupTable, PagesNeeded, FALSE); + + // Unapply the hack + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, LoaderFree); + + if (HeapStart == 0) + { + UiMessageBox("Critical error: Can't allocate heap!"); + return; + } + + // Initialize BGET + bpool(HeapStart << MM_PAGE_SHIFT, PagesNeeded << MM_PAGE_SHIFT); + + // Mark those pages as used + MmMarkPagesInLookupTable(PageLookupTableAddress, HeapStart, PagesNeeded, LoaderOsloaderHeap); + + DbgPrint((DPRINT_MEMORY, "Heap initialized, base 0x%08x, pages %d\n", (HeapStart << MM_PAGE_SHIFT), PagesNeeded)); }
#ifdef DBG @@ -188,13 +237,21 @@ RtlCopyMemory(TempBiosMemoryMap, BiosMemoryMap, sizeof(BIOS_MEMORY_MAP) * 32); MmSortBiosMemoryMap(TempBiosMemoryMap, MapCount);
+ // Find a place, starting from the highest memory + // (thus leaving low memory for kernel/drivers) for (Index=(MapCount-1); Index>=0; Index--) { // If this is usable memory with a big enough length // then we'll put our page lookup table here - if (TempBiosMemoryMap[Index].Type == BiosMemoryUsable && TempBiosMemoryMap[Index].Length >= PageLookupTableSize) - { - PageLookupTableMemAddress = (PVOID)(ULONG)(TempBiosMemoryMap[Index].BaseAddress + (TempBiosMemoryMap[Index].Length - PageLookupTableSize)); + + // skip if this is not usable region + if (TempBiosMemoryMap[Index].Type != BiosMemoryUsable) + continue; + + if (TempBiosMemoryMap[Index].Length >= PageLookupTableSize) + { + PageLookupTableMemAddress = (PVOID)(ULONG) + (TempBiosMemoryMap[Index].BaseAddress + (TempBiosMemoryMap[Index].Length - PageLookupTableSize)); break; } } @@ -241,7 +298,7 @@ // Mark every page as allocated initially // We will go through and mark pages again according to the memory map // But this will mark any holes not described in the map as allocated - MmMarkPagesInLookupTable(PageLookupTable, 0, TotalPageCount, 1); + MmMarkPagesInLookupTable(PageLookupTable, 0, TotalPageCount, LoaderFirmwarePermanent);
for (Index=0; Index<MapCount; Index++) { @@ -254,8 +311,9 @@ }
// 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, LoaderFirmwarePermanent); + //FIXME: Not needed now since we mark low 1Mb with really used and free areas + //DbgPrint((DPRINT_MEMORY, "Marking the low 1MB region as reserved.\n")); + //MmMarkPagesInLookupTable(PageLookupTable, 0, 256, LoaderFirmwarePermanent);
// Mark the pages that the lookup table occupies as reserved PageLookupTableStartPage = MmGetPageNumberFromAddress(PageLookupTable); @@ -271,10 +329,12 @@
for (Index=StartPage; Index<(StartPage+PageCount); Index++) { +#if 0 if ((Index <= (StartPage + 16)) || (Index >= (StartPage+PageCount-16))) { DbgPrint((DPRINT_MEMORY, "Index = %d StartPage = %d PageCount = %d\n", Index, StartPage, PageCount)); } +#endif RealPageLookupTable[Index].PageAllocated = PageAllocated; RealPageLookupTable[Index].PageAllocationLength = (PageAllocated != LoaderFree) ? 1 : 0; } @@ -288,7 +348,7 @@
for (Index=StartPage; Index<(StartPage+PageCount); Index++) { - RealPageLookupTable[Index].PageAllocated = LoaderSystemCode; + RealPageLookupTable[Index].PageAllocated = MemoryType; RealPageLookupTable[Index].PageAllocationLength = (Index == StartPage) ? PageCount : 0; } } @@ -326,7 +386,8 @@ if (FromEnd) { /* Allocate "high" (from end) pages */ - for (Index=LastFreePageHint-1; Index>0; Index--) + for (Index=/*LastFreePageHint-1*/LOADER_HIGH_ZONE-1; Index>0; Index--) + //for (Index=LastFreePageHint-1; Index>0; Index--) { if (RealPageLookupTable[Index].PageAllocated != LoaderFree) {
Modified: trunk/reactos/boot/freeldr/freeldr/mm/mm.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/boot/freeldr/freeldr/mm/mm.... ============================================================================== --- trunk/reactos/boot/freeldr/freeldr/mm/mm.c (original) +++ trunk/reactos/boot/freeldr/freeldr/mm/mm.c Sun Jan 27 20:38:15 2008 @@ -1,6 +1,6 @@ /* * FreeLoader - * Copyright (C) 1998-2003 Brian Palmer brianp@sginet.com + * Copyright (C) 2006-2008 Aleksey Bragin aleksey@reactos.org * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,35 +20,10 @@ #include <freeldr.h> #include <debug.h>
-ULONG AllocationCount = 0; - -#ifdef DBG -VOID VerifyHeap(VOID); +#ifdef DBG VOID DumpMemoryAllocMap(VOID); -VOID IncrementAllocationCount(VOID); -VOID DecrementAllocationCount(VOID); VOID MemAllocTest(VOID); #endif // DBG - -/* - * Hack alert - * Normally, we allocate whole pages. This is ofcourse wastefull for small - * allocations (a few bytes). So, for small allocations (smaller than a page) - * we sub-allocate. When the first small allocation is done, a page is - * requested. We keep a pointer to that page in SubAllocationPage. The alloc - * is satisfied by returning a pointer to the beginning of the page. We also - * keep track of how many bytes are still available in the page in SubAllocationRest. - * When the next small request comes in, we try to allocate it just after the - * memory previously allocated. If it won't fit, we allocate a new page and - * the whole process starts again. - * Note that suballocations are done back-to-back, there's no bookkeeping at all. - * That also means that we cannot really free suballocations. So, when a free is - * done and it is determined that this might be a free of a sub-allocation, we - * just no-op the free. - * Perhaps we should use the heap routines from ntdll here. - */ -static PVOID SubAllocationPage = NULL; -static unsigned SubAllocationRest = 0;
BOOLEAN AllocateFromEnd = TRUE;
@@ -71,12 +46,6 @@ }
MemorySize = ROUND_UP(MemorySize, 4); - if (MemorySize <= SubAllocationRest) - { - MemPointer = (PVOID)((ULONG_PTR)SubAllocationPage + MM_PAGE_SIZE - SubAllocationRest); - SubAllocationRest -= MemorySize; - return MemPointer; - }
// Find out how many blocks it will take to // satisfy this allocation @@ -86,7 +55,7 @@ // then return NULL if (FreePagesInLookupTable < PagesNeeded) { - DbgPrint((DPRINT_MEMORY, "Memory allocation failed in MmAllocateMemory(). Not enough free memory to allocate %d bytes. AllocationCount: %d\n", MemorySize, AllocationCount)); + DbgPrint((DPRINT_MEMORY, "Memory allocation failed in MmAllocateMemory(). Not enough free memory to allocate %d bytes.\n", MemorySize)); UiMessageBoxCritical("Memory allocation failed: out of memory."); return NULL; } @@ -95,7 +64,7 @@
if (FirstFreePageFromEnd == (ULONG)-1) { - DbgPrint((DPRINT_MEMORY, "Memory allocation failed in MmAllocateMemory(). Not enough free memory to allocate %d bytes. AllocationCount: %d\n", MemorySize, AllocationCount)); + DbgPrint((DPRINT_MEMORY, "Memory allocation failed in MmAllocateMemory(). Not enough free memory to allocate %d bytes.\n", MemorySize)); UiMessageBoxCritical("Memory allocation failed: out of memory."); return NULL; } @@ -105,22 +74,47 @@ FreePagesInLookupTable -= PagesNeeded; MemPointer = (PVOID)(FirstFreePageFromEnd * MM_PAGE_SIZE);
- if (MemorySize < MM_PAGE_SIZE) - { - SubAllocationPage = MemPointer; - SubAllocationRest = MM_PAGE_SIZE - MemorySize; - } - - -#ifdef DBG - IncrementAllocationCount(); - DbgPrint((DPRINT_MEMORY, "Allocated %d bytes (%d pages) of memory starting at page %d. AllocCount: %d\n", MemorySize, PagesNeeded, FirstFreePageFromEnd, AllocationCount)); +#ifdef DBG + DbgPrint((DPRINT_MEMORY, "Allocated %d bytes (%d pages) of memory starting at page %d.\n", MemorySize, PagesNeeded, FirstFreePageFromEnd)); DbgPrint((DPRINT_MEMORY, "Memory allocation pointer: 0x%x\n", MemPointer)); //VerifyHeap(); #endif // DBG
// Now return the pointer return MemPointer; +} + +PVOID MmHeapAlloc(ULONG MemorySize) +{ + PVOID Result; + LONG CurAlloc, TotalFree, MaxFree, NumberOfGets, NumberOfRels; + + if (MemorySize > MM_PAGE_SIZE) + { + DbgPrint((DPRINT_MEMORY, "Consider using other functions to allocate %d bytes of memory!\n", MemorySize)); + } + + // Get the buffer from BGET pool + Result = bget(MemorySize); + + if (Result == NULL) + { + DbgPrint((DPRINT_MEMORY, "Heap allocation for %d bytes failed\n", MemorySize)); + } + + // Gather some stats + bstats(&CurAlloc, &TotalFree, &MaxFree, &NumberOfGets, &NumberOfRels); + + DbgPrint((DPRINT_MEMORY, "Current alloced %d bytes, free %d bytes, allocs %d, frees %d\n", + CurAlloc, TotalFree, NumberOfGets, NumberOfRels)); + + return Result; +} + +VOID MmHeapFree(PVOID MemoryPointer) +{ + // Release the buffer to the pool + brel(MemoryPointer); }
PVOID MmAllocateMemory(ULONG MemorySize) @@ -155,7 +149,7 @@ { DbgPrint((DPRINT_MEMORY, "Memory allocation failed in MmAllocateMemoryAtAddress(). " "Not enough free memory to allocate %d bytes (requesting %d pages but have only %d). " - "AllocationCount: %d\n", MemorySize, PagesNeeded, FreePagesInLookupTable, AllocationCount)); + "\n", MemorySize, PagesNeeded, FreePagesInLookupTable)); UiMessageBoxCritical("Memory allocation failed: out of memory."); return NULL; } @@ -163,8 +157,8 @@ if (MmAreMemoryPagesAvailable(PageLookupTableAddress, TotalPagesInLookupTable, DesiredAddress, PagesNeeded) == FALSE) { DbgPrint((DPRINT_MEMORY, "Memory allocation failed in MmAllocateMemoryAtAddress(). " - "Not enough free memory to allocate %d bytes at address %p. AllocationCount: %d\n", - MemorySize, DesiredAddress, AllocationCount)); + "Not enough free memory to allocate %d bytes at address %p.\n", + MemorySize, DesiredAddress));
// Don't tell this to user since caller should try to alloc this memory // at a different address @@ -178,8 +172,7 @@ MemPointer = (PVOID)(StartPageNumber * MM_PAGE_SIZE);
#ifdef DBG - IncrementAllocationCount(); - DbgPrint((DPRINT_MEMORY, "Allocated %d bytes (%d pages) of memory starting at page %d. AllocCount: %d\n", MemorySize, PagesNeeded, StartPageNumber, AllocationCount)); + DbgPrint((DPRINT_MEMORY, "Allocated %d bytes (%d pages) of memory starting at page %d.\n", MemorySize, PagesNeeded, StartPageNumber)); DbgPrint((DPRINT_MEMORY, "Memory allocation pointer: 0x%x\n", MemPointer)); //VerifyHeap(); #endif // DBG @@ -213,7 +206,7 @@ // then return NULL if (FreePagesInLookupTable < PagesNeeded) { - DbgPrint((DPRINT_MEMORY, "Memory allocation failed in MmAllocateHighestMemoryBelowAddress(). Not enough free memory to allocate %d bytes. AllocationCount: %d\n", MemorySize, AllocationCount)); + DbgPrint((DPRINT_MEMORY, "Memory allocation failed in MmAllocateHighestMemoryBelowAddress(). Not enough free memory to allocate %d bytes.\n", MemorySize)); UiMessageBoxCritical("Memory allocation failed: out of memory."); return NULL; } @@ -222,7 +215,7 @@
if (FirstFreePageFromEnd == 0) { - DbgPrint((DPRINT_MEMORY, "Memory allocation failed in MmAllocateHighestMemoryBelowAddress(). Not enough free memory to allocate %d bytes. AllocationCount: %d\n", MemorySize, AllocationCount)); + DbgPrint((DPRINT_MEMORY, "Memory allocation failed in MmAllocateHighestMemoryBelowAddress(). Not enough free memory to allocate %d bytes.\n", MemorySize)); UiMessageBoxCritical("Memory allocation failed: out of memory."); return NULL; } @@ -233,8 +226,7 @@ MemPointer = (PVOID)(FirstFreePageFromEnd * MM_PAGE_SIZE);
#ifdef DBG - IncrementAllocationCount(); - DbgPrint((DPRINT_MEMORY, "Allocated %d bytes (%d pages) of memory starting at page %d. AllocCount: %d\n", MemorySize, PagesNeeded, FirstFreePageFromEnd, AllocationCount)); + DbgPrint((DPRINT_MEMORY, "Allocated %d bytes (%d pages) of memory starting at page %d.\n", MemorySize, PagesNeeded, FirstFreePageFromEnd)); DbgPrint((DPRINT_MEMORY, "Memory allocation pointer: 0x%x\n", MemPointer)); //VerifyHeap(); #endif // DBG @@ -245,141 +237,9 @@
VOID MmFreeMemory(PVOID MemoryPointer) { - ULONG PageNumber; - ULONG PageCount; - ULONG Idx; - PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTableAddress; - -#ifdef DBG - - // Make sure we didn't get a bogus pointer - if (MemoryPointer >= (PVOID)(TotalPagesInLookupTable * MM_PAGE_SIZE)) - { - BugCheck((DPRINT_MEMORY, "Bogus memory pointer (0x%x) passed to MmFreeMemory()\n", MemoryPointer)); - } -#endif // DBG - - // Find out the page number of the first - // page of memory they allocated - PageNumber = MmGetPageNumberFromAddress(MemoryPointer); - PageCount = RealPageLookupTable[PageNumber].PageAllocationLength; - -#ifdef DBG - // Make sure we didn't get a bogus pointer - if ((PageCount < 1) || (PageCount > (TotalPagesInLookupTable - PageNumber))) - { - BugCheck((DPRINT_MEMORY, "Invalid page count in lookup table. PageLookupTable[%d].PageAllocationLength = %d\n", PageNumber, RealPageLookupTable[PageNumber].PageAllocationLength)); - } - - // Loop through our array check all the pages - // to make sure they are allocated with a length of 0 - for (Idx=PageNumber+1; Idx<(PageNumber + PageCount); Idx++) - { - 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)); - } - } - -#endif - - /* If this allocation is only a single page, it could be a sub-allocated page. - * Just don't free it */ - if (1 == PageCount) - { - return; - } - - // Loop through our array and mark all the - // blocks as free - for (Idx=PageNumber; Idx<(PageNumber + PageCount); Idx++) - { - RealPageLookupTable[Idx].PageAllocated = LoaderFree; - RealPageLookupTable[Idx].PageAllocationLength = 0; - } - - FreePagesInLookupTable += PageCount; - -#ifdef DBG - DecrementAllocationCount(); - DbgPrint((DPRINT_MEMORY, "Freed %d pages of memory starting at page %d. AllocationCount: %d\n", PageCount, PageNumber, AllocationCount)); - //VerifyHeap(); -#endif // DBG -} - -PVOID MmHeapAlloc(ULONG MemorySize) -{ - // Temporary forwarder... - return MmAllocateMemoryWithType(MemorySize, LoaderOsloaderHeap); -} - -VOID MmHeapFree(PVOID MemoryPointer) -{ - // Stub for WinLdr -} - - -#ifdef DBG -VOID VerifyHeap(VOID) -{ - ULONG Idx; - ULONG Idx2; - ULONG Count; - PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTableAddress; - - if (DUMP_MEM_MAP_ON_VERIFY) - { - DumpMemoryAllocMap(); - } - - // Loop through the array and verify that - // everything is kosher - for (Idx=0; Idx<TotalPagesInLookupTable; Idx++) - { - // Check if this block is allocated - if (RealPageLookupTable[Idx].PageAllocated != LoaderFree) - { - // This is the first block in the run so it - // had better have a length that is within range - if ((RealPageLookupTable[Idx].PageAllocationLength < 1) || (RealPageLookupTable[Idx].PageAllocationLength > (TotalPagesInLookupTable - Idx))) - { - BugCheck((DPRINT_MEMORY, "Allocation length out of range in heap table. PageLookupTable[Idx].PageAllocationLength = %d\n", RealPageLookupTable[Idx].PageAllocationLength)); - } - - // Now go through and verify that the rest of - // this run has the blocks marked allocated - // with a length of zero but don't check the - // first one because we already did - Count = RealPageLookupTable[Idx].PageAllocationLength; - for (Idx2=1; Idx2<Count; Idx2++) - { - // Make sure it's allocated - if (RealPageLookupTable[Idx + Idx2].PageAllocated == LoaderFree) - { - BugCheck((DPRINT_MEMORY, "Lookup table indicates hole in memory allocation. RealPageLookupTable[Idx + Idx2].PageAllocated == 0\n")); - } - - // Make sure the length is zero - if (RealPageLookupTable[Idx + Idx2].PageAllocationLength != 0) - { - BugCheck((DPRINT_MEMORY, "Allocation chain has non-zero value in non-first block in lookup table. RealPageLookupTable[Idx + Idx2].PageAllocationLength != 0\n")); - } - } - - // Move on to the next run - Idx += (Count - 1); - } - else - { - // Nope, not allocated so make sure the length is zero - if (RealPageLookupTable[Idx].PageAllocationLength != 0) - { - BugCheck((DPRINT_MEMORY, "Free block is start of memory allocation. RealPageLookupTable[Idx].PageAllocationLength != 0\n")); - } - } - } -} +} + +#ifdef DBG
VOID DumpMemoryAllocMap(VOID) { @@ -393,7 +253,7 @@ if ((Idx % 32) == 0) { DbgPrint((DPRINT_MEMORY, "\n")); - DbgPrint((DPRINT_MEMORY, "%x:\t", (Idx * MM_PAGE_SIZE))); + DbgPrint((DPRINT_MEMORY, "%08x:\t", (Idx * MM_PAGE_SIZE))); } else if ((Idx % 4) == 0) { @@ -455,47 +315,6 @@
DbgPrint((DPRINT_MEMORY, "\n")); } - -VOID IncrementAllocationCount(VOID) -{ - AllocationCount++; -} - -VOID DecrementAllocationCount(VOID) -{ - AllocationCount--; -} - -VOID MemAllocTest(VOID) -{ - PVOID MemPtr1; - PVOID MemPtr2; - PVOID MemPtr3; - PVOID MemPtr4; - PVOID MemPtr5; - - MemPtr1 = MmAllocateMemory(4096); - printf("MemPtr1: 0x%x\n", (int)MemPtr1); - MachConsGetCh(); - MemPtr2 = MmAllocateMemory(4096); - printf("MemPtr2: 0x%x\n", (int)MemPtr2); - MachConsGetCh(); - MemPtr3 = MmAllocateMemory(4096); - printf("MemPtr3: 0x%x\n", (int)MemPtr3); - DumpMemoryAllocMap(); - VerifyHeap(); - MachConsGetCh(); - - MmFreeMemory(MemPtr2); - MachConsGetCh(); - - MemPtr4 = MmAllocateMemory(2048); - printf("MemPtr4: 0x%x\n", (int)MemPtr4); - MachConsGetCh(); - MemPtr5 = MmAllocateMemory(4096); - printf("MemPtr5: 0x%x\n", (int)MemPtr5); - MachConsGetCh(); -} #endif // DBG
ULONG GetSystemMemorySize(VOID)