Announce dynamic multi-level paging and experimental LA57 support
All checks were successful
Builds / ExectOS WebSite (push) Successful in 13s
All checks were successful
Builds / ExectOS WebSite (push) Successful in 13s
This commit is contained in:
79
content/news/20250904-dynamic-pml-and-la57-support.md
Normal file
79
content/news/20250904-dynamic-pml-and-la57-support.md
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
+++
|
||||||
|
title = 'Dynamic Multi-Level Paging and Experimental LA57 Support'
|
||||||
|
author = 'Aiken Harris'
|
||||||
|
date = '2025-09-04T19:21:37+01:00'
|
||||||
|
+++
|
||||||
|
We have reached an important milestone in the development of ExectOS. While this is not a release announcement, we are
|
||||||
|
excited to share significant progress on the virtual memory subsystem that lays the foundation for the future kernel
|
||||||
|
memory manager.
|
||||||
|
|
||||||
|
Although the kernel does not yet have a fully functional memory manager, the latest work ensures that when we begin its
|
||||||
|
implementation, it will seamlessly support all paging levels from the very start. With proper handling of PML2, PML3,
|
||||||
|
PML4, and PML5 already integrated into the bootloader and partially into the kernel, we have created a highly flexible
|
||||||
|
and future-proof paging framework.
|
||||||
|
|
||||||
|
## Dynamic Multi-Level Paging
|
||||||
|
Unlike most operating systems, which require separate kernel builds or compile-time configuration to handle different
|
||||||
|
paging models, ExectOS takes a unique approach. Instead of choosing a single paging mode at build time, the kernel
|
||||||
|
selects the correct strategy **dynamically at runtime**.
|
||||||
|
|
||||||
|
To achieve this, we have introduced the concept of XPA — eXtended Physical Addressing. This is an internal term used to
|
||||||
|
unify two different hardware features under a single abstraction:
|
||||||
|
* On i686, XPA refers to PAE (Physical Address Extension), which enables PML3.
|
||||||
|
* On AMD64, XPA refers to LA57 (5-level paging), which enables PML5.
|
||||||
|
|
||||||
|
The kernel automatically detects whether the CPU supports PAE or LA57 and chooses the appropriate paging strategy. If
|
||||||
|
the user wants to disable extended paging modes, this can be done with a single boot parameter: **NOXPA**. Without this
|
||||||
|
abstraction, we would have needed two separate options (**NOPAE** and **NOLA57**), complicating both code and
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
## The Strategy-Based Design
|
||||||
|
The new paging subsystem uses the Strategy design pattern to provide both flexibility and maintainability. Instead of
|
||||||
|
hardcoding assumptions about paging levels, we now have two cooperating structures:
|
||||||
|
* **MMPAGEMAP_INFO**: Stores static information about the active paging mode, such as base virtual addresses, offsets
|
||||||
|
for PTE/PDE/PPE/PXE/P5E levels, and flags describing whether XPA is enabled.
|
||||||
|
* **MMPAGEMAP_ROUTINES**: Holds function pointers for all paging-related operations, such as validating PTEs,
|
||||||
|
allocating new page tables, or changing caching attributes.
|
||||||
|
|
||||||
|
At runtime, ExectOS binds the appropriate function implementations to the MMPAGEMAP_ROUTINES structure based on the
|
||||||
|
selected paging level, while the MMPAGEMAP_INFO structure provides the necessary constants and offsets for correct
|
||||||
|
address translation.
|
||||||
|
|
||||||
|
This design allows us to maintain a single unified kernel image capable of running on CPUs with very different paging
|
||||||
|
capabilities. More importantly, it sets the stage for a future memory manager that will "just work" with any supported
|
||||||
|
paging level without requiring additional patches, recompilation, or feature flags.
|
||||||
|
|
||||||
|
## Performance Considerations
|
||||||
|
You might expect that introducing function pointers and dynamic dispatch could hurt performance, but in practice, the
|
||||||
|
overhead is negligible. The Strategy pattern affects only the rare moments when memory is being mapped or unmapped -
|
||||||
|
operations that are infrequent compared to ordinary memory access.
|
||||||
|
|
||||||
|
Once a virtual address is mapped, the CPU uses the hardware-managed Translation Lookaside Buffer (TLB) to cache
|
||||||
|
virtual-to-physical translations. Accessing mapped memory does not require any extra indirection through our structures.
|
||||||
|
The cost of an additional function pointer lookup occurs only during the setup phase of a mapping, which involves much
|
||||||
|
more expensive operations anyway - flushing TLB entries, updating PTEs, and invalidating caches. In other words, the
|
||||||
|
small dispatch cost is completely overshadowed by the inherent complexity of memory mapping itself.
|
||||||
|
|
||||||
|
In summary, the Strategy-based design gives us dynamic flexibility without sacrificing performance, even on systems with
|
||||||
|
tight CPU cycle budgets.
|
||||||
|
|
||||||
|
## Experimental LA57 Support
|
||||||
|
For AMD64, we have added experimental support for 5-level paging (PML5), which expands the virtual address space from
|
||||||
|
48-bits to 57-bits. To enable LA57, we implemented a small trampoline that temporarily switches the CPU into 32-bit
|
||||||
|
compatibility mode, sets the CR4.LA57 bit, and then returns to long mode with the new PML5 hierarchy active.
|
||||||
|
|
||||||
|
Because we currently lack access to real hardware supporting LA57, this functionality has been tested exclusively in
|
||||||
|
QEMU. While the implementation is complete and verified in a virtualized environment, we consider it experimental until
|
||||||
|
we can validate it on physical systems.
|
||||||
|
|
||||||
|
During development, we also addressed an issue related to the calculation of virtual-to-physical translation offsets
|
||||||
|
when working in 5-level paging mode. The constants defining the base virtual addresses for the page-table self-mapping
|
||||||
|
region were previously chosen in a way that, under certain conditions, could lead to address calculation overflows when
|
||||||
|
deriving the location of a Page Table Entry (PTE) from a given virtual address. We have corrected these base address
|
||||||
|
definitions, ensuring that the entire PML5 hierarchy is now computed safely and consistently across all supported paging
|
||||||
|
modes.
|
||||||
|
|
||||||
|
## Looking Ahead
|
||||||
|
With the new foundation in place, the next major milestone will be implementing the kernel memory manager. Alongside
|
||||||
|
this, we will continue refining the existing code through bug fixes, optimizations, and refactoring to ensure long-term
|
||||||
|
stability and maintainability.
|
Reference in New Issue
Block a user