From 834c63a77cd17d20bd2d3b994c61290bc14ca6c2 Mon Sep 17 00:00:00 2001 From: Natasha Moongrave Date: Mon, 30 Mar 2026 11:07:21 +0200 Subject: created src/memory.rs for helping keep track of physical and virtual memory --- StrixKernel/src/memory.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 StrixKernel/src/memory.rs diff --git a/StrixKernel/src/memory.rs b/StrixKernel/src/memory.rs new file mode 100644 index 0000000..2493815 --- /dev/null +++ b/StrixKernel/src/memory.rs @@ -0,0 +1,24 @@ +use x86_64::{ + structures::paging::PageTable, + VirtAddr, +}; + +/// Returns a mutable reference to the active level 4 table. +/// +/// This function is unsafe because the caller must guarantee that the +/// complete physical memory is mapped to virtual memory at the passed +/// `physical_memory_offset`. Also, this function must be only called once +/// to avoid aliasing `&mut` references (which is undefined behavior). +pub unsafe fn active_level_4_table(physical_memory_offset: VirtAddr) + -> &'static mut PageTable +{ + use x86_64::registers::control::Cr3; + + let (level_4_table_frame, _) = Cr3::read(); + + let phys = level_4_table_frame.start_address(); + let virt = physical_memory_offset + phys.as_u64(); + let page_table_ptr: *mut PageTable = virt.as_mut_ptr(); + + unsafe { &mut *page_table_ptr } +} -- cgit v1.2.3