Introduce page coloring support to memory manager
Some checks failed
Builds / ExectOS (amd64, release) (push) Failing after 22s
Builds / ExectOS (amd64, debug) (push) Failing after 24s
Builds / ExectOS (i686, debug) (push) Failing after 23s
Builds / ExectOS (i686, release) (push) Failing after 21s

This commit is contained in:
2025-12-23 14:27:12 +01:00
parent c7cc536685
commit 288b2f8b24
5 changed files with 143 additions and 0 deletions

View File

@@ -15,6 +15,7 @@
#include XTOS_ARCH_HEADER(mm, paging.hh)
#include XTOS_ARCH_HEADER(mm, pte.hh)
#include <mm/colors.hh>
#include <mm/hlpool.hh>
#include <mm/kpool.hh>
#include <mm/mmgr.hh>

View File

@@ -0,0 +1,35 @@
/**
* PROJECT: ExectOS
* COPYRIGHT: See COPYING.md in the top level directory
* FILE: xtoskrnl/includes/mm/colors.hh
* DESCRIPTION: Memory manager page coloring subsystem
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
*/
#ifndef __XTOSKRNL_MM_COLORS_HH
#define __XTOSKRNL_MM_COLORS_HH
#include <xtos.hh>
/* Memory Manager */
namespace MM
{
class Colors
{
private:
STATIC PMMCOLOR_TABLES FreePages[FreePageList + 1];
STATIC ULONG PagingColors;
STATIC ULONG PagingColorsMask;
public:
STATIC XTAPI VOID ComputePageColoring(VOID);
STATIC XTAPI PMMCOLOR_TABLES GetFreePages(MMPAGELISTS PageList,
ULONG Color);
STATIC XTAPI ULONG GetNextColor();
STATIC XTAPI ULONG GetPagingColors();
STATIC XTAPI ULONG GetPagingColorsMask();
};
}
#endif /* __XTOSKRNL_MM_PFN_HH */

95
xtoskrnl/mm/colors.cc Normal file
View File

@@ -0,0 +1,95 @@
/**
* PROJECT: ExectOS
* COPYRIGHT: See COPYING.md in the top level directory
* FILE: xtoskrnl/mm/colors.cc
* DESCRIPTION: Memory manager page coloring subsystem
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
*/
#include <xtos.hh>
/**
* Computes & initializes the system's page coloring.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
MM::Colors::ComputePageColoring(VOID)
{
UNIMPLEMENTED;
/* Compute L2 paging colors and mask */
PagingColors = MM_PAGING_COLORS;
PagingColorsMask = PagingColors - 1;
}
/**
* Retrieves a pointer to the color table for a specific page list and color.
*
* @param PageList
* The page list type (e.g., FreePageList, ZeroedPageList).
*
* @param Color
* Supplies the specific color index.
*
* @return This routine returns a pointer to the corresponding MMCOLOR_TABLES structure.
*
* @since XT 1.0
*/
XTAPI
PMMCOLOR_TABLES
MM::Colors::GetFreePages(MMPAGELISTS PageList,
ULONG Color)
{
/* Return a pointer to the requested color table entry */
return &FreePages[PageList][Color];
}
/**
* Retrieves the next available color for page coloring.
*
* @return This routine returns the next color value, ensuring it stays within the valid color range.
*
* @since XT 1.0
*/
XTAPI
ULONG
MM::Colors::GetNextColor()
{
/* Increment the color counter and wrap it around using the mask */
return ((++PagingColors) & PagingColorsMask);
}
/**
* Retrieves the total number of page colors configured in the system.
*
* @return This routine returns the number of page colors.
*
* @since XT 1.0
*/
XTAPI
ULONG
MM::Colors::GetPagingColors()
{
/* Return the total number of page colors */
return PagingColors;
}
/**
* Retrieves the bitmask used for calculating a page's color.
*
* @return This routine returns the page color mask.
*
* @since XT 1.0
*/
XTAPI
ULONG
MM::Colors::GetPagingColorsMask()
{
/* Return the mask used for page coloring calculations */
return PagingColorsMask;
}

View File

@@ -9,6 +9,15 @@
#include <xtos.hh>
/* Array of free page lists segregated by cache color */
PMMCOLOR_TABLES MM::Colors::FreePages[FreePageList + 1];
/* Number of supported page colors */
ULONG MM::Colors::PagingColors;
/* Bitmask used to calculate the cache color index */
ULONG MM::Colors::PagingColorsMask;
/* Allocation descriptors dedicated for hardware layer */
LOADER_MEMORY_DESCRIPTOR MM::HardwarePool::HardwareAllocationDescriptors[MM_HARDWARE_ALLOCATION_DESCRIPTORS];

View File

@@ -54,6 +54,9 @@ MM::Manager::InitializeMemoryManager(VOID)
KE::Crash::Panic(0);
}
/* Compute page colors to reduce CPU cache conflicts */
MM::Colors::ComputePageColoring();
/* Compute allocation size for the PFN database */
MM::Pfn::ComputePfnDatabaseSize();