aboutsummaryrefslogtreecommitdiff
path: root/arch/x86_64/src/memory.cpp
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-07-17 21:09:02 +0000
committerFelix Morgner <felix.morgner@ost.ch>2025-07-18 13:02:34 +0200
commit14ed096fc5de6844cb116f3319c0d03043d26ea2 (patch)
treee78cc753b2d6dcabd703aebc4b9bea1783cc2e6d /arch/x86_64/src/memory.cpp
parent891ca8834122e55638d33a129baab7292b8ed6d0 (diff)
downloadteachos-14ed096fc5de6844cb116f3319c0d03043d26ea2.tar.xz
teachos-14ed096fc5de6844cb116f3319c0d03043d26ea2.zip
x86-64: prepare new architecture
Diffstat (limited to 'arch/x86_64/src/memory.cpp')
-rw-r--r--arch/x86_64/src/memory.cpp90
1 files changed, 41 insertions, 49 deletions
diff --git a/arch/x86_64/src/memory.cpp b/arch/x86_64/src/memory.cpp
index 245d7bd..2b16beb 100644
--- a/arch/x86_64/src/memory.cpp
+++ b/arch/x86_64/src/memory.cpp
@@ -1,62 +1,54 @@
#include "arch/memory.hpp"
-// #include "noarch/error.hpp"
-// #include "noarch/print.hpp"
-// #include "x86_64/bootstrap/mutiboot.hpp"
-// #include "x86_64/memory/frame_allocator.hpp"
-// #include "x86_64/memory/mbi_frame_allocator.hpp"
+#include "kern/error.hpp"
-// #include <elf/constants.hpp>
-// #include <elf/section_header.hpp>
-// #include <elf/section_header_table.hpp>
-// #include <multiboot2/information.hpp>
+#include "arch/asm_pointer.hpp"
+#include "x86_64/memory/region_allocator.hpp"
-namespace teachos::arch::memory
-{
+#include <multiboot2/information.hpp>
- // namespace
- // {
- // /**
- // * @brief Remap the kernel according to the ELF information.
- // *
- // * After initial bootup, a basic identity mapping of the lower 1GiB is set up. This mapping allows execution
- // from,
- // * as well as read and write access to, the mapped memory. In order to protect the kernel, remap it according to
- // the
- // * information supplied by the ELF file. This means remapping code sections as read-only and data sections as
- // * no-execute (and read only for .rodata).
- // *
- // * @param sections Information about the sections in the loaded kernel binary.
- // * @param allocator The frame allocator used to create new page mappings.
- // */
- // auto remap_kernel(elf::section_header_table const & sections, x86_64::memory::frame_allocator & allocator) ->
- // void
- // {
- // static_cast<void>(sections);
- // static_cast<void>(allocator);
- // }
- // } // namespace
+#include <atomic>
- auto init() -> void
- {
- // kernel::println("Initializing memory");
+extern "C" teachos::arch::asm_pointer<multiboot2::information_view> multiboot_information_pointer;
- // if (!x86_64::bootstrap::multiboot_information_pointer->has<multiboot2::memory_map>())
- // {
- // kernel::panic("Received no memory map from the boot loader!");
- // }
+namespace teachos::arch::memory
+{
+ namespace
+ {
+ auto constinit is_initialized = std::atomic_flag{};
- // if (!x86_64::bootstrap::multiboot_information_pointer->has<multiboot2::elf_symbols>())
- // {
- // kernel::panic("Received no ELF symbol information from the boot loader!");
- // }
+ // auto create_memory_information() -> x86_64::memory::region_allocator::memory_information {
- // auto memory_map = x86_64::bootstrap::multiboot_information_pointer->memory_map();
- // auto elf_symbols = x86_64::bootstrap::multiboot_information_pointer->elf_symbols();
- // auto section_header_table = elf::section_header_table{elf_symbols.data(), elf::file_class::bits_64};
- // auto allocator = x86_64::memory::mbi_frame_allocator{memory_map, section_header_table};
+ // };
+ } // namespace
- // remap_kernel(section_header_table, allocator);
+ auto init() -> void
+ {
+ if (is_initialized.test_and_set())
+ {
+ teachos::panic("[x86_64] Memory management has already been initialized.");
+ }
+
+ auto memory_map = multiboot_information_pointer->maybe_memory_map();
+ if (!memory_map)
+ {
+ teachos::panic("[x86_64] No memory map available.");
+ }
+
+ // auto mem_info = x86_64::memory::region_allocator::memory_information{};
+ // auto allocator = x86_64::memory::region_allocator{mem_info};
+
+ // kernel::cpu::set_cr0_bit(kernel::cpu::cr0_flags::WRITE_PROTECT);
+ // kernel::cpu::set_efer_bit(kernel::cpu::efer_flags::NXE);
+
+ // paging::kernel_mapper kernel(allocator, memory_information);
+ // kernel.remap_kernel();
+ // video::vga::text::write("Kernel remapping successful", video::vga::text::common_attributes::green_on_black);
+ // video::vga::text::newline();
+
+ // 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();
}
} // namespace teachos::arch::memory