Implement page allocation interface
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 25s
Builds / ExectOS (i686, debug) (push) Successful in 26s
Builds / ExectOS (amd64, release) (push) Successful in 36s
Builds / ExectOS (i686, release) (push) Successful in 34s

This commit is contained in:
2026-02-26 13:42:58 +01:00
parent 278def3081
commit 511dd15c0c
6 changed files with 190 additions and 5 deletions

View File

@@ -17,12 +17,18 @@
/* Number of hyper space pages */ /* Number of hyper space pages */
#define MM_HYPERSPACE_PAGE_COUNT 255 #define MM_HYPERSPACE_PAGE_COUNT 255
/* Number of free page list heads */
#define MM_MAX_FREE_PAGE_LIST_HEADS 4
/* Number of paging colors */ /* Number of paging colors */
#define MM_PAGING_COLORS 64 #define MM_PAGING_COLORS 64
/* PTE frame mask definition */ /* PTE frame mask definition */
#define MM_PFN_PTE_FRAME (((ULONG_PTR)1 << MM_PTE_FRAME_BITS) - 1) #define MM_PFN_PTE_FRAME (((ULONG_PTR)1 << MM_PTE_FRAME_BITS) - 1)
/* Memory manager pool type mask definition */
#define MM_POOL_TYPE_MASK 1
/* Number of reserved zeroed PTEs */ /* Number of reserved zeroed PTEs */
#define MM_RESERVED_ZERO_PTES 32 #define MM_RESERVED_ZERO_PTES 32
@@ -48,6 +54,24 @@ typedef enum _MMPFN_CACHE_ATTRIBUTE
PfnNotMapped PfnNotMapped
} MMPFN_CACHE_ATTRIBUTE, *PMMPFN_CACHE_ATTRIBUTE; } MMPFN_CACHE_ATTRIBUTE, *PMMPFN_CACHE_ATTRIBUTE;
/* Memory Manager pool types */
typedef enum _MMPOOL_TYPE
{
NonPagedPool = 0,
PagedPool = 1,
NonPagedPoolMustSucceed = 2,
NonPagedPoolCacheAligned = 4,
PagedPoolCacheAligned = 5,
NonPagedPoolCacheAlignedMustS = 6,
MaxPoolType = 7,
NonPagedPoolSession = 32,
PagedPoolSession = 33,
NonPagedPoolMustSucceedSession = 34,
NonPagedPoolCacheAlignedSession = 36,
PagedPoolCacheAlignedSession = 37,
NonPagedPoolCacheAlignedMustSSession = 38
} MMPOOL_TYPE, *PMMPOOL_TYPE;
/* Page table pool types */ /* Page table pool types */
typedef enum _MMSYSTEM_PTE_POOL_TYPE typedef enum _MMSYSTEM_PTE_POOL_TYPE
{ {
@@ -73,6 +97,13 @@ typedef struct _MMCOLOR_TABLES
ULONG_PTR Count; ULONG_PTR Count;
} MMCOLOR_TABLES, *PMMCOLOR_TABLES; } MMCOLOR_TABLES, *PMMCOLOR_TABLES;
/* Free pool entry structure definition */
typedef struct _MMFREE_POOL_ENTRY
{
LIST_ENTRY List;
PFN_COUNT Size;
} MMFREE_POOL_ENTRY, *PMMFREE_POOL_ENTRY;
/* Memory layout structure definition */ /* Memory layout structure definition */
typedef struct _MMMEMORY_LAYOUT typedef struct _MMMEMORY_LAYOUT
{ {

View File

@@ -50,6 +50,7 @@ typedef enum _KUBSAN_DATA_TYPE KUBSAN_DATA_TYPE, *PKUBSAN_DATA_TYPE;
typedef enum _LOADER_MEMORY_TYPE LOADER_MEMORY_TYPE, *PLOADER_MEMORY_TYPE; typedef enum _LOADER_MEMORY_TYPE LOADER_MEMORY_TYPE, *PLOADER_MEMORY_TYPE;
typedef enum _MMPAGELISTS MMPAGELISTS, *PMMPAGELISTS; typedef enum _MMPAGELISTS MMPAGELISTS, *PMMPAGELISTS;
typedef enum _MMPFN_CACHE_ATTRIBUTE MMPFN_CACHE_ATTRIBUTE, *PMMPFN_CACHE_ATTRIBUTE; typedef enum _MMPFN_CACHE_ATTRIBUTE MMPFN_CACHE_ATTRIBUTE, *PMMPFN_CACHE_ATTRIBUTE;
typedef enum _MMPOOL_TYPE MMPOOL_TYPE, *PMMPOOL_TYPE;
typedef enum _MMSYSTEM_PTE_POOL_TYPE MMSYSTEM_PTE_POOL_TYPE, *PMMSYSTEM_PTE_POOL_TYPE; typedef enum _MMSYSTEM_PTE_POOL_TYPE MMSYSTEM_PTE_POOL_TYPE, *PMMSYSTEM_PTE_POOL_TYPE;
typedef enum _MODE MODE, *PMODE; typedef enum _MODE MODE, *PMODE;
typedef enum _RTL_VARIABLE_TYPE RTL_VARIABLE_TYPE, *PRTL_VARIABLE_TYPE; typedef enum _RTL_VARIABLE_TYPE RTL_VARIABLE_TYPE, *PRTL_VARIABLE_TYPE;
@@ -277,6 +278,7 @@ typedef struct _LOADER_INFORMATION_BLOCK LOADER_INFORMATION_BLOCK, *PLOADER_INFO
typedef struct _LOADER_MEMORY_DESCRIPTOR LOADER_MEMORY_DESCRIPTOR, *PLOADER_MEMORY_DESCRIPTOR; typedef struct _LOADER_MEMORY_DESCRIPTOR LOADER_MEMORY_DESCRIPTOR, *PLOADER_MEMORY_DESCRIPTOR;
typedef struct _M128 M128, *PM128; typedef struct _M128 M128, *PM128;
typedef struct _MMCOLOR_TABLES MMCOLOR_TABLES, *PMMCOLOR_TABLES; typedef struct _MMCOLOR_TABLES MMCOLOR_TABLES, *PMMCOLOR_TABLES;
typedef struct _MMFREE_POOL_ENTRY MMFREE_POOL_ENTRY, *PMMFREE_POOL_ENTRY;
typedef struct _MMMEMORY_LAYOUT MMMEMORY_LAYOUT, *PMMMEMORY_LAYOUT; typedef struct _MMMEMORY_LAYOUT MMMEMORY_LAYOUT, *PMMMEMORY_LAYOUT;
typedef struct _MMPFNENTRY MMPFNENTRY, *PMMPFNENTRY; typedef struct _MMPFNENTRY MMPFNENTRY, *PMMPFNENTRY;
typedef struct _MMPFNLIST MMPFNLIST, *PMMPFNLIST; typedef struct _MMPFNLIST MMPFNLIST, *PMMPFNLIST;

View File

@@ -18,7 +18,18 @@ namespace MM
class Allocator class Allocator
{ {
public: public:
STATIC XTAPI XTSTATUS AllocatePages(IN MMPOOL_TYPE PoolType,
IN SIZE_T Bytes,
OUT PVOID *Memory);
STATIC XTAPI VOID InitializeNonPagedPool(VOID); STATIC XTAPI VOID InitializeNonPagedPool(VOID);
STATIC XTAPI VOID InitializePagedPool(VOID);
private:
STATIC XTAPI XTSTATUS AllocateNonPagedPoolPages(IN PFN_COUNT Pages,
OUT PVOID *Memory);
STATIC XTAPI XTSTATUS AllocatePagedPoolPages(IN PFN_COUNT Pages,
OUT PVOID *Memory);
STATIC XTAPI VOID MapNonPagedPool(VOID);
}; };
} }

