From 04e22c127eda88bc963f794481e2a681221d80d6 Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Sun, 7 Apr 2024 10:26:12 +0200 Subject: [PATCH] Initial memory manager initialization code --- sdk/xtdk/amd64/mmtypes.h | 19 ++++++- sdk/xtdk/i686/mmtypes.h | 3 + xtoskrnl/CMakeLists.txt | 3 + xtoskrnl/includes/amd64/mmi.h | 20 +++++++ xtoskrnl/includes/globals.h | 15 +++++ xtoskrnl/includes/i686/mmi.h | 4 ++ xtoskrnl/includes/mmi.h | 16 ++++++ xtoskrnl/mm/amd64/init.c | 104 ++++++++++++++++++++++++++++++++++ xtoskrnl/mm/globals.c | 25 ++++++++ xtoskrnl/mm/i686/init.c | 24 ++++++++ 10 files changed, 232 insertions(+), 1 deletion(-) create mode 100644 xtoskrnl/mm/amd64/init.c create mode 100644 xtoskrnl/mm/globals.c create mode 100644 xtoskrnl/mm/i686/init.c diff --git a/sdk/xtdk/amd64/mmtypes.h b/sdk/xtdk/amd64/mmtypes.h index aa30263..6f91210 100644 --- a/sdk/xtdk/amd64/mmtypes.h +++ b/sdk/xtdk/amd64/mmtypes.h @@ -14,9 +14,26 @@ /* Pages related definitions */ #define MM_PAGE_MASK 0xFFF -#define MM_PAGE_SHIFT 12 +#define MM_PAGE_SHIFT 12L #define MM_PAGE_SIZE 4096 +#define MM_PTE_BASE 0xFFFFF68000000000UI64 +#define MM_PDE_BASE 0xFFFFF6FB40000000UI64 +#define MM_PPE_BASE 0xFFFFF6FB7DA00000UI64 +#define MM_PXE_BASE 0xFFFFF6FB7DBED000UI64 + +#define MM_PTI_SHIFT 12 +#define MM_PDI_SHIFT 21 +#define MM_PPI_SHIFT 30 +#define MM_PXI_SHIFT 39 + +#define MM_PTE_SHIFT 3 + +#define MM_PXE_PER_PAGE 512 + +/* Minimum number of physical pages needed by the system */ +#define MM_MINIMUM_PHYSICAL_PAGES 2048 + /* Page size enumeration list */ typedef enum _PAGE_SIZE { diff --git a/sdk/xtdk/i686/mmtypes.h b/sdk/xtdk/i686/mmtypes.h index 2beb12c..2b1993f 100644 --- a/sdk/xtdk/i686/mmtypes.h +++ b/sdk/xtdk/i686/mmtypes.h @@ -17,6 +17,9 @@ #define MM_PAGE_SHIFT 12 #define MM_PAGE_SIZE 4096 +/* Minimum number of physical pages needed by the system */ +#define MM_MINIMUM_PHYSICAL_PAGES 1100 + /* Page size enumeration list */ typedef enum _PAGE_SIZE { diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index a8f5675..0ae045a 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -36,7 +36,10 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/krnlinit.c ${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/kthread.c ${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/proc.c + ${XTOSKRNL_SOURCE_DIR}/mm/globals.c + ${XTOSKRNL_SOURCE_DIR}/mm/init.c ${XTOSKRNL_SOURCE_DIR}/mm/kpools.c + ${XTOSKRNL_SOURCE_DIR}/mm/${ARCH}/init.c ${XTOSKRNL_SOURCE_DIR}/mm/${ARCH}/pages.c ${XTOSKRNL_SOURCE_DIR}/po/idle.c ${XTOSKRNL_SOURCE_DIR}/rtl/atomic.c diff --git a/xtoskrnl/includes/amd64/mmi.h b/xtoskrnl/includes/amd64/mmi.h index b52e7b6..5d850a1 100644 --- a/xtoskrnl/includes/amd64/mmi.h +++ b/xtoskrnl/includes/amd64/mmi.h @@ -18,4 +18,24 @@ VOID MmZeroPages(IN PVOID Address, IN ULONG Size); +XTAPI +PMMPTE +MmpGetPdeAddress(PVOID Address); + +XTAPI +PMMPTE +MmpGetPpeAddress(PVOID Address); + +XTAPI +PMMPTE +MmpGetPteAddress(PVOID Address); + +XTAPI +PMMPTE +MmpGetPxeAddress(PVOID Address); + +XTAPI +VOID +MmpInitializeArchitecture(); + #endif /* __XTOSKRNL_AMD64_MMI_H */ diff --git a/xtoskrnl/includes/globals.h b/xtoskrnl/includes/globals.h index cc426ab..dea6b0a 100644 --- a/xtoskrnl/includes/globals.h +++ b/xtoskrnl/includes/globals.h @@ -42,4 +42,19 @@ EXTERN KSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable[KSERVICE_TABLES_COUNT] /* Kernel process list */ EXTERN LIST_ENTRY KepProcessListHead; +/* Biggest free memory descriptor */ +EXTERN PLOADER_MEMORY_MAPPING MmFreeDescriptor; + +/* Highest physical page number */ +EXTERN ULONG_PTR MmHighestPhysicalPage; + +/* Lowest physical page number */ +EXTERN ULONG_PTR MmLowestPhysicalPage; + +/* Number of physical pages */ +EXTERN ULONG MmNumberOfPhysicalPages; + +/* Old biggest free memory descriptor */ +EXTERN LOADER_MEMORY_MAPPING MmOldFreeDescriptor; + #endif /* __XTOSKRNL_GLOBALS_H */ diff --git a/xtoskrnl/includes/i686/mmi.h b/xtoskrnl/includes/i686/mmi.h index 55b43e9..ccb1dae 100644 --- a/xtoskrnl/includes/i686/mmi.h +++ b/xtoskrnl/includes/i686/mmi.h @@ -18,4 +18,8 @@ VOID MmZeroPages(IN PVOID Address, IN ULONG Size); +XTAPI +VOID +MmpInitializeArchitecture(); + #endif /* __XTOSKRNL_I686_MMI_H */ diff --git a/xtoskrnl/includes/mmi.h b/xtoskrnl/includes/mmi.h index 528ec40..987870e 100644 --- a/xtoskrnl/includes/mmi.h +++ b/xtoskrnl/includes/mmi.h @@ -24,4 +24,20 @@ VOID MmFreeKernelStack(IN PVOID Stack, IN BOOLEAN LargeStack); +XTAPI +VOID +MmInitializeMemoryManager(); + +XTAPI +VOID +MmpScanMemoryDescriptors(); + +XTAPI +BOOLEAN +MmpVerifyMemoryTypeFree(LOADER_MEMORY_TYPE MemoryType); + +XTAPI +BOOLEAN +MmpVerifyMemoryTypeInvisible(LOADER_MEMORY_TYPE MemoryType); + #endif /* __XTOSKRNL_MMI_H */ diff --git a/xtoskrnl/mm/amd64/init.c b/xtoskrnl/mm/amd64/init.c new file mode 100644 index 0000000..7e6be6f --- /dev/null +++ b/xtoskrnl/mm/amd64/init.c @@ -0,0 +1,104 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/mm/amd64/init.c + * DESCRIPTION: Architecture specific Memory Manager initialization routines + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * Gets the address of the PDE (Page Directory Entry), that maps given address. + * + * @param Address + * Specifies the address to find the PDE for. + * + * @return This routine returns the address of the PDE. + * + * @since XT 1.0 + */ +XTAPI +PMMPTE +MmpGetPdeAddress(PVOID Address) +{ + ULONGLONG Offset; + + Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << 48) - 1)) >> MM_PDI_SHIFT) << MM_PTE_SHIFT); + return (PMMPTE)(MM_PDE_BASE + Offset); +} + +/** + * Gets the address of the PPE (Page Directory Pointer Table Entry), that maps given address. + * + * @param Address + * Specifies the address to find the PPE for. + * + * @return This routine returns the address of the PPE. + * + * @since XT 1.0 + */ +XTAPI +PMMPTE +MmpGetPpeAddress(PVOID Address) +{ + ULONGLONG Offset; + + Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << 48) - 1)) >> MM_PPI_SHIFT) << MM_PTE_SHIFT); + return (PMMPTE)(MM_PPE_BASE + Offset); +} + +/** + * Gets the address of the PTE (Page Table Entry), that maps given address. + * + * @param Address + * Specifies the address to find the PTE for. + * + * @return This routine returns the address of the PTE. + * + * @since XT 1.0 + */ +XTAPI +PMMPTE +MmpGetPteAddress(PVOID Address) +{ + ULONGLONG Offset; + + Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << 48) - 1)) >> MM_PTI_SHIFT) << MM_PTE_SHIFT); + return (PMMPTE)(MM_PTE_BASE + Offset); +} + +/** + * Gets the address of the PXE (Extended Page Entry), that maps given address. + * + * @param Address + * Specifies the address to find the PXE for. + * + * @return This routine returns the address of the PXE. + * + * @since XT 1.0 + */ +XTAPI +PMMPTE +MmpGetPxeAddress(PVOID Address) +{ + ULONGLONG Offset; + + Offset = (((ULONGLONG)Address >> MM_PXI_SHIFT) & (MM_PXE_PER_PAGE - 1)); + return (PMMPTE)(MM_PXE_BASE + Offset); +} + +/** + * Performs architecture specific initialization of the XTOS Memory Manager. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +MmpInitializeArchitecture() +{ + UNIMPLEMENTED; +} diff --git a/xtoskrnl/mm/globals.c b/xtoskrnl/mm/globals.c new file mode 100644 index 0000000..b2c75f6 --- /dev/null +++ b/xtoskrnl/mm/globals.c @@ -0,0 +1,25 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/mm/globals.c + * DESCRIPTION: Memory Manager initialization routines + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/* Biggest free memory descriptor */ +PLOADER_MEMORY_MAPPING MmFreeDescriptor; + +/* Highest physical page number */ +ULONG_PTR MmHighestPhysicalPage; + +/* Lowest physical page number */ +ULONG_PTR MmLowestPhysicalPage = -1; + +/* Number of physical pages */ +ULONG MmNumberOfPhysicalPages; + +/* Old biggest free memory descriptor */ +LOADER_MEMORY_MAPPING MmOldFreeDescriptor; diff --git a/xtoskrnl/mm/i686/init.c b/xtoskrnl/mm/i686/init.c new file mode 100644 index 0000000..04877d4 --- /dev/null +++ b/xtoskrnl/mm/i686/init.c @@ -0,0 +1,24 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/mm/i686/init.c + * DESCRIPTION: Architecture specific Memory Manager initialization routines + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * Performs architecture specific initialization of the XTOS Memory Manager. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +MmpInitializeArchitecture() +{ + UNIMPLEMENTED; +}