Extract PFN management into separate module
This commit is contained in:
@@ -51,7 +51,6 @@ list(APPEND XTOSKRNL_SOURCE
|
|||||||
${XTOSKRNL_SOURCE_DIR}/ke/spinlock.cc
|
${XTOSKRNL_SOURCE_DIR}/ke/spinlock.cc
|
||||||
${XTOSKRNL_SOURCE_DIR}/ke/sysres.cc
|
${XTOSKRNL_SOURCE_DIR}/ke/sysres.cc
|
||||||
${XTOSKRNL_SOURCE_DIR}/ke/timer.cc
|
${XTOSKRNL_SOURCE_DIR}/ke/timer.cc
|
||||||
${XTOSKRNL_SOURCE_DIR}/mm/${ARCH}/init.cc
|
|
||||||
${XTOSKRNL_SOURCE_DIR}/mm/${ARCH}/pagemap.cc
|
${XTOSKRNL_SOURCE_DIR}/mm/${ARCH}/pagemap.cc
|
||||||
${XTOSKRNL_SOURCE_DIR}/mm/${ARCH}/paging.cc
|
${XTOSKRNL_SOURCE_DIR}/mm/${ARCH}/paging.cc
|
||||||
${XTOSKRNL_SOURCE_DIR}/mm/data.cc
|
${XTOSKRNL_SOURCE_DIR}/mm/data.cc
|
||||||
@@ -59,6 +58,7 @@ list(APPEND XTOSKRNL_SOURCE
|
|||||||
${XTOSKRNL_SOURCE_DIR}/mm/kpool.cc
|
${XTOSKRNL_SOURCE_DIR}/mm/kpool.cc
|
||||||
${XTOSKRNL_SOURCE_DIR}/mm/mmgr.cc
|
${XTOSKRNL_SOURCE_DIR}/mm/mmgr.cc
|
||||||
${XTOSKRNL_SOURCE_DIR}/mm/paging.cc
|
${XTOSKRNL_SOURCE_DIR}/mm/paging.cc
|
||||||
|
${XTOSKRNL_SOURCE_DIR}/mm/pfn.cc
|
||||||
${XTOSKRNL_SOURCE_DIR}/po/idle.cc
|
${XTOSKRNL_SOURCE_DIR}/po/idle.cc
|
||||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/dispatch.cc
|
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/dispatch.cc
|
||||||
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/exsup.cc
|
${XTOSKRNL_SOURCE_DIR}/rtl/${ARCH}/exsup.cc
|
||||||
|
|||||||
@@ -17,5 +17,6 @@
|
|||||||
#include <mm/hlpool.hh>
|
#include <mm/hlpool.hh>
|
||||||
#include <mm/kpool.hh>
|
#include <mm/kpool.hh>
|
||||||
#include <mm/mmgr.hh>
|
#include <mm/mmgr.hh>
|
||||||
|
#include <mm/pfn.hh>
|
||||||
|
|
||||||
#endif /* __XTOSKRNL_MM_HH */
|
#endif /* __XTOSKRNL_MM_HH */
|
||||||
|
|||||||
@@ -17,20 +17,10 @@ namespace MM
|
|||||||
{
|
{
|
||||||
class Manager
|
class Manager
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
STATIC PLOADER_MEMORY_DESCRIPTOR FreeDescriptor;
|
|
||||||
STATIC ULONG_PTR HighestPhysicalPage;
|
|
||||||
STATIC ULONG_PTR LowestPhysicalPage;
|
|
||||||
STATIC ULONG NumberOfPhysicalPages;
|
|
||||||
STATIC LOADER_MEMORY_DESCRIPTOR OldFreeDescriptor;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
STATIC XTAPI VOID InitializeMemoryManager(VOID);
|
STATIC XTAPI VOID InitializeMemoryManager(VOID);
|
||||||
STATIC XTAPI VOID InitializePageMapSupport(VOID);
|
|
||||||
STATIC XTAPI VOID ScanMemoryDescriptors(VOID);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
STATIC XTAPI VOID InitializeArchitecture(VOID);
|
|
||||||
STATIC XTAPI BOOLEAN VerifyMemoryTypeFree(LOADER_MEMORY_TYPE MemoryType);
|
STATIC XTAPI BOOLEAN VerifyMemoryTypeFree(LOADER_MEMORY_TYPE MemoryType);
|
||||||
STATIC XTAPI BOOLEAN VerifyMemoryTypeInvisible(LOADER_MEMORY_TYPE MemoryType);
|
STATIC XTAPI BOOLEAN VerifyMemoryTypeInvisible(LOADER_MEMORY_TYPE MemoryType);
|
||||||
};
|
};
|
||||||
|
|||||||
32
xtoskrnl/includes/mm/pfn.hh
Normal file
32
xtoskrnl/includes/mm/pfn.hh
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: xtoskrnl/includes/mm/pfn.hh
|
||||||
|
* DESCRIPTION: Physical Frame Number (PFN) support
|
||||||
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __XTOSKRNL_MM_PFN_HH
|
||||||
|
#define __XTOSKRNL_MM_PFN_HH
|
||||||
|
|
||||||
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
|
/* Memory Manager */
|
||||||
|
namespace MM
|
||||||
|
{
|
||||||
|
class Pfn
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
STATIC PLOADER_MEMORY_DESCRIPTOR FreeDescriptor;
|
||||||
|
STATIC ULONG_PTR HighestPhysicalPage;
|
||||||
|
STATIC ULONG_PTR LowestPhysicalPage;
|
||||||
|
STATIC ULONG NumberOfPhysicalPages;
|
||||||
|
STATIC LOADER_MEMORY_DESCRIPTOR OldFreeDescriptor;
|
||||||
|
|
||||||
|
public:
|
||||||
|
STATIC XTAPI VOID ScanMemoryDescriptors(VOID);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __XTOSKRNL_MM_PFN_HH */
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
/**
|
|
||||||
* PROJECT: ExectOS
|
|
||||||
* COPYRIGHT: See COPYING.md in the top level directory
|
|
||||||
* FILE: xtoskrnl/mm/amd64/init.cc
|
|
||||||
* DESCRIPTION: Architecture specific Memory Manager initialization routines
|
|
||||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
|
||||||
* Aiken Harris <harraiken91@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <xtos.hh>
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs architecture specific initialization of the XTOS Memory Manager.
|
|
||||||
*
|
|
||||||
* @return This routine does not return any value.
|
|
||||||
*
|
|
||||||
* @since XT 1.0
|
|
||||||
*/
|
|
||||||
XTAPI
|
|
||||||
VOID
|
|
||||||
MM::Init::InitializeArchitecture(VOID)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
}
|
|
||||||
@@ -18,23 +18,23 @@ PVOID MM::HardwarePool::HardwareHeapStart = MM_HARDWARE_HEAP_START_ADDRESS;
|
|||||||
/* Number of used hardware allocation descriptors */
|
/* Number of used hardware allocation descriptors */
|
||||||
ULONG MM::HardwarePool::UsedHardwareAllocationDescriptors = 0;
|
ULONG MM::HardwarePool::UsedHardwareAllocationDescriptors = 0;
|
||||||
|
|
||||||
|
/* Processor structures data (THIS IS A TEMPORARY HACK) */
|
||||||
|
UCHAR MM::KernelPool::ProcessorStructuresData[MAXIMUM_PROCESSORS][KPROCESSOR_STRUCTURES_SIZE] = {{0}};
|
||||||
|
|
||||||
/* Biggest free memory descriptor */
|
/* Biggest free memory descriptor */
|
||||||
PLOADER_MEMORY_DESCRIPTOR MM::Init::FreeDescriptor;
|
PLOADER_MEMORY_DESCRIPTOR MM::Init::FreeDescriptor;
|
||||||
|
|
||||||
/* Highest physical page number */
|
/* Highest physical page number */
|
||||||
ULONG_PTR MM::Init::HighestPhysicalPage;
|
ULONG_PTR MM::Pfn::HighestPhysicalPage;
|
||||||
|
|
||||||
/* Lowest physical page number */
|
/* Lowest physical page number */
|
||||||
ULONG_PTR MM::Init::LowestPhysicalPage = -1;
|
ULONG_PTR MM::Pfn::LowestPhysicalPage = -1;
|
||||||
|
|
||||||
/* Number of physical pages */
|
/* Number of physical pages */
|
||||||
ULONG MM::Init::NumberOfPhysicalPages;
|
ULONG MM::Pfn::NumberOfPhysicalPages;
|
||||||
|
|
||||||
/* Old biggest free memory descriptor */
|
/* Old biggest free memory descriptor */
|
||||||
LOADER_MEMORY_DESCRIPTOR MM::Init::OldFreeDescriptor;
|
LOADER_MEMORY_DESCRIPTOR MM::Pfn::OldFreeDescriptor;
|
||||||
|
|
||||||
/* Processor structures data (THIS IS A TEMPORARY HACK) */
|
|
||||||
UCHAR MM::KernelPool::ProcessorStructuresData[MAXIMUM_PROCESSORS][KPROCESSOR_STRUCTURES_SIZE] = {{0}};
|
|
||||||
|
|
||||||
/* Instance of the page map routines for the current PML level */
|
/* Instance of the page map routines for the current PML level */
|
||||||
MM::PPAGEMAP MM::Paging::PmlRoutines;
|
MM::PPAGEMAP MM::Paging::PmlRoutines;
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
/**
|
|
||||||
* PROJECT: ExectOS
|
|
||||||
* COPYRIGHT: See COPYING.md in the top level directory
|
|
||||||
* FILE: xtoskrnl/mm/i686/init.cc
|
|
||||||
* DESCRIPTION: Architecture specific Memory Manager initialization routines
|
|
||||||
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
|
|
||||||
* Aiken Harris <harraiken91@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <xtos.hh>
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Performs architecture specific initialization of the XTOS Memory Manager.
|
|
||||||
*
|
|
||||||
* @return This routine does not return any value.
|
|
||||||
*
|
|
||||||
* @since XT 1.0
|
|
||||||
*/
|
|
||||||
XTAPI
|
|
||||||
VOID
|
|
||||||
MM::Init::InitializeArchitecture(VOID)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
}
|
|
||||||
@@ -31,87 +31,6 @@ MM::Manager::InitializeMemoryManager(VOID)
|
|||||||
DebugPrint(L"Insufficient physical pages! Install additional memory\n");
|
DebugPrint(L"Insufficient physical pages! Install additional memory\n");
|
||||||
KE::Crash::Panic(0);
|
KE::Crash::Panic(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Proceed with architecture specific initialization */
|
|
||||||
InitializeArchitecture();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Scans memory descriptors provided by the boot loader.
|
|
||||||
*
|
|
||||||
* @return This routine does not return any value.
|
|
||||||
*
|
|
||||||
* @since XT 1.0
|
|
||||||
*/
|
|
||||||
XTAPI
|
|
||||||
VOID
|
|
||||||
MM::Manager::ScanMemoryDescriptors(VOID)
|
|
||||||
{
|
|
||||||
PLIST_ENTRY LoaderMemoryDescriptors, MemoryMappings;
|
|
||||||
PLOADER_MEMORY_DESCRIPTOR MemoryDescriptor;
|
|
||||||
PFN_NUMBER FreePages;
|
|
||||||
|
|
||||||
/* Initially, set number of free pages to 0 */
|
|
||||||
FreePages = 0;
|
|
||||||
|
|
||||||
/* Get a list of memory descriptors provided by the boot loader */
|
|
||||||
LoaderMemoryDescriptors = KE::BootInformation::GetMemoryDescriptors();
|
|
||||||
|
|
||||||
/* Iterate through memory mappings provided by the boot loader */
|
|
||||||
MemoryMappings = LoaderMemoryDescriptors->Flink;
|
|
||||||
while(MemoryMappings != LoaderMemoryDescriptors)
|
|
||||||
{
|
|
||||||
/* Get memory descriptor */
|
|
||||||
MemoryDescriptor = CONTAIN_RECORD(MemoryMappings, LOADER_MEMORY_DESCRIPTOR, ListEntry);
|
|
||||||
|
|
||||||
/* Check if memory type is invisible or cached */
|
|
||||||
if(VerifyMemoryTypeInvisible(MemoryDescriptor->MemoryType) ||
|
|
||||||
(MemoryDescriptor->MemoryType == LoaderHardwareCachedMemory))
|
|
||||||
{
|
|
||||||
/* Skip this mapping */
|
|
||||||
MemoryMappings = MemoryMappings->Flink;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Make sure that memory type is not bad */
|
|
||||||
if(MemoryDescriptor->MemoryType != LoaderBad)
|
|
||||||
{
|
|
||||||
/* Increment number of physical pages */
|
|
||||||
NumberOfPhysicalPages += MemoryDescriptor->PageCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find lowest physical page */
|
|
||||||
if(MemoryDescriptor->BasePage < LowestPhysicalPage)
|
|
||||||
{
|
|
||||||
/* Update lowest physical page */
|
|
||||||
LowestPhysicalPage = MemoryDescriptor->BasePage;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find highest physical page */
|
|
||||||
if(MemoryDescriptor->BasePage + MemoryDescriptor->PageCount > HighestPhysicalPage)
|
|
||||||
{
|
|
||||||
/* Update highest physical page */
|
|
||||||
HighestPhysicalPage = (MemoryDescriptor->BasePage + MemoryDescriptor->PageCount) - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if memory type should be considered as free */
|
|
||||||
if(VerifyMemoryTypeFree(MemoryDescriptor->MemoryType))
|
|
||||||
{
|
|
||||||
/* Check if this descriptor contains more free pages */
|
|
||||||
if(MemoryDescriptor->PageCount >= FreePages)
|
|
||||||
{
|
|
||||||
/* Update free descriptor */
|
|
||||||
FreePages = MemoryDescriptor->PageCount;
|
|
||||||
FreeDescriptor = MemoryDescriptor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get next memory descriptor */
|
|
||||||
MemoryMappings = MemoryMappings->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Store original free descriptor */
|
|
||||||
RTL::Memory::CopyMemory(&OldFreeDescriptor, FreeDescriptor, sizeof(LOADER_MEMORY_DESCRIPTOR));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Checks whether the specified memory type should be considered as free.
|
/** Checks whether the specified memory type should be considered as free.
|
||||||
|
|||||||
89
xtoskrnl/mm/pfn.cc
Normal file
89
xtoskrnl/mm/pfn.cc
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/**
|
||||||
|
* PROJECT: ExectOS
|
||||||
|
* COPYRIGHT: See COPYING.md in the top level directory
|
||||||
|
* FILE: xtoskrnl/mm/pfn.cc
|
||||||
|
* DESCRIPTION: Physical Frame Number (PFN) support
|
||||||
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
|
* Rafal Kupiec <belliash@codingworkshop.eu.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <xtos.hh>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scans memory descriptors provided by the boot loader.
|
||||||
|
*
|
||||||
|
* @return This routine does not return any value.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
XTAPI
|
||||||
|
VOID
|
||||||
|
MM::Pfn::ScanMemoryDescriptors(VOID)
|
||||||
|
{
|
||||||
|
PLIST_ENTRY LoaderMemoryDescriptors, MemoryMappings;
|
||||||
|
PLOADER_MEMORY_DESCRIPTOR MemoryDescriptor;
|
||||||
|
PFN_NUMBER FreePages;
|
||||||
|
|
||||||
|
/* Initially, set number of free pages to 0 */
|
||||||
|
FreePages = 0;
|
||||||
|
|
||||||
|
/* Get a list of memory descriptors provided by the boot loader */
|
||||||
|
LoaderMemoryDescriptors = KE::BootInformation::GetMemoryDescriptors();
|
||||||
|
|
||||||
|
/* Iterate through memory mappings provided by the boot loader */
|
||||||
|
MemoryMappings = LoaderMemoryDescriptors->Flink;
|
||||||
|
while(MemoryMappings != LoaderMemoryDescriptors)
|
||||||
|
{
|
||||||
|
/* Get memory descriptor */
|
||||||
|
MemoryDescriptor = CONTAIN_RECORD(MemoryMappings, LOADER_MEMORY_DESCRIPTOR, ListEntry);
|
||||||
|
|
||||||
|
/* Check if memory type is invisible or cached */
|
||||||
|
if(VerifyMemoryTypeInvisible(MemoryDescriptor->MemoryType) ||
|
||||||
|
(MemoryDescriptor->MemoryType == LoaderHardwareCachedMemory))
|
||||||
|
{
|
||||||
|
/* Skip this mapping */
|
||||||
|
MemoryMappings = MemoryMappings->Flink;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure that memory type is not bad */
|
||||||
|
if(MemoryDescriptor->MemoryType != LoaderBad)
|
||||||
|
{
|
||||||
|
/* Increment number of physical pages */
|
||||||
|
NumberOfPhysicalPages += MemoryDescriptor->PageCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find lowest physical page */
|
||||||
|
if(MemoryDescriptor->BasePage < LowestPhysicalPage)
|
||||||
|
{
|
||||||
|
/* Update lowest physical page */
|
||||||
|
LowestPhysicalPage = MemoryDescriptor->BasePage;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find highest physical page */
|
||||||
|
if(MemoryDescriptor->BasePage + MemoryDescriptor->PageCount > HighestPhysicalPage)
|
||||||
|
{
|
||||||
|
/* Update highest physical page */
|
||||||
|
HighestPhysicalPage = (MemoryDescriptor->BasePage + MemoryDescriptor->PageCount) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if memory type should be considered as free */
|
||||||
|
if(VerifyMemoryTypeFree(MemoryDescriptor->MemoryType))
|
||||||
|
{
|
||||||
|
/* Check if this descriptor contains more free pages */
|
||||||
|
if(MemoryDescriptor->PageCount >= FreePages)
|
||||||
|
{
|
||||||
|
/* Update free descriptor */
|
||||||
|
FreePages = MemoryDescriptor->PageCount;
|
||||||
|
FreeDescriptor = MemoryDescriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get next memory descriptor */
|
||||||
|
MemoryMappings = MemoryMappings->Flink;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Store original free descriptor */
|
||||||
|
RTL::Memory::CopyMemory(&OldFreeDescriptor, FreeDescriptor, sizeof(LOADER_MEMORY_DESCRIPTOR));
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user