View File

@@ -9,3 +9,133 @@
#include <xtos.hh> #include <xtos.hh>
/**
* Allocates pages from the non-paged pool.
*
* @param Pages
* Specifies the number of pages to allocate.
*
* @param Memory
* Supplies a pointer to the allocated pool.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTAPI
XTSTATUS
MM::Allocator::AllocateNonPagedPoolPages(IN PFN_COUNT Pages,
OUT PVOID *Memory)
{
UNIMPLEMENTED;
/* Return not implemented status code */
return STATUS_NOT_IMPLEMENTED;
}
/**
* Allocates pages from the paged pool.
*
* @param Pages
* Specifies the number of pages to allocate.
*
* @param Memory
* Supplies a pointer to the allocated pool.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTAPI
XTSTATUS
MM::Allocator::AllocatePagedPoolPages(IN PFN_COUNT Pages,
OUT PVOID *Memory)
{
UNIMPLEMENTED;
/* Return not implemented status code */
return STATUS_NOT_IMPLEMENTED;
}
/**
* Allocates pages from the specified pool type.
*
* @param PoolType
* Specifies the type of pool to allocate pages from.
*
* @param Bytes
* Specifies the number of bytes to allocate.
*
* @param Memory
* Supplies a pointer to the allocated pool.
*
* @return This routine returns a status code.
*
* @since XT 1.0
*/
XTAPI
XTSTATUS
MM::Allocator::AllocatePages(IN MMPOOL_TYPE PoolType,
IN SIZE_T Bytes,
OUT PVOID *Memory)
{
PFN_COUNT Pages;
/* Initialize the output parameter */
*Memory = NULLPTR;
/* Convert bytes to pages */
Pages = SIZE_TO_PAGES(Bytes);
/* Check if there are any pages to allocate */
if(!Pages)
{
/* Nothing to allocate, return NULLPTR */
return STATUS_INVALID_PARAMETER;
}
/* Switch on pool type */
switch(PoolType & MM_POOL_TYPE_MASK)
{
case NonPagedPool:
/* Allocate non-paged pool */
return AllocateNonPagedPoolPages(Pages, Memory);
case PagedPool:
/* Allocate paged pool */
return AllocatePagedPoolPages(Pages, Memory);
}
/* Invalid pool type specified, return error */
return STATUS_INVALID_PARAMETER;
}
/**
* Initializes the non-paged pool for memory allocator.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
MM::Allocator::InitializeNonPagedPool(VOID)
{
UNIMPLEMENTED;
/* Map PTEs for the non-paged pool */
MapNonPagedPool();
}
/**
* Initializes the non-paged pool for memory allocator.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
MM::Allocator::InitializePagedPool(VOID)
{
UNIMPLEMENTED;
}

View File

@@ -9,14 +9,19 @@
#include <xtos.hh> #include <xtos.hh>
/**
* Maps the PTE for the base of the non-paged pool.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI XTAPI
VOID VOID
MM::Allocator::InitializeNonPagedPool(VOID) MM::Allocator::MapNonPagedPool(VOID)
{ {
PMMMEMORY_LAYOUT MemoryLayout; PMMMEMORY_LAYOUT MemoryLayout;
UNIMPLEMENTED;
/* Retrieve memory layout */ /* Retrieve memory layout */
MemoryLayout = MM::Manager::GetMemoryLayout(); MemoryLayout = MM::Manager::GetMemoryLayout();

View File

@@ -9,12 +9,18 @@
#include <xtos.hh> #include <xtos.hh>
/**
* Maps the PTE for the base of the non-paged pool.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI XTAPI
VOID VOID
MM::Allocator::InitializeNonPagedPool(VOID) MM::Allocator::MapNonPagedPool(VOID)
{ {
PMMMEMORY_LAYOUT MemoryLayout; PMMMEMORY_LAYOUT MemoryLayout;
UNIMPLEMENTED;
/* Retrieve memory layout */ /* Retrieve memory layout */
MemoryLayout = MM::Manager::GetMemoryLayout(); MemoryLayout = MM::Manager::GetMemoryLayout();