From 64bf7fcf58ced023be1701ed4508e38f746d40b8 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 16 Mar 2026 08:34:13 +0100 Subject: kernel/memory: implement basic free-list heap --- kernel/src/memory.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 kernel/src/memory.cpp (limited to 'kernel/src/memory.cpp') diff --git a/kernel/src/memory.cpp b/kernel/src/memory.cpp new file mode 100644 index 0000000..14bedf1 --- /dev/null +++ b/kernel/src/memory.cpp @@ -0,0 +1,55 @@ +#include "kernel/memory.hpp" + +#include "kapi/memory.hpp" +#include "kapi/system.hpp" + +#include "kernel/memory/free_list_allocator.hpp" +#include "kernel/memory/heap_allocator.hpp" + +#include +#include +#include +#include + +namespace kernel::memory +{ + + namespace + { + struct null_allocator : heap_allocator + { + null_allocator static instance; + + [[nodiscard]] auto allocate(std::size_t, std::align_val_t) noexcept -> void * override + { + return nullptr; + } + + auto deallocate(void *) noexcept -> void override {} + }; + + constinit null_allocator null_allocator::instance{}; + + auto constinit active_heap_allocator = std::optional{&null_allocator::instance}; + auto constinit basic_allocator = std::optional{}; + } // namespace + + auto get_heap_allocator() -> heap_allocator & + { + return *active_heap_allocator.value(); + } + + auto init_heap(kapi::memory::linear_address base) -> void + { + auto static constinit is_initialized = std::atomic_flag{}; + + if (is_initialized.test_and_set()) + { + kapi::system::panic("[OS] The heap has already been initialized."); + } + + auto & instance = basic_allocator.emplace(base); + active_heap_allocator = &instance; + } + +} // namespace kernel::memory \ No newline at end of file -- cgit v1.2.3