mirror of
https://github.com/reactos/reactos.git
synced 2024-08-12 14:16:30 +00:00
- Implement MiCountFreePagesInLoaderBlock() to correctly count free pages (instead of using a variable introduced somewhere below r2000 (MemHigher), and later converted to MmFreeLdrMemHigher).
- Get rid of MmFreeLdrMemHigher and MmFreeLdrMemLower (they were not actually used for anything except getting number of free pages). svn path=/trunk/; revision=32214
This commit is contained in:
parent
82d29cb087
commit
b807bc63c0
|
@ -45,7 +45,6 @@ typedef struct _ROS_LOADER_PARAMETER_BLOCK
|
||||||
ULONG ArchExtra;
|
ULONG ArchExtra;
|
||||||
} ROS_LOADER_PARAMETER_BLOCK, *PROS_LOADER_PARAMETER_BLOCK;
|
} ROS_LOADER_PARAMETER_BLOCK, *PROS_LOADER_PARAMETER_BLOCK;
|
||||||
|
|
||||||
extern ULONG MmFreeLdrMemHigher, MmFreeLdrMemLower;
|
|
||||||
extern BOOLEAN AcpiTableDetected;
|
extern BOOLEAN AcpiTableDetected;
|
||||||
extern ULONG MmFreeLdrPageDirectoryStart, MmFreeLdrPageDirectoryEnd;
|
extern ULONG MmFreeLdrPageDirectoryStart, MmFreeLdrPageDirectoryEnd;
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,6 @@ typedef struct _BIOS_MEMORY_DESCRIPTOR
|
||||||
/* FreeLDR Memory Data */
|
/* FreeLDR Memory Data */
|
||||||
ULONG_PTR MmFreeLdrFirstKrnlPhysAddr, MmFreeLdrLastKrnlPhysAddr;
|
ULONG_PTR MmFreeLdrFirstKrnlPhysAddr, MmFreeLdrLastKrnlPhysAddr;
|
||||||
ULONG_PTR MmFreeLdrLastKernelAddress;
|
ULONG_PTR MmFreeLdrLastKernelAddress;
|
||||||
ULONG MmFreeLdrMemHigher;
|
|
||||||
ULONG MmFreeLdrPageDirectoryEnd;
|
ULONG MmFreeLdrPageDirectoryEnd;
|
||||||
|
|
||||||
/* FreeLDR Loader Data */
|
/* FreeLDR Loader Data */
|
||||||
|
@ -926,7 +925,6 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock,
|
||||||
|
|
||||||
/* First get some kernel-loader globals */
|
/* First get some kernel-loader globals */
|
||||||
AcpiTableDetected = (RosLoaderBlock->Flags & MB_FLAGS_ACPI_TABLE) ? TRUE : FALSE;
|
AcpiTableDetected = (RosLoaderBlock->Flags & MB_FLAGS_ACPI_TABLE) ? TRUE : FALSE;
|
||||||
MmFreeLdrMemHigher = RosLoaderBlock->MemHigher;
|
|
||||||
MmFreeLdrPageDirectoryEnd = RosLoaderBlock->PageDirectoryEnd;
|
MmFreeLdrPageDirectoryEnd = RosLoaderBlock->PageDirectoryEnd;
|
||||||
if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000;
|
if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000;
|
||||||
|
|
||||||
|
|
|
@ -205,6 +205,35 @@ MmInitVirtualMemory(ULONG_PTR LastKernelAddress,
|
||||||
MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory);
|
MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
MiCountFreePagesInLoaderBlock(PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
|
{
|
||||||
|
PLIST_ENTRY NextEntry;
|
||||||
|
PMEMORY_ALLOCATION_DESCRIPTOR Md;
|
||||||
|
ULONG TotalPages = 0;
|
||||||
|
|
||||||
|
for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink;
|
||||||
|
NextEntry != &KeLoaderBlock->MemoryDescriptorListHead;
|
||||||
|
NextEntry = NextEntry->Flink)
|
||||||
|
{
|
||||||
|
Md = CONTAINING_RECORD(NextEntry, MEMORY_ALLOCATION_DESCRIPTOR, ListEntry);
|
||||||
|
|
||||||
|
if (Md->MemoryType == LoaderBad ||
|
||||||
|
Md->MemoryType == LoaderFirmwarePermanent ||
|
||||||
|
Md->MemoryType == LoaderSpecialMemory ||
|
||||||
|
Md->MemoryType == LoaderBBTMemory)
|
||||||
|
{
|
||||||
|
/* Don't count these blocks */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
TotalPages += Md->PageCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TotalPages;
|
||||||
|
}
|
||||||
|
|
||||||
PCHAR
|
PCHAR
|
||||||
MemType[] = {
|
MemType[] = {
|
||||||
"ExceptionBlock ", // ?
|
"ExceptionBlock ", // ?
|
||||||
|
@ -247,7 +276,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
|
||||||
* FUNCTION: Initalize memory managment
|
* FUNCTION: Initalize memory managment
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
ULONG i;
|
|
||||||
ULONG kernel_len;
|
ULONG kernel_len;
|
||||||
ULONG_PTR MappingAddress;
|
ULONG_PTR MappingAddress;
|
||||||
PLDR_DATA_TABLE_ENTRY LdrEntry;
|
PLDR_DATA_TABLE_ENTRY LdrEntry;
|
||||||
|
@ -280,26 +308,7 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
|
||||||
DPRINT("CurrentProcess: %x\n", PsGetCurrentProcess());
|
DPRINT("CurrentProcess: %x\n", PsGetCurrentProcess());
|
||||||
PsGetCurrentProcess()->Pcb.DirectoryTableBase.LowPart = (ULONG)MmGetPageDirectory();
|
PsGetCurrentProcess()->Pcb.DirectoryTableBase.LowPart = (ULONG)MmGetPageDirectory();
|
||||||
|
|
||||||
if ((BIOSMemoryMap != NULL) && (AddressRangeCount > 0))
|
|
||||||
{
|
|
||||||
// If we have a bios memory map, recalulate the memory size
|
|
||||||
ULONG last = 0;
|
|
||||||
for (i = 0; i < AddressRangeCount; i++)
|
|
||||||
{
|
|
||||||
if (BIOSMemoryMap[i].Type == 1
|
|
||||||
&& (BIOSMemoryMap[i].BaseAddrLow + BIOSMemoryMap[i].LengthLow + PAGE_SIZE -1) / PAGE_SIZE > last)
|
|
||||||
{
|
|
||||||
last = (BIOSMemoryMap[i].BaseAddrLow + BIOSMemoryMap[i].LengthLow + PAGE_SIZE -1) / PAGE_SIZE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((last - 256) * 4 > MmFreeLdrMemHigher)
|
|
||||||
{
|
|
||||||
MmFreeLdrMemHigher = (last - 256) * 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NTLDR Hacks */
|
/* NTLDR Hacks */
|
||||||
if (!MmFreeLdrMemHigher) MmFreeLdrMemHigher = 65536;
|
|
||||||
if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000;
|
if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000;
|
||||||
if (!FirstKrnlPhysAddr)
|
if (!FirstKrnlPhysAddr)
|
||||||
{
|
{
|
||||||
|
@ -314,11 +323,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
|
||||||
/* FIXME: How do we get the last address? */
|
/* FIXME: How do we get the last address? */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MmFreeLdrMemHigher >= (MaxMem - 1) * 1024)
|
|
||||||
{
|
|
||||||
MmFreeLdrMemHigher = (MaxMem - 1) * 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set memory limits */
|
/* Set memory limits */
|
||||||
MmSystemRangeStart = (PVOID)KSEG0_BASE;
|
MmSystemRangeStart = (PVOID)KSEG0_BASE;
|
||||||
MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000;
|
MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000;
|
||||||
|
@ -346,13 +350,13 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
|
||||||
* (we assume the kernel occupies a continuous range of physical
|
* (we assume the kernel occupies a continuous range of physical
|
||||||
* memory)
|
* memory)
|
||||||
*/
|
*/
|
||||||
DPRINT("first krnl %x\nlast krnl %x\n",FirstKrnlPhysAddr,
|
DPRINT("first krnl %x, last krnl %x\n",FirstKrnlPhysAddr,
|
||||||
LastKrnlPhysAddr);
|
LastKrnlPhysAddr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free physical memory not used by the kernel
|
* Free physical memory not used by the kernel
|
||||||
*/
|
*/
|
||||||
MmStats.NrTotalPages = MmFreeLdrMemHigher/4;
|
MmStats.NrTotalPages = MiCountFreePagesInLoaderBlock(KeLoaderBlock);
|
||||||
MmNumberOfPhysicalPages = MmStats.NrTotalPages;
|
MmNumberOfPhysicalPages = MmStats.NrTotalPages;
|
||||||
if (!MmStats.NrTotalPages)
|
if (!MmStats.NrTotalPages)
|
||||||
{
|
{
|
||||||
|
@ -361,12 +365,9 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* add 1MB for standard memory (not extended) */
|
/* HACK: add 1MB for standard memory (not extended). Why? */
|
||||||
MmStats.NrTotalPages += 256;
|
MmStats.NrTotalPages += 256;
|
||||||
}
|
}
|
||||||
#ifdef BIOS_MEM_FIX
|
|
||||||
MmStats.NrTotalPages += 16;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the kernel address space
|
* Initialize the kernel address space
|
||||||
|
|
Loading…
Reference in a new issue