aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/kapi/memory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/src/kapi/memory.cpp')
-rw-r--r--arch/x86_64/src/kapi/memory.cpp29
1 files changed, 24 insertions, 5 deletions
diff --git a/arch/x86_64/src/kapi/memory.cpp b/arch/x86_64/src/kapi/memory.cpp
index ed3edef..00b9de3 100644
--- a/arch/x86_64/src/kapi/memory.cpp
+++ b/arch/x86_64/src/kapi/memory.cpp
@@ -13,6 +13,7 @@
#include "x86_64/memory/page_table.hpp"
#include "x86_64/memory/page_utilities.hpp"
#include "x86_64/memory/paging_root.hpp"
+#include "x86_64/memory/recursive_page_mapper.hpp"
#include "x86_64/memory/region_allocator.hpp"
#include "x86_64/memory/scoped_mapping.hpp"
@@ -29,6 +30,8 @@ namespace teachos::memory
{
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
auto constinit allocator = static_cast<frame_allocator *>(nullptr);
+ // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
+ auto constinit mapper = static_cast<page_mapper *>(nullptr);
constexpr auto static unused_page_address = linear_address{0x0000'7fff'cafe'faceuz};
constexpr auto static recursive_page_map_index = x86_64::page_table::entry_count - 2;
@@ -70,7 +73,7 @@ namespace teachos::memory
auto page = page::containing(unused_page_address);
- auto temporary_mapper = scoped_mapping{page, allocator};
+ auto temporary_mapper = scoped_mapping{page};
auto new_pml4_frame = allocator.allocate();
auto pml4 = std::construct_at(temporary_mapper.map_as<page_table>(*new_pml4_frame, entry_flags::writable));
@@ -124,6 +127,15 @@ namespace teachos::memory
return *allocator;
}
+ auto active_mapper() -> page_mapper &
+ {
+ if (!mapper)
+ {
+ system::panic("[x86_64] The page mapper has not been set you.");
+ }
+ return *mapper;
+ }
+
auto init() -> void
{
auto static constinit is_initialized = std::atomic_flag{};
@@ -132,14 +144,19 @@ namespace teachos::memory
system::panic("[x86_64] Memory management has already been initialized.");
}
- auto allocator = create_early_frame_allocator();
enable_cpu_protections();
- auto allocation_buffer = x86_64::buffered_allocator<4>{&allocator};
+ auto early_allocator = create_early_frame_allocator();
+ auto allocation_buffer = x86_64::buffered_allocator<4>{&early_allocator};
+ allocator = &allocation_buffer;
+
+ auto recursive_mapper = x86_64::recursive_page_mapper{allocation_buffer};
+ mapper = &recursive_mapper;
+
auto new_pml4_frame = inject_faux_pml4(allocation_buffer);
- auto mapper = x86_64::kernel_mapper{allocation_buffer, boot::bootstrap_information.mbi};
- mapper.remap_kernel();
+ auto kernel_mapper = x86_64::kernel_mapper{boot::bootstrap_information.mbi};
+ kernel_mapper.remap_kernel();
cio::println("[x86_64:MEM] prepared new kernel image page maps.");
auto cr3 = cpu::x86_64::cr3::read();
@@ -149,6 +166,8 @@ namespace teachos::memory
// remap_heap(heap::KERNEL_HEAP_START, heap::KERNEL_HEAP_SIZE);
// video::vga::text::write("Heap remapping successful", video::vga::text::common_attributes::green_on_black);
// video::vga::text::newline();
+ mapper = nullptr;
+ allocator = nullptr;
}
} // namespace teachos::memory