mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +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
3 changed files with 32 additions and 34 deletions
|
@ -45,7 +45,6 @@ typedef struct _ROS_LOADER_PARAMETER_BLOCK
|
|||
ULONG ArchExtra;
|
||||
} ROS_LOADER_PARAMETER_BLOCK, *PROS_LOADER_PARAMETER_BLOCK;
|
||||
|
||||
extern ULONG MmFreeLdrMemHigher, MmFreeLdrMemLower;
|
||||
extern BOOLEAN AcpiTableDetected;
|
||||
extern ULONG MmFreeLdrPageDirectoryStart, MmFreeLdrPageDirectoryEnd;
|
||||
|
||||
|
|
|
@ -32,7 +32,6 @@ typedef struct _BIOS_MEMORY_DESCRIPTOR
|
|||
/* FreeLDR Memory Data */
|
||||
ULONG_PTR MmFreeLdrFirstKrnlPhysAddr, MmFreeLdrLastKrnlPhysAddr;
|
||||
ULONG_PTR MmFreeLdrLastKernelAddress;
|
||||
ULONG MmFreeLdrMemHigher;
|
||||
ULONG MmFreeLdrPageDirectoryEnd;
|
||||
|
||||
/* FreeLDR Loader Data */
|
||||
|
@ -926,7 +925,6 @@ KiRosFrldrLpbToNtLpb(IN PROS_LOADER_PARAMETER_BLOCK RosLoaderBlock,
|
|||
|
||||
/* First get some kernel-loader globals */
|
||||
AcpiTableDetected = (RosLoaderBlock->Flags & MB_FLAGS_ACPI_TABLE) ? TRUE : FALSE;
|
||||
MmFreeLdrMemHigher = RosLoaderBlock->MemHigher;
|
||||
MmFreeLdrPageDirectoryEnd = RosLoaderBlock->PageDirectoryEnd;
|
||||
if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000;
|
||||
|
||||
|
|
|
@ -205,6 +205,35 @@ MmInitVirtualMemory(ULONG_PTR LastKernelAddress,
|
|||
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
|
||||
MemType[] = {
|
||||
"ExceptionBlock ", // ?
|
||||
|
@ -247,7 +276,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
|
|||
* FUNCTION: Initalize memory managment
|
||||
*/
|
||||
{
|
||||
ULONG i;
|
||||
ULONG kernel_len;
|
||||
ULONG_PTR MappingAddress;
|
||||
PLDR_DATA_TABLE_ENTRY LdrEntry;
|
||||
|
@ -280,26 +308,7 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
|
|||
DPRINT("CurrentProcess: %x\n", PsGetCurrentProcess());
|
||||
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 */
|
||||
if (!MmFreeLdrMemHigher) MmFreeLdrMemHigher = 65536;
|
||||
if (!MmFreeLdrPageDirectoryEnd) MmFreeLdrPageDirectoryEnd = 0x40000;
|
||||
if (!FirstKrnlPhysAddr)
|
||||
{
|
||||
|
@ -314,11 +323,6 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
|
|||
/* FIXME: How do we get the last address? */
|
||||
}
|
||||
|
||||
if (MmFreeLdrMemHigher >= (MaxMem - 1) * 1024)
|
||||
{
|
||||
MmFreeLdrMemHigher = (MaxMem - 1) * 1024;
|
||||
}
|
||||
|
||||
/* Set memory limits */
|
||||
MmSystemRangeStart = (PVOID)KSEG0_BASE;
|
||||
MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000;
|
||||
|
@ -346,13 +350,13 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
|
|||
* (we assume the kernel occupies a continuous range of physical
|
||||
* memory)
|
||||
*/
|
||||
DPRINT("first krnl %x\nlast krnl %x\n",FirstKrnlPhysAddr,
|
||||
DPRINT("first krnl %x, last krnl %x\n",FirstKrnlPhysAddr,
|
||||
LastKrnlPhysAddr);
|
||||
|
||||
/*
|
||||
* Free physical memory not used by the kernel
|
||||
*/
|
||||
MmStats.NrTotalPages = MmFreeLdrMemHigher/4;
|
||||
MmStats.NrTotalPages = MiCountFreePagesInLoaderBlock(KeLoaderBlock);
|
||||
MmNumberOfPhysicalPages = MmStats.NrTotalPages;
|
||||
if (!MmStats.NrTotalPages)
|
||||
{
|
||||
|
@ -361,12 +365,9 @@ MmInit1(ULONG_PTR FirstKrnlPhysAddr,
|
|||
}
|
||||
else
|
||||
{
|
||||
/* add 1MB for standard memory (not extended) */
|
||||
/* HACK: add 1MB for standard memory (not extended). Why? */
|
||||
MmStats.NrTotalPages += 256;
|
||||
}
|
||||
#ifdef BIOS_MEM_FIX
|
||||
MmStats.NrTotalPages += 16;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initialize the kernel address space
|
||||
|
|
Loading…
Reference in a new issue