#include "kernel/memory.hpp" #include "kapi/memory.hpp" #include "kapi/system.hpp" #include "kernel/memory/block_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(kstd::units::bytes, kstd::units::bytes) noexcept -> void * override { kstd::print(kstd::print_sink::stderr, "Tried to allocate memory without an active heap!"); return nullptr; } auto deallocate(void *) noexcept -> void override { kstd::print(kstd::print_sink::stderr, "Tried to deallocate memory without an active heap!"); } }; 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:MEM] The heap has already been initialized."); } auto & instance = basic_allocator.emplace(base); active_heap_allocator = &instance; kstd::println("[OS:MEM] Heap initialized. Dynamic memory available."); } } // namespace kernel::memory