1 /* $Id: mminit.c,v 1.21 2001/05/01 23:08:20 chorns Exp $
3 * COPYRIGHT: See COPYING in the top directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/mm/mminit.c
6 * PURPOSE: kernel memory managment initialization functions
7 * PROGRAMMER: David Welch (welch@cwcom.net)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/config.h>
16 #include <internal/i386/segment.h>
17 #include <internal/mm.h>
18 #include <internal/ntoskrnl.h>
19 #include <internal/bitops.h>
20 #include <internal/io.h>
21 #include <internal/ps.h>
22 #include <napi/shared_data.h>
25 #include <internal/debug.h>
27 /* GLOBALS *****************************************************************/
30 * Size of extended memory (kb) (fixed for now)
32 #define EXTENDED_MEMORY_SIZE (3*1024*1024)
35 * Compiler defined symbols
37 extern unsigned int _text_start__
;
38 extern unsigned int _text_end__
;
40 static BOOLEAN IsThisAnNtAsSystem
= FALSE
;
41 static MM_SYSTEM_SIZE MmSystemSize
= MmSmallSystem
;
43 extern unsigned int _bss_end__
;
45 static MEMORY_AREA
* kernel_text_desc
= NULL
;
46 static MEMORY_AREA
* kernel_data_desc
= NULL
;
47 static MEMORY_AREA
* kernel_param_desc
= NULL
;
48 static MEMORY_AREA
* kernel_pool_desc
= NULL
;
49 static MEMORY_AREA
* kernel_shared_data_desc
= NULL
;
51 PVOID MmSharedDataPagePhysicalAddress
= NULL
;
53 /* FUNCTIONS ****************************************************************/
55 BOOLEAN STDCALL
MmIsThisAnNtAsSystem(VOID
)
57 return(IsThisAnNtAsSystem
);
60 MM_SYSTEM_SIZE STDCALL
MmQuerySystemSize(VOID
)
65 VOID
MiShutdownMemoryManager(VOID
)
69 VOID
MmInitVirtualMemory(ULONG LastKernelAddress
,
72 * FUNCTION: Intialize the memory areas list
74 * bp = Pointer to the boot parameters
75 * kernel_len = Length of the kernel
80 ULONG ParamLength
= KernelLength
;
84 DPRINT("MmInitVirtualMemory(%x, %x)\n",LastKernelAddress
, KernelLength
);
86 LastKernelAddress
= PAGE_ROUND_UP(LastKernelAddress
);
89 // ExInitNonPagedPool(KERNEL_BASE + PAGE_ROUND_UP(kernel_len) + PAGESIZE);
90 ExInitNonPagedPool(LastKernelAddress
+ PAGESIZE
);
94 * Setup the system area descriptor list
96 BaseAddress
= (PVOID
)KERNEL_BASE
;
97 Length
= PAGE_ROUND_UP(((ULONG
)&_text_end__
)) - KERNEL_BASE
;
98 ParamLength
= ParamLength
- Length
;
99 MmCreateMemoryArea(NULL
,
100 MmGetKernelAddressSpace(),
107 Length
= PAGE_ROUND_UP(((ULONG
)&_bss_end__
)) -
108 PAGE_ROUND_UP(((ULONG
)&_text_end__
));
109 ParamLength
= ParamLength
- Length
;
110 DPRINT("Length %x\n",Length
);
111 BaseAddress
= (PVOID
)PAGE_ROUND_UP(((ULONG
)&_text_end__
));
112 DPRINT("BaseAddress %x\n",BaseAddress
);
113 MmCreateMemoryArea(NULL
,
114 MmGetKernelAddressSpace(),
122 BaseAddress
= (PVOID
)PAGE_ROUND_UP(((ULONG
)&_bss_end__
));
123 // Length = ParamLength;
124 Length
= LastKernelAddress
- (ULONG
)BaseAddress
;
125 MmCreateMemoryArea(NULL
,
126 MmGetKernelAddressSpace(),
134 BaseAddress
= (PVOID
)(LastKernelAddress
+ PAGESIZE
);
135 Length
= NONPAGED_POOL_SIZE
;
136 MmCreateMemoryArea(NULL
,
137 MmGetKernelAddressSpace(),
145 BaseAddress
= (PVOID
)KERNEL_SHARED_DATA_BASE
;
147 MmCreateMemoryArea(NULL
,
148 MmGetKernelAddressSpace(),
153 &kernel_shared_data_desc
,
156 MmSharedDataPagePhysicalAddress
= MmAllocPage(0);
157 Status
= MmCreateVirtualMapping(NULL
,
158 (PVOID
)KERNEL_SHARED_DATA_BASE
,
160 (ULONG
)MmSharedDataPagePhysicalAddress
);
161 if (!NT_SUCCESS(Status
))
163 DbgPrint("Unable to create virtual mapping\n");
166 ((PKUSER_SHARED_DATA
)KERNEL_SHARED_DATA_BASE
)->TickCountLow
= 0xdeadbeef;
168 for (i
= 0; i
< 0x100; i
++)
170 Status
= MmCreateVirtualMapping(NULL
,
173 (ULONG
)(i
*PAGESIZE
));
174 if (!NT_SUCCESS(Status
))
176 DbgPrint("Unable to create virtual mapping\n");
181 // MmDumpMemoryAreas();
182 DPRINT("MmInitVirtualMemory() done\n");
185 VOID
MmInit1(ULONG FirstKrnlPhysAddr
,
186 ULONG LastKrnlPhysAddr
,
187 ULONG LastKernelAddress
,
188 PADDRESS_RANGE BIOSMemoryMap
,
189 ULONG AddressRangeCount
)
191 * FUNCTION: Initalize memory managment
197 extern unsigned int unmap_me
, unmap_me2
, unmap_me3
;
200 DPRINT("MmInit1(FirstKrnlPhysAddr, %x, LastKrnlPhysAddr %x, LastKernelAddress %x)\n",
206 * FIXME: Set this based on the system command line
208 MmUserProbeAddress
= (PVOID
)0x7fff0000;
209 MmHighestUserAddress
= (PVOID
)0x7ffeffff;
212 * Initialize memory managment statistics
214 MmStats
.NrTotalPages
= 0;
215 MmStats
.NrSystemPages
= 0;
216 MmStats
.NrUserPages
= 0;
217 MmStats
.NrReservedPages
= 0;
218 MmStats
.NrUserPages
= 0;
219 MmStats
.NrFreePages
= 0;
220 MmStats
.NrLockedPages
= 0;
221 MmStats
.PagingRequestsInLastMinute
= 0;
222 MmStats
.PagingRequestsInLastFiveMinutes
= 0;
223 MmStats
.PagingRequestsInLastFifteenMinutes
= 0;
226 * Initialize the kernel address space
228 MmInitializeKernelAddressSpace();
234 /* FIXME: This is broken in SMP mode */
235 //MmDeletePageTable(NULL, 0);
238 * Free all pages not used for kernel memory
239 * (we assume the kernel occupies a continuous range of physical
242 DPRINT("first krnl %x\nlast krnl %x\n",FirstKrnlPhysAddr
,
246 * Free physical memory not used by the kernel
248 MmStats
.NrTotalPages
= KeLoaderBlock
.MemHigher
/4;
249 if (!MmStats
.NrTotalPages
)
251 DbgPrint("Memory not detected, default to 8 MB\n");
252 MmStats
.NrTotalPages
= 2048;
256 /* add 1MB for standard memory (not extended) */
257 MmStats
.NrTotalPages
+= 256;
260 MmStats
.NrTotalPages
+= 16;
262 DbgPrint("Used memory %dKb\n", (MmStats
.NrTotalPages
* PAGESIZE
) / 1024);
264 LastKernelAddress
= (ULONG
)MmInitializePageList(
265 (PVOID
)FirstKrnlPhysAddr
,
266 (PVOID
)LastKrnlPhysAddr
,
267 MmStats
.NrTotalPages
,
268 PAGE_ROUND_UP(LastKernelAddress
),
271 kernel_len
= LastKrnlPhysAddr
- FirstKrnlPhysAddr
;
274 * Create a trap for null pointer references and protect text
278 DPRINT("_text_start__ %x _text_end__ %x\n",(int)&_text_start__
,(int)&_text_end__
);
279 for (i
=PAGE_ROUND_UP(((int)&_text_start__
));
280 i
<PAGE_ROUND_DOWN(((int)&_text_end__
));i
=i
+PAGESIZE
)
282 MmSetPageProtect(NULL
,
287 DPRINT("Invalidating between %x and %x\n",
289 KERNEL_BASE
+ PAGE_TABLE_SIZE
);
290 for (i
=(LastKernelAddress
);
291 i
<(KERNEL_BASE
+ PAGE_TABLE_SIZE
);
294 MmDeleteVirtualMapping(NULL
, (PVOID
)(i
), FALSE
, NULL
, NULL
);
296 DPRINT("Almost done MmInit()\n");
298 /* FIXME: This is broken in SMP mode */
299 MmDeleteVirtualMapping(NULL
, (PVOID
)&unmap_me
, FALSE
, NULL
, NULL
);
300 MmDeleteVirtualMapping(NULL
, (PVOID
)&unmap_me2
, FALSE
, NULL
, NULL
);
301 MmDeleteVirtualMapping(NULL
, (PVOID
)&unmap_me3
, FALSE
, NULL
, NULL
);
304 * Intialize memory areas
306 MmInitVirtualMemory(LastKernelAddress
, kernel_len
);
311 MmInitSectionImplementation();
318 MmCreatePhysicalMemorySection();
320 /* FIXME: Read parameters from memory */