Implement initial memory manager infrastructure #24
@@ -110,6 +110,12 @@
|
|||||||
/* Trampoline code address */
|
/* Trampoline code address */
|
||||||
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
||||||
|
|
||||||
|
/* Pool block size */
|
||||||
|
#define MM_POOL_BLOCK_SIZE 16
|
||||||
|
|
||||||
|
/* Number of pool lists per page */
|
||||||
|
#define MM_POOL_LISTS_PER_PAGE (MM_PAGE_SIZE / MM_POOL_BLOCK_SIZE)
|
||||||
|
|
||||||
/* Page size enumeration list */
|
/* Page size enumeration list */
|
||||||
typedef enum _PAGE_SIZE
|
typedef enum _PAGE_SIZE
|
||||||
{
|
{
|
||||||
@@ -317,4 +323,22 @@ typedef struct _MMPFN
|
|||||||
} u4;
|
} u4;
|
||||||
} MMPFN, *PMMPFN;
|
} MMPFN, *PMMPFN;
|
||||||
|
|
||||||
|
/* Pool descriptor structure definition */
|
||||||
|
typedef struct _POOL_DESCRIPTOR
|
||||||
|
{
|
||||||
|
LIST_ENTRY ListHeads[MM_POOL_LISTS_PER_PAGE];
|
||||||
|
PVOID LockAddress;
|
||||||
|
ULONG PoolIndex;
|
||||||
|
LONG PendingFreeDepth;
|
||||||
|
PVOID PendingFrees;
|
||||||
|
MMPOOL_TYPE PoolType;
|
||||||
|
ULONG RunningFrees;
|
||||||
|
ULONG RunningAllocations;
|
||||||
|
ULONG Threshold;
|
||||||
|
ULONG TotalPages;
|
||||||
|
ULONG TotalBigAllocations;
|
||||||
|
SIZE_T TotalBytes;
|
||||||
|
SIZE_T Reserved;
|
||||||
|
} POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
|
||||||
|
|
||||||
#endif /* __XTDK_AMD64_MMTYPES_H */
|
#endif /* __XTDK_AMD64_MMTYPES_H */
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ typedef struct _MMPTE_PROTOTYPE MMPTE_PROTOTYPE, *PMMPTE_PROTOTYPE;
|
|||||||
typedef struct _MMPTE_SOFTWARE MMPTE_SOFTWARE, *PMMPTE_SOFTWARE;
|
typedef struct _MMPTE_SOFTWARE MMPTE_SOFTWARE, *PMMPTE_SOFTWARE;
|
||||||
typedef struct _MMPTE_SUBSECTION MMPTE_SUBSECTION, *PMMPTE_SUBSECTION;
|
typedef struct _MMPTE_SUBSECTION MMPTE_SUBSECTION, *PMMPTE_SUBSECTION;
|
||||||
typedef struct _MMPTE_TRANSITION MMPTE_TRANSITION, *PMMPTE_TRANSITION;
|
typedef struct _MMPTE_TRANSITION MMPTE_TRANSITION, *PMMPTE_TRANSITION;
|
||||||
|
typedef struct _POOL_DESCRIPTOR POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
|
||||||
typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
||||||
|
|
||||||
/* Unions forward references */
|
/* Unions forward references */
|
||||||
|
|||||||
@@ -108,6 +108,12 @@
|
|||||||
/* Trampoline code address */
|
/* Trampoline code address */
|
||||||
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
#define MM_TRAMPOLINE_ADDRESS 0x80000
|
||||||
|
|
||||||
|
/* Pool block size */
|
||||||
|
#define MM_POOL_BLOCK_SIZE 8
|
||||||
|
|
||||||
|
/* Number of pool lists per page */
|
||||||
|
#define MM_POOL_LISTS_PER_PAGE (MM_PAGE_SIZE / MM_POOL_BLOCK_SIZE)
|
||||||
|
|
||||||
/* Page size enumeration list */
|
/* Page size enumeration list */
|
||||||
typedef enum _PAGE_SIZE
|
typedef enum _PAGE_SIZE
|
||||||
{
|
{
|
||||||
@@ -410,4 +416,22 @@ typedef struct _MMPFN
|
|||||||
} u4;
|
} u4;
|
||||||
} MMPFN, *PMMPFN;
|
} MMPFN, *PMMPFN;
|
||||||
|
|
||||||
|
/* Pool descriptor structure definition */
|
||||||
|
typedef struct _POOL_DESCRIPTOR
|
||||||
|
{
|
||||||
|
LIST_ENTRY ListHeads[MM_POOL_LISTS_PER_PAGE];
|
||||||
|
PVOID LockAddress;
|
||||||
|
ULONG PoolIndex;
|
||||||
|
LONG PendingFreeDepth;
|
||||||
|
PVOID PendingFrees;
|
||||||
|
MMPOOL_TYPE PoolType;
|
||||||
|
ULONG RunningFrees;
|
||||||
|
ULONG RunningAllocations;
|
||||||
|
ULONG Threshold;
|
||||||
|
ULONG TotalPages;
|
||||||
|
ULONG TotalBigAllocations;
|
||||||
|
SIZE_T TotalBytes;
|
||||||
|
SIZE_T Reserved;
|
||||||
|
} POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
|
||||||
|
|
||||||
#endif /* __XTDK_I686_MMTYPES_H */
|
#endif /* __XTDK_I686_MMTYPES_H */
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ typedef struct _MMPML3_PTE_PROTOTYPE MMPML3_PTE_PROTOTYPE, *PMMPML3_PTE_PROTOTYP
|
|||||||
typedef struct _MMPML3_PTE_SOFTWARE MMPML3_PTE_SOFTWARE, *PMMPML3_PTE_SOFTWARE;
|
typedef struct _MMPML3_PTE_SOFTWARE MMPML3_PTE_SOFTWARE, *PMMPML3_PTE_SOFTWARE;
|
||||||
typedef struct _MMPML3_PTE_SUBSECTION MMPML3_PTE_SUBSECTION, *PMMPML3_PTE_SUBSECTION;
|
typedef struct _MMPML3_PTE_SUBSECTION MMPML3_PTE_SUBSECTION, *PMMPML3_PTE_SUBSECTION;
|
||||||
typedef struct _MMPML3_PTE_TRANSITION MMPML3_PTE_TRANSITION, *PMMPML3_PTE_TRANSITION;
|
typedef struct _MMPML3_PTE_TRANSITION MMPML3_PTE_TRANSITION, *PMMPML3_PTE_TRANSITION;
|
||||||
|
typedef struct _POOL_DESCRIPTOR POOL_DESCRIPTOR, *PPOOL_DESCRIPTOR;
|
||||||
typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
typedef struct _THREAD_ENVIRONMENT_BLOCK THREAD_ENVIRONMENT_BLOCK, *PTHREAD_ENVIRONMENT_BLOCK;
|
||||||
|
|
||||||
/* Unions forward references */
|
/* Unions forward references */
|
||||||
|
|||||||
@@ -33,9 +33,13 @@
|
|||||||
#define MM_POOL_INVALID_ALLOC_RUNLEVEL 8
|
#define MM_POOL_INVALID_ALLOC_RUNLEVEL 8
|
||||||
#define MM_POOL_INVALID_FREE_RUNLEVEL 9
|
#define MM_POOL_INVALID_FREE_RUNLEVEL 9
|
||||||
|
|
||||||
|
/* Big allocations entry flags */
|
||||||
|
#define MM_POOL_BIG_ALLOCATIONS_ENTRY_FREE 0x1
|
||||||
|
|
||||||
/* Number of reserved zeroed PTEs */
|
/* Number of reserved zeroed PTEs */
|
||||||
#define MM_RESERVED_ZERO_PTES 32
|
#define MM_RESERVED_ZERO_PTES 32
|
||||||
|
|
||||||
|
|
||||||
/* Memory manager page lists */
|
/* Memory manager page lists */
|
||||||
typedef enum _MMPAGELISTS
|
typedef enum _MMPAGELISTS
|
||||||
{
|
{
|
||||||
@@ -66,14 +70,14 @@ typedef enum _MMPOOL_TYPE
|
|||||||
NonPagedPoolMustSucceed = 2,
|
NonPagedPoolMustSucceed = 2,
|
||||||
NonPagedPoolCacheAligned = 4,
|
NonPagedPoolCacheAligned = 4,
|
||||||
PagedPoolCacheAligned = 5,
|
PagedPoolCacheAligned = 5,
|
||||||
NonPagedPoolCacheAlignedMustS = 6,
|
NonPagedPoolCacheAlignedMustSucceed = 6,
|
||||||
MaxPoolType = 7,
|
MaxPoolType = 7,
|
||||||
NonPagedPoolSession = 32,
|
NonPagedPoolSession = 32,
|
||||||
PagedPoolSession = 33,
|
PagedPoolSession = 33,
|
||||||
NonPagedPoolMustSucceedSession = 34,
|
NonPagedPoolMustSucceedSession = 34,
|
||||||
NonPagedPoolCacheAlignedSession = 36,
|
NonPagedPoolCacheAlignedSession = 36,
|
||||||
PagedPoolCacheAlignedSession = 37,
|
PagedPoolCacheAlignedSession = 37,
|
||||||
NonPagedPoolCacheAlignedMustSSession = 38
|
NonPagedPoolCacheAlignedMustSucceedSession = 38
|
||||||
} MMPOOL_TYPE, *PMMPOOL_TYPE;
|
} MMPOOL_TYPE, *PMMPOOL_TYPE;
|
||||||
|
|
||||||
/* Page table pool types */
|
/* Page table pool types */
|
||||||
@@ -192,4 +196,39 @@ typedef struct _PHYSICAL_MEMORY_DESCRIPTOR
|
|||||||
PHYSICAL_MEMORY_RUN Run[1];
|
PHYSICAL_MEMORY_RUN Run[1];
|
||||||
} PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
|
} PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
|
||||||
|
|
||||||
|
/* Pool header structure definition */
|
||||||
|
typedef struct _POOL_HEADER
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
USHORT PreviousSize:9;
|
||||||
|
USHORT PoolIndex:7;
|
||||||
|
USHORT BlockSize:9;
|
||||||
|
USHORT PoolType:7;
|
||||||
|
};
|
||||||
|
ULONG Long;
|
||||||
|
};
|
||||||
|
union
|
||||||
|
{
|
||||||
|
ULONG PoolTag;
|
||||||
|
PEPROCESS ProcessBilled;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
USHORT AllocatorBackTraceIndex;
|
||||||
|
USHORT PoolTagHash;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} POOL_HEADER, *PPOOL_HEADER;
|
||||||
|
|
||||||
|
/* Pool descriptor structure definition */
|
||||||
|
typedef struct _POOL_TRACKER_BIG_ALLOCATIONS
|
||||||
|
{
|
||||||
|
PVOID VirtualAddress;
|
||||||
|
ULONG Key;
|
||||||
|
ULONG NumberOfPages;
|
||||||
|
PVOID QuotaObject;
|
||||||
|
} POOL_TRACKER_BIG_ALLOCATIONS, *PPOOL_TRACKER_BIG_ALLOCATIONS;
|
||||||
|
|
||||||
#endif /* __XTDK_MMTYPES_H */
|
#endif /* __XTDK_MMTYPES_H */
|
||||||
|
|||||||
@@ -312,6 +312,8 @@ typedef struct _PECOFF_IMAGE_SECTION_HEADER PECOFF_IMAGE_SECTION_HEADER, *PPECOF
|
|||||||
typedef struct _PECOFF_IMAGE_VXD_HEADER PECOFF_IMAGE_VXD_HEADER, *PPECOFF_IMAGE_VXD_HEADER;
|
typedef struct _PECOFF_IMAGE_VXD_HEADER PECOFF_IMAGE_VXD_HEADER, *PPECOFF_IMAGE_VXD_HEADER;
|
||||||
typedef struct _PHYSICAL_MEMORY_DESCRIPTOR PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
|
typedef struct _PHYSICAL_MEMORY_DESCRIPTOR PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
|
||||||
typedef struct _PHYSICAL_MEMORY_RUN PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
|
typedef struct _PHYSICAL_MEMORY_RUN PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
|
||||||
|
typedef struct _POOL_HEADER POOL_HEADER, *PPOOL_HEADER;
|
||||||
|
typedef struct _POOL_TRACKER_BIG_ALLOCATIONS POOL_TRACKER_BIG_ALLOCATIONS, *PPOOL_TRACKER_BIG_ALLOCATIONS;
|
||||||
typedef struct _PROCESSOR_IDENTITY PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY;
|
typedef struct _PROCESSOR_IDENTITY PROCESSOR_IDENTITY, *PPROCESSOR_IDENTITY;
|
||||||
typedef struct _PROCESSOR_POWER_STATE PROCESSOR_POWER_STATE, *PPROCESSOR_POWER_STATE;
|
typedef struct _PROCESSOR_POWER_STATE PROCESSOR_POWER_STATE, *PPROCESSOR_POWER_STATE;
|
||||||
typedef struct _RTL_BITMAP RTL_BITMAP, *PRTL_BITMAP;
|
typedef struct _RTL_BITMAP RTL_BITMAP, *PRTL_BITMAP;
|
||||||
|
|||||||
Reference in New Issue
Block a user