[ros-diffs] [ros-arm-bringup] 42131: - Separe ARM3 Init into 3 defined phases: - 1: No PFN Database exists - 2: PFN Database exists - 3: ReactOS NP Pool exists (deprecated) - Cleanup ReactOS Mm init to work with this. - ARM3 Phase 1 Init now uses pages directly from the physical memory descriptor. - This similar to how "MmAllocEarlyPage" used to work. - A new function MxGetNextPage now does this. - MxGetNextPage can allocate more than just one page however (making it possible to get contiguous physical memory without going through the PFN-based MmAllocateContiguousMemory beast) - Also MxGetNextPage will bugcheck with INSTALL_MORE_MEMORY if it runs out of pages. - Renamed the physical memory descriptor variables to MxFreeDescriptor, MxOldFreeDescriptor instead of MiFreeDescriptor and MiOrgFreeDescriptor (based on NT symbols) - Nonpaged pool PDEs, PFN database PDEs, and initial nonpaged pool PTEs are now allocated through MxGetNextPage. - Fix an off by one error in the sizing of MxPfnAllocation. - The PFN database is now fully "owned" by ARM3 in terms of its PDE mappings and VA location at 0xB0000000. - ie. MmArmPfnDatabase is now MmPfnDatabase. - The actual PFN database entries and setup are still done by the ReactOS Mm. - Got rid of ARM nonpaged pool allocator test. - Repositioned ReactOS nonpaged pool (deprecated) after the boot image (used to be after the PFN database). - Paged pool follows.
ros-arm-bringup at svn.reactos.org
ros-arm-bringup at svn.reactos.org
Wed Jul 22 09:33:22 CEST 2009
Author: ros-arm-bringup
Date: Wed Jul 22 09:33:22 2009
New Revision: 42131
URL: http://svn.reactos.org/svn/reactos?rev=42131&view=rev
Log:
- Separe ARM3 Init into 3 defined phases:
- 1: No PFN Database exists
- 2: PFN Database exists
- 3: ReactOS NP Pool exists (deprecated)
- Cleanup ReactOS Mm init to work with this.
- ARM3 Phase 1 Init now uses pages directly from the physical memory descriptor.
- This similar to how "MmAllocEarlyPage" used to work.
- A new function MxGetNextPage now does this.
- MxGetNextPage can allocate more than just one page however (making it possible to get contiguous physical memory without going through the PFN-based MmAllocateContiguousMemory beast)
- Also MxGetNextPage will bugcheck with INSTALL_MORE_MEMORY if it runs out of pages.
- Renamed the physical memory descriptor variables to MxFreeDescriptor, MxOldFreeDescriptor instead of MiFreeDescriptor and MiOrgFreeDescriptor (based on NT symbols)
- Nonpaged pool PDEs, PFN database PDEs, and initial nonpaged pool PTEs are now allocated through MxGetNextPage.
- Fix an off by one error in the sizing of MxPfnAllocation.
- The PFN database is now fully "owned" by ARM3 in terms of its PDE mappings and VA location at 0xB0000000.
- ie. MmArmPfnDatabase is now MmPfnDatabase.
- The actual PFN database entries and setup are still done by the ReactOS Mm.
- Got rid of ARM nonpaged pool allocator test.
- Repositioned ReactOS nonpaged pool (deprecated) after the boot image (used to be after the PFN database).
- Paged pool follows.
Modified:
trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c
trunk/reactos/ntoskrnl/mm/ARM3/miarm.h
trunk/reactos/ntoskrnl/mm/freelist.c
trunk/reactos/ntoskrnl/mm/mminit.c
Modified: trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c?rev=42131&r1=42130&r2=42131&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c [iso-8859-1] Wed Jul 22 09:33:22 2009
@@ -1,8 +1,8 @@
/*
* PROJECT: ReactOS Kernel
* LICENSE: BSD - See COPYING.ARM in the top level directory
- * FILE: ntoskrnl/mm/ARM3/init.c
- * PURPOSE: ARM Memory Manager Initialization
+ * FILE: ntoskrnl/mm/ARM3/i386/init.c
+ * PURPOSE: ARM Memory Manager Initialization for x86
* PROGRAMMERS: ReactOS Portable Systems Group
*/
@@ -109,14 +109,25 @@
ULONG MxPfnAllocation;
//
-// The ARM³ PFN Database
-//
-PMMPFN MmArmPfnDatabase;
-
-//
// This structure describes the different pieces of RAM-backed address space
//
PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
+
+//
+// Before we have a PFN database, memory comes straight from our physical memory
+// blocks, which is nice because it's guaranteed contiguous and also because once
+// we take a page from here, the system doesn't see it anymore.
+// However, once the fun is over, those pages must be re-integrated back into
+// PFN society life, and that requires us keeping a copy of the original layout
+// so that we can parse it later.
+//
+PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
+MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
+
+//
+// This is where we keep track of the most basic physical layout markers
+//
+ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage;
/* PRIVATE FUNCTIONS **********************************************************/
@@ -141,6 +152,35 @@
MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde];
Pde++;
}
+}
+
+PFN_NUMBER
+NTAPI
+MxGetNextPage(IN PFN_NUMBER PageCount)
+{
+ PFN_NUMBER Pfn;
+
+ //
+ // Make sure we have enough pages
+ //
+ if (PageCount > MxFreeDescriptor->PageCount)
+ {
+ //
+ // Crash the system
+ //
+ KeBugCheckEx(INSTALL_MORE_MEMORY,
+ MmNumberOfPhysicalPages,
+ MxFreeDescriptor->PageCount,
+ MxOldFreeDescriptor.PageCount,
+ PageCount);
+ }
+
+ //
+ // Use our highest usable free pages
+ //
+ Pfn = MxFreeDescriptor->BasePage + MxFreeDescriptor->PageCount - PageCount;
+ MxFreeDescriptor->PageCount -= PageCount;
+ return Pfn;
}
PPHYSICAL_MEMORY_DESCRIPTOR
@@ -284,8 +324,11 @@
MmArmInitSystem(IN ULONG Phase,
IN PLOADER_PARAMETER_BLOCK LoaderBlock)
{
+ PLIST_ENTRY NextEntry;
+ PMEMORY_ALLOCATION_DESCRIPTOR MdBlock;
+ ULONG FreePages = 0;
PMEMORY_AREA MArea;
- PHYSICAL_ADDRESS BoundaryAddressMultiple, Low, High;
+ PHYSICAL_ADDRESS BoundaryAddressMultiple;
PFN_NUMBER PageFrameIndex;
PMMPTE StartPde, EndPde, PointerPte, LastPte;
MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte;
@@ -294,8 +337,7 @@
ULONG OldCount;
BOOLEAN IncludeType[LoaderMaximum];
ULONG i;
- BoundaryAddressMultiple.QuadPart = Low.QuadPart = 0;
- High.QuadPart = -1;
+ BoundaryAddressMultiple.QuadPart = 0;
if (Phase == 0)
{
@@ -314,6 +356,95 @@
RtlZeroMemory(StartPde, (EndPde - StartPde) * sizeof(MMPTE));
//
+ // Loop the memory descriptors
+ //
+ NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
+ while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
+ {
+ //
+ // Get the memory block
+ //
+ MdBlock = CONTAINING_RECORD(NextEntry,
+ MEMORY_ALLOCATION_DESCRIPTOR,
+ ListEntry);
+
+ //
+ // Skip invisible memory
+ //
+ if ((MdBlock->MemoryType != LoaderFirmwarePermanent) &&
+ (MdBlock->MemoryType != LoaderSpecialMemory) &&
+ (MdBlock->MemoryType != LoaderHALCachedMemory) &&
+ (MdBlock->MemoryType != LoaderBBTMemory))
+ {
+ //
+ // Check if BURNMEM was used
+ //
+ if (MdBlock->MemoryType != LoaderBad)
+ {
+ //
+ // Count this in the total of pages
+ //
+ MmNumberOfPhysicalPages += MdBlock->PageCount;
+ }
+
+ //
+ // Check if this is the new lowest page
+ //
+ if (MdBlock->BasePage < MmLowestPhysicalPage)
+ {
+ //
+ // Update the lowest page
+ //
+ MmLowestPhysicalPage = MdBlock->BasePage;
+ }
+
+ //
+ // Check if this is the new highest page
+ //
+ PageFrameIndex = MdBlock->BasePage + MdBlock->PageCount;
+ if (PageFrameIndex > MmHighestPhysicalPage)
+ {
+ //
+ // Update the highest page
+ //
+ MmHighestPhysicalPage = PageFrameIndex - 1;
+ }
+
+ //
+ // Check if this is free memory
+ //
+ if ((MdBlock->MemoryType == LoaderFree) ||
+ (MdBlock->MemoryType == LoaderLoadedProgram) ||
+ (MdBlock->MemoryType == LoaderFirmwareTemporary) ||
+ (MdBlock->MemoryType == LoaderOsloaderStack))
+ {
+ //
+ // Check if this is the largest memory descriptor
+ //
+ if (MdBlock->PageCount > FreePages)
+ {
+ //
+ // For now, it is
+ //
+ FreePages = MdBlock->PageCount;
+ MxFreeDescriptor = MdBlock;
+ }
+ }
+ }
+
+ //
+ // Keep going
+ //
+ NextEntry = MdBlock->ListEntry.Flink;
+ }
+
+ //
+ // Save original values of the free descriptor, since it'll be
+ // altered by early allocations
+ //
+ MxOldFreeDescriptor = *MxFreeDescriptor;
+
+ //
// Check if this is a machine with less than 19MB of RAM
//
if (MmNumberOfPhysicalPages < MI_MIN_PAGES_FOR_SYSPTE_TUNING)
@@ -434,6 +565,16 @@
//
MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN);
MxPfnAllocation >>= PAGE_SHIFT;
+
+ //
+ // We have to add one to the count here, because in the process of
+ // shifting down to the page size, we actually ended up getting the
+ // lower aligned size (so say, 0x5FFFF bytes is now 0x5F pages).
+ // Later on, we'll shift this number back into bytes, which would cause
+ // us to end up with only 0x5F000 bytes -- when we actually want to have
+ // 0x60000 bytes.
+ //
+ MxPfnAllocation++;
//
// Now calculate the nonpaged pool expansion VA region
@@ -482,35 +623,23 @@
// with the old memory manager, so we'll create a "Shadow PFN Database"
// instead, and arbitrarly start it at 0xB0000000.
//
- MmArmPfnDatabase = (PVOID)0xB0000000;
- ASSERT(((ULONG_PTR)MmArmPfnDatabase & ((4 * 1024 * 1024) - 1)) == 0);
+ MmPfnDatabase = (PVOID)0xB0000000;
+ ASSERT(((ULONG_PTR)MmPfnDatabase & ((4 * 1024 * 1024) - 1)) == 0);
//
// Non paged pool comes after the PFN database
//
- MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmArmPfnDatabase +
+ MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase +
(MxPfnAllocation << PAGE_SHIFT));
//
// Now we actually need to get these many physical pages. Nonpaged pool
// is actually also physically contiguous (but not the expansion)
//
- PageFrameIndex = MmGetContinuousPages(MmSizeOfNonPagedPoolInBytes +
- (MxPfnAllocation << PAGE_SHIFT),
- Low,
- High,
- BoundaryAddressMultiple,
- FALSE);
+ PageFrameIndex = MxGetNextPage(MxPfnAllocation +
+ (MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT));
ASSERT(PageFrameIndex != 0);
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmArmPfnDatabase,
- (ULONG_PTR)MmArmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT),
- "Shadow PFN Database");
DPRINT("PFN DB PA PFN begins at: %lx\n", PageFrameIndex);
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmNonPagedPoolStart,
- (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes,
- "ARM Non Paged Pool");
DPRINT("NP PA PFN begins at: %lx\n", PageFrameIndex + MxPfnAllocation);
//
@@ -529,7 +658,7 @@
//
// Get a page
//
- TempPde.u.Hard.PageFrameNumber = MmAllocPage(MC_SYSTEM, 0);
+ TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
ASSERT(TempPde.u.Hard.Valid == 1);
*StartPde = TempPde;
@@ -548,7 +677,7 @@
//
// Now we need pages for the page tables which will map initial NP
//
- StartPde = MiAddressToPde(MmArmPfnDatabase);
+ StartPde = MiAddressToPde(MmPfnDatabase);
EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart +
MmSizeOfNonPagedPoolInBytes - 1));
while (StartPde <= EndPde)
@@ -561,7 +690,7 @@
//
// Get a page
//
- TempPde.u.Hard.PageFrameNumber = MmAllocPage(MC_SYSTEM, 0);
+ TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1);
ASSERT(TempPde.u.Hard.Valid == 1);
*StartPde = TempPde;
@@ -581,12 +710,6 @@
// Now remember where the expansion starts
//
MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa;
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmNonPagedSystemStart, MmNonPagedPoolExpansionStart,
- "System PTE Space");
- DPRINT1(" 0x%p - 0x%p\t%s\n",
- MmNonPagedPoolExpansionStart, MmNonPagedPoolEnd,
- "Non Paged Pool Expansion PTE Space");
//
// Last step is to actually map the nonpaged pool
@@ -646,6 +769,13 @@
// Now go ahead and initialize the ARM pool
//
MiInitializeArmPool();
+ }
+ else if (Phase == 1) // IN BETWEEN, THE PFN DATABASE IS NOW CREATED
+ {
+ //
+ // Initialize the nonpaged pool
+ //
+ InitializePool(NonPagedPool, 0);
//
// We PDE-aligned the nonpaged system start VA, so haul some extra PTEs!
@@ -707,36 +837,28 @@
// Sync us up with ReactOS Mm
//
MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1));
- MiSyncARM3WithROS(MmArmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1));
+ MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1));
MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1));
-
- //
- // Initialize the nonpaged pool
- //
- InitializePool(NonPagedPool, 0);
-
- //
- // Do a little test of the nonpaged pool allocator
- //
- if (0)
- {
- ULONG i = 0;
- PVOID Buffers[4096];
- while (TRUE)
- {
- Buffers[i] = MiAllocatePoolPages(NonPagedPool, PAGE_SIZE);
- if (!Buffers[i]) break;
- if (i == 4096) break;
- i++;
- }
-
- while (i--)
- {
- MiFreePoolPages(Buffers[i]);
- }
- }
+
+ //
+ // Print the memory layout
+ //
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmPfnDatabase,
+ (ULONG_PTR)MmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT),
+ "PFN Database");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmNonPagedPoolStart,
+ (ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes,
+ "ARM Non Paged Pool");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmNonPagedSystemStart, MmNonPagedPoolExpansionStart,
+ "System PTE Space");
+ DPRINT1(" 0x%p - 0x%p\t%s\n",
+ MmNonPagedPoolExpansionStart, MmNonPagedPoolEnd,
+ "Non Paged Pool Expansion PTE Space");
}
- else
+ else // NOW WE HAVE NONPAGED POOL
{
//
// Instantiate memory that we don't consider RAM/usable
Modified: trunk/reactos/ntoskrnl/mm/ARM3/miarm.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/miarm.h?rev=42131&r1=42130&r2=42131&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/miarm.h [iso-8859-1] Wed Jul 22 09:33:22 2009
@@ -105,6 +105,9 @@
extern ULONG MmBootImageSize;
extern PMMPTE MmSystemPtesStart[MaximumPtePoolTypes];
extern PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes];
+extern PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor;
+extern MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor;
+extern ULONG MxPfnAllocation;
VOID
NTAPI
Modified: trunk/reactos/ntoskrnl/mm/freelist.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/freelist.c?rev=42131&r1=42130&r2=42131&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/freelist.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/freelist.c [iso-8859-1] Wed Jul 22 09:33:22 2009
@@ -713,8 +713,8 @@
PFN_TYPE Pfn;
/* Use one of our highest usable pages */
- Pfn = MiFreeDescriptor->BasePage + MiFreeDescriptor->PageCount - 1;
- MiFreeDescriptor->PageCount--;
+ Pfn = MxFreeDescriptor->BasePage + MxFreeDescriptor->PageCount - 1;
+ MxFreeDescriptor->PageCount--;
/* Return it */
return Pfn;
@@ -813,7 +813,6 @@
MmInitializePageList(VOID)
{
ULONG i;
- ULONG Reserved;
NTSTATUS Status;
PFN_TYPE Pfn = 0;
PHYSICAL_PAGE UsedPage;
@@ -824,12 +823,9 @@
InitializeListHead(&UserPageListHead);
InitializeListHead(&FreeUnzeroedPageListHead);
InitializeListHead(&FreeZeroedPageListHead);
-
- /* Set the size and start of the PFN Database */
- Reserved = PAGE_ROUND_UP((MmHighestPhysicalPage * sizeof(PHYSICAL_PAGE))) / PAGE_SIZE;
/* Loop every page required to hold the PFN database */
- for (i = 0; i < Reserved; i++)
+ for (i = 0; i < MxPfnAllocation; i++)
{
PVOID Address = (char*)MmPfnDatabase + (i * PAGE_SIZE);
@@ -924,10 +920,10 @@
}
}
}
-
+
/* Finally handle the pages describing the PFN database themselves */
- for (i = (MiFreeDescriptor->BasePage + MiFreeDescriptor->PageCount);
- i < (MiFreeDescriptorOrg.BasePage + MiFreeDescriptorOrg.PageCount);
+ for (i = (MxFreeDescriptor->BasePage + MxFreeDescriptor->PageCount);
+ i < (MxOldFreeDescriptor.BasePage + MxOldFreeDescriptor.PageCount);
i++)
{
/* Ensure this page was not added previously */
Modified: trunk/reactos/ntoskrnl/mm/mminit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/mminit.c?rev=42131&r1=42130&r2=42131&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/mm/mminit.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/mminit.c [iso-8859-1] Wed Jul 22 09:33:22 2009
@@ -48,10 +48,6 @@
PVOID MiNonPagedPoolStart;
ULONG MiNonPagedPoolLength;
ULONG MmBootImageSize;
-ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage;
-ULONG_PTR MmPfnDatabaseEnd;
-PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor;
-MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg;
ULONG MmUserProbeAddress = 0;
PVOID MmHighestUserAddress = NULL;
PBOOLEAN Mm64BitPhysicalAddress = FALSE;
@@ -115,88 +111,6 @@
VOID
NTAPI
-MiCountFreePagesInLoaderBlock(PLOADER_PARAMETER_BLOCK LoaderBlock)
-{
- PLIST_ENTRY NextEntry;
- PMEMORY_ALLOCATION_DESCRIPTOR Md;
- ULONG FreePages = 0;
-
- for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink;
- NextEntry != &KeLoaderBlock->MemoryDescriptorListHead;
- NextEntry = NextEntry->Flink)
- {
- Md = CONTAINING_RECORD(NextEntry, MEMORY_ALLOCATION_DESCRIPTOR, ListEntry);
-
- /* Skip invisible memory */
- if ((Md->MemoryType != LoaderFirmwarePermanent) &&
- (Md->MemoryType != LoaderSpecialMemory) &&
- (Md->MemoryType != LoaderHALCachedMemory) &&
- (Md->MemoryType != LoaderBBTMemory))
- {
- /* Check if BURNMEM was used */
- if (Md->MemoryType != LoaderBad)
- {
- /* Count this in the total of pages */
- MmNumberOfPhysicalPages += Md->PageCount;
- }
-
- /* Check if this is the new lowest page */
- if (Md->BasePage < MmLowestPhysicalPage)
- {
- /* Update the lowest page */
- MmLowestPhysicalPage = Md->BasePage;
- }
-
- /* Check if this is the new highest page */
- if ((Md->BasePage + Md->PageCount) > MmHighestPhysicalPage)
- {
- /* Update the highest page */
- MmHighestPhysicalPage = Md->BasePage + Md->PageCount - 1;
- }
-
- /* Check if this is free memory */
- if ((Md->MemoryType == LoaderFree) ||
- (Md->MemoryType == LoaderLoadedProgram) ||
- (Md->MemoryType == LoaderFirmwareTemporary) ||
- (Md->MemoryType == LoaderOsloaderStack))
- {
- /* Check if this is the largest memory descriptor */
- if (Md->PageCount > FreePages)
- {
- /* For now, it is */
- FreePages = Md->PageCount;
- MiFreeDescriptor = Md;
- }
- }
- }
- }
-
- /* Save original values of the free descriptor, since it'll be
- altered by early allocations */
- MiFreeDescriptorOrg = *MiFreeDescriptor;
-}
-
-VOID
-NTAPI
-MiDbgKernelLayout(VOID)
-{
- DPRINT1("%8s%12s\t\t%s\n", "Start", "End", "Type");
- DPRINT1("0x%p - 0x%p\t%s\n",
- MmSystemRangeStart, (ULONG_PTR)MmSystemRangeStart + MmBootImageSize,
- "Boot Image Mapping Region");
- DPRINT1("0x%p - 0x%p\t%s\n",
- MmPfnDatabase, MmPfnDatabaseEnd,
- "PFN Database region");
- DPRINT1("0x%p - 0x%p\t%s\n",
- MiNonPagedPoolStart, (ULONG_PTR)MiNonPagedPoolStart + MiNonPagedPoolLength,
- "Non paged pool region");
- DPRINT1("0x%p - 0x%p\t%s\n",
- MmPagedPoolBase, (ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize,
- "Paged pool region");
-}
-
-VOID
-NTAPI
MiDbgDumpMemoryDescriptors(VOID)
{
PLIST_ENTRY NextEntry;
@@ -225,7 +139,12 @@
INIT_FUNCTION
NTAPI
MmInit1(VOID)
-{
+{
+ /* Initialize the kernel address space */
+ KeInitializeGuardedMutex(&PsGetCurrentProcess()->AddressCreationLock);
+ MmKernelAddressSpace = MmGetCurrentAddressSpace();
+ MmInitGlobalKernelPageDirectory();
+
/* Dump memory descriptors */
if (MiDbgEnableMdDump) MiDbgDumpMemoryDescriptors();
@@ -237,62 +156,46 @@
MmSystemRangeStart = (PVOID)KSEG0_BASE;
MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000;
MmHighestUserAddress = (PVOID)(MmUserProbeAddress - 1);
- DPRINT("MmSystemRangeStart: %08x\n", MmSystemRangeStart);
- DPRINT("MmUserProbeAddress: %08x\n", MmUserProbeAddress);
- DPRINT("MmHighestUserAddress:%08x\n", MmHighestUserAddress);
-
- /* Count RAM */
- MiCountFreePagesInLoaderBlock(KeLoaderBlock);
- DbgPrint("Used memory %dKb\n", (MmNumberOfPhysicalPages * PAGE_SIZE) / 1024);
-
- /* Initialize the kernel address space */
- KeInitializeGuardedMutex(&PsGetCurrentProcess()->AddressCreationLock);
- MmKernelAddressSpace = MmGetCurrentAddressSpace();
- MmInitGlobalKernelPageDirectory();
-
- /* We'll put the PFN array right after the loaded modules */
- MmPfnDatabase = (PVOID)((ULONG_PTR)MmSystemRangeStart + MmBootImageSize);
- MmPfnDatabaseEnd = (ULONG_PTR)MmPfnDatabase + (MmHighestPhysicalPage * sizeof(MMPFN));
- MmPfnDatabaseEnd = PAGE_ROUND_UP(MmPfnDatabaseEnd);
-
- /* Put nonpaged pool after the PFN database */
- MiNonPagedPoolStart = (PVOID)MmPfnDatabaseEnd;
-
- /* Length of non-paged pool */
- MiNonPagedPoolLength = MM_NONPAGED_POOL_SIZE;
-
- /* Put the paged pool after the non-paged pool */
+
+ //
+ // Initialize ARM³ in phase 0
+ //
+ MmArmInitSystem(0, KeLoaderBlock);
+
+ /* Intialize system memory areas */
+ MiInitSystemMemoryAreas();
+
+ /* Initialize the page list */
+ MmInitializePageList();
+
+ //
+ // Initialize ARM³ in phase 1
+ //
+ MmArmInitSystem(1, KeLoaderBlock);
+ // DEPRECATED
+ /* Put nonpaged pool after the loaded modules */ // DEPRECATED
+ MiNonPagedPoolStart = (PVOID)((ULONG_PTR)MmSystemRangeStart + // DEPRECATED
+ MmBootImageSize); // DEPRECATED
+ MiNonPagedPoolLength = MM_NONPAGED_POOL_SIZE; // DEPRECATED
+ // DEPRECATED
+ /* Initialize nonpaged pool */ // DEPRECATED
+ MiInitializeNonPagedPool(); // DEPRECATED
+ // DEPRECATED
+ //
+ // Initialize ARM³ in phase 2
+ //
+ MmArmInitSystem(2, KeLoaderBlock);
+
+ /* Put the paged pool after nonpaged pool */
MmPagedPoolBase = (PVOID)PAGE_ROUND_UP((ULONG_PTR)MiNonPagedPoolStart +
MiNonPagedPoolLength);
MmPagedPoolSize = MM_PAGED_POOL_SIZE;
- /* Dump kernel memory layout */
- MiDbgKernelLayout();
-
- /* Intialize system memory areas */
- MiInitSystemMemoryAreas();
-
- /* Initialize the page list */
- MmInitializePageList();
-
- //
- // Initialize ARM³ in phase 0
- //
- MmArmInitSystem(0, KeLoaderBlock);
-
- /* Initialize nonpaged pool */
- MiInitializeNonPagedPool();
-
/* Initialize paged pool */
MmInitializePagedPool();
/* Initialize working sets */
MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory);
-
- //
- // Initialize ARM³ in phase 1
- //
- MmArmInitSystem(1, KeLoaderBlock);
}
BOOLEAN
More information about the Ros-diffs
mailing list