2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/mm/mminit.c
5 * PURPOSE: Memory Manager Initialization
9 /* INCLUDES ******************************************************************/
15 /* GLOBALS *******************************************************************/
48 PVOID MiNonPagedPoolStart
;
49 ULONG MiNonPagedPoolLength
;
50 PBOOLEAN Mm64BitPhysicalAddress
= FALSE
;
51 ULONG MmReadClusterSize
;
53 PMMSUPPORT MmKernelAddressSpace
;
54 extern KMUTANT MmSystemLoadLock
;
55 extern ULONG MmBootImageSize
;
56 BOOLEAN MiDbgEnableMdDump
=
63 /* PRIVATE FUNCTIONS *********************************************************/
68 MiInitSystemMemoryAreas()
71 PHYSICAL_ADDRESS BoundaryAddressMultiple
;
73 BoundaryAddressMultiple
.QuadPart
= 0;
76 // First initialize the page table and hyperspace memory areas
78 MiInitPageDirectoryMap();
83 BaseAddress
= (PVOID
)PCR
;
84 MmCreateMemoryArea(MmGetKernelAddressSpace(),
85 MEMORY_AREA_SYSTEM
| MEMORY_AREA_STATIC
,
87 PAGE_SIZE
* KeNumberProcessors
,
92 BoundaryAddressMultiple
);
95 // Now the KUSER_SHARED_DATA
97 BaseAddress
= (PVOID
)KI_USER_SHARED_DATA
;
98 MmCreateMemoryArea(MmGetKernelAddressSpace(),
99 MEMORY_AREA_SYSTEM
| MEMORY_AREA_STATIC
,
106 BoundaryAddressMultiple
);
111 MiDbgDumpMemoryDescriptors(VOID
)
113 PLIST_ENTRY NextEntry
;
114 PMEMORY_ALLOCATION_DESCRIPTOR Md
;
115 ULONG TotalPages
= 0;
117 DPRINT1("Base\t\tLength\t\tType\n");
118 for (NextEntry
= KeLoaderBlock
->MemoryDescriptorListHead
.Flink
;
119 NextEntry
!= &KeLoaderBlock
->MemoryDescriptorListHead
;
120 NextEntry
= NextEntry
->Flink
)
122 Md
= CONTAINING_RECORD(NextEntry
, MEMORY_ALLOCATION_DESCRIPTOR
, ListEntry
);
123 DPRINT1("%08lX\t%08lX\t%s\n", Md
->BasePage
, Md
->PageCount
, MemType
[Md
->MemoryType
]);
124 TotalPages
+= Md
->PageCount
;
127 DPRINT1("Total: %08lX (%d MB)\n", TotalPages
, (TotalPages
* PAGE_SIZE
) / 1024 / 1024);
132 MmArmInitSystem(IN ULONG Phase
,
133 IN PLOADER_PARAMETER_BLOCK LoaderBlock
);
140 /* Initialize the kernel address space */
141 KeInitializeGuardedMutex(&PsGetCurrentProcess()->AddressCreationLock
);
142 MmKernelAddressSpace
= MmGetCurrentAddressSpace();
143 MmInitGlobalKernelPageDirectory();
145 /* Dump memory descriptors */
146 if (MiDbgEnableMdDump
) MiDbgDumpMemoryDescriptors();
149 // Initialize ARM³ in phase 0
151 MmArmInitSystem(0, KeLoaderBlock
);
153 /* Intialize system memory areas */
154 MiInitSystemMemoryAreas();
156 /* Initialize the page list */
157 MmInitializePageList();
160 // Initialize ARM³ in phase 1
162 MmArmInitSystem(1, KeLoaderBlock
);
164 /* Put nonpaged pool after the loaded modules */ // DEPRECATED
165 MiNonPagedPoolStart
= (PVOID
)((ULONG_PTR
)MmSystemRangeStart
+ // DEPRECATED
166 MmBootImageSize
); // DEPRECATED
167 MiNonPagedPoolLength
= MM_NONPAGED_POOL_SIZE
; // DEPRECATED
169 /* Initialize nonpaged pool */ // DEPRECATED
170 MiInitializeNonPagedPool(); // DEPRECATED
172 /* Put the paged pool after nonpaged pool */
173 MmPagedPoolBase
= (PVOID
)PAGE_ROUND_UP((ULONG_PTR
)MiNonPagedPoolStart
+
174 MiNonPagedPoolLength
);
175 MmPagedPoolSize
= MM_PAGED_POOL_SIZE
;
178 // Initialize ARM³ in phase 2
180 MmArmInitSystem(2, KeLoaderBlock
);
182 /* Initialize paged pool */
183 MmInitializePagedPool();
185 /* Initialize working sets */
186 MmInitializeMemoryConsumer(MC_USER
, MmTrimUserMemory
);
191 MmInitSystem(IN ULONG Phase
,
192 IN PLOADER_PARAMETER_BLOCK LoaderBlock
)
196 /* Initialize Mm bootstrap */
199 /* Initialize the Loader Lock */
200 KeInitializeMutant(&MmSystemLoadLock
, FALSE
);
202 /* Reload boot drivers */
203 MiReloadBootLoadedDrivers(LoaderBlock
);
205 /* Initialize the loaded module list */
206 MiInitializeLoadedModuleList(LoaderBlock
);
208 /* We're done, for now */
209 DPRINT("Mm0: COMPLETE\n");
213 MmInitializeRmapList();
214 MmInitializePageOp();
215 MmInitSectionImplementation();
217 MmCreatePhysicalMemorySection();
219 /* Setup shared user data settings that NT does as well */
220 ASSERT(SharedUserData
->NumberOfPhysicalPages
== 0);
221 SharedUserData
->NumberOfPhysicalPages
= MmStats
.NrTotalPages
;
222 SharedUserData
->LargePageMinimum
= 0;
224 /* For now, we assume that we're always Workstation */
225 SharedUserData
->NtProductType
= NtProductWinNt
;
232 MiInitBalancerThread();
235 * Initialise the modified page writer.
239 /* Initialize the balance set manager */
242 /* FIXME: Read parameters from memory */