diff --git a/src/kernel/allocator.cpp b/src/kernel/allocator.cpp deleted file mode 100644 index c670b70..0000000 --- a/src/kernel/allocator.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "kutil/memory_manager.h" -#include "log.h" - -kutil::memory_manager g_kernel_memory_manager; - -// kutil malloc/free implementation -namespace kutil { - -void * -malloc(size_t n) { - void *p = g_kernel_memory_manager.allocate(n); - log::debug(logs::memory, "Heap allocated %ld bytes: %016lx", n, p); - return p; -} - -void free(void *p) { g_kernel_memory_manager.free(p); } - -} diff --git a/src/kernel/page_manager.cpp b/src/kernel/page_manager.cpp index e66273f..d9e386f 100644 --- a/src/kernel/page_manager.cpp +++ b/src/kernel/page_manager.cpp @@ -7,6 +7,7 @@ #include "page_manager.h" page_manager g_page_manager; +kutil::memory_manager g_kernel_memory_manager; static addr_t @@ -215,10 +216,10 @@ page_manager::init( } } - extern kutil::memory_manager g_kernel_memory_manager; new (&g_kernel_memory_manager) kutil::memory_manager( reinterpret_cast(end), mm_grow_callback); + kutil::setup::set_heap(&g_kernel_memory_manager); m_kernel_pml4 = get_pml4(); } diff --git a/src/libraries/kutil/memory.cpp b/src/libraries/kutil/memory.cpp index 7a48a20..7962573 100644 --- a/src/libraries/kutil/memory.cpp +++ b/src/libraries/kutil/memory.cpp @@ -1,4 +1,5 @@ #include "memory.h" +#include "memory_manager.h" void * operator new (size_t, void *p) noexcept { return p; } void * operator new (size_t n) { return kutil::malloc(n); } @@ -8,6 +9,32 @@ void operator delete[] (void *p) noexcept { return kutil::free(p); } namespace kutil { +namespace setup { + +static memory_manager *heap_memory_manager; + +void +set_heap(memory_manager *mm) +{ + setup::heap_memory_manager = mm; +} + +} // namespace kutil::setup + + +void * +malloc(size_t n) +{ + return setup::heap_memory_manager->allocate(n); +} + +void +free(void *p) +{ + setup::heap_memory_manager->free(p); +} + + void * memset(void *s, uint8_t v, size_t n) { diff --git a/src/libraries/kutil/memory.h b/src/libraries/kutil/memory.h index 67d37ea..101c89a 100644 --- a/src/libraries/kutil/memory.h +++ b/src/libraries/kutil/memory.h @@ -11,15 +11,12 @@ void * operator new (size_t, void *p) noexcept; namespace kutil { -/// Allocate memory. Note: this needs to be implemented -/// by the kernel, or other program using this library. +/// Allocate memory. /// \arg n The number of bytes to allocate /// \returns The allocated memory void * malloc(size_t n); -/// Free memory allocated by malloc(). Note: this needs -/// to be implemented by the kernel, or other program -/// using this library. +/// Free memory allocated by malloc(). /// \arg p A pointer previously returned by malloc() void free(void *p); @@ -72,4 +69,14 @@ inline T* mask_pointer(T *p, addr_t mask) /// \arg off An optional offset into the region uint8_t checksum(const void *p, size_t len, size_t off = 0); + +class memory_manager; + +namespace setup { + +/// Set the heap that malloc() / free() will use. +/// \arg mm The heap manager for the heap to use. +void set_heap(memory_manager *mm); + +} // namespace kutil::setup } // namespace kutil