aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2025-12-02 19:17:42 +0100
committerFelix Morgner <felix.morgner@ost.ch>2025-12-02 19:17:42 +0100
commit148c54a3d470c6019ebebe1387a7d889a2b8808e (patch)
tree1e280a328ab210816e480161ca19ca2ab4bb4025 /arch
parent588fe1a3600475bdc312a4fe758d2f1125eb149c (diff)
downloadteachos-148c54a3d470c6019ebebe1387a7d889a2b8808e.tar.xz
teachos-148c54a3d470c6019ebebe1387a7d889a2b8808e.zip
x86_64/memory: introduce frame allocation buffer
Diffstat (limited to 'arch')
-rw-r--r--arch/x86_64/CMakeLists.txt2
-rw-r--r--arch/x86_64/include/x86_64/memory/buffered_allocator.hpp67
-rw-r--r--arch/x86_64/src/kapi/memory.cpp5
3 files changed, 72 insertions, 2 deletions
diff --git a/arch/x86_64/CMakeLists.txt b/arch/x86_64/CMakeLists.txt
index 4d984cf..7f01744 100644
--- a/arch/x86_64/CMakeLists.txt
+++ b/arch/x86_64/CMakeLists.txt
@@ -35,7 +35,7 @@ target_sources("x86_64" PRIVATE
file(GLOB_RECURSE ARCH_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "include/**.hpp")
-target_sources("x86_64" PRIVATE
+target_sources("x86_64" PUBLIC
FILE_SET HEADERS
BASE_DIRS "include"
FILES ${ARCH_HEADERS}
diff --git a/arch/x86_64/include/x86_64/memory/buffered_allocator.hpp b/arch/x86_64/include/x86_64/memory/buffered_allocator.hpp
new file mode 100644
index 0000000..2d05010
--- /dev/null
+++ b/arch/x86_64/include/x86_64/memory/buffered_allocator.hpp
@@ -0,0 +1,67 @@
+#ifndef TEACHOS_X86_64_BUFFERED_ALLOCATOR_HPP
+#define TEACHOS_X86_64_BUFFERED_ALLOCATOR_HPP
+
+#include "kapi/memory.hpp"
+
+#include <algorithm>
+#include <array>
+#include <cstddef>
+
+namespace teachos::memory::x86_64
+{
+
+ template<std::size_t BufferSize>
+ struct buffered_allocator : frame_allocator
+ {
+ explicit buffered_allocator(frame_allocator * underlying)
+ : m_underlying{underlying}
+ {
+ std::ranges::generate(m_pool, [this] { return m_underlying->allocate(); });
+ }
+
+ buffered_allocator(buffered_allocator const &) = delete;
+ buffered_allocator(buffered_allocator &&) = default;
+
+ ~buffered_allocator() override
+ {
+ std::ranges::for_each(m_pool, [this](auto const & maybe_frame) {
+ if (maybe_frame)
+ {
+ m_underlying->release(*maybe_frame);
+ }
+ });
+ }
+
+ auto operator=(buffered_allocator const &) = delete;
+ auto operator=(buffered_allocator &&) = delete;
+
+ auto allocate() -> std::optional<frame> override
+ {
+ auto found = std::ranges::find_if(m_pool, [](auto const & candidate) { return candidate.has_value(); });
+ if (found == std::end(m_pool))
+ {
+ return m_underlying->allocate();
+ }
+ auto frame = found->value();
+ found->reset();
+ return frame;
+ }
+
+ auto release(frame frame) -> void override
+ {
+ auto found = std::ranges::find_if(m_pool, [](auto const & candidate) { return !candidate; });
+ if (found == std::end(m_pool))
+ {
+ return m_underlying->release(frame);
+ }
+ (*found) = frame;
+ }
+
+ private:
+ frame_allocator * m_underlying;
+ std::array<std::optional<frame>, BufferSize> m_pool{};
+ };
+
+} // namespace teachos::memory::x86_64
+
+#endif \ No newline at end of file
diff --git a/arch/x86_64/src/kapi/memory.cpp b/arch/x86_64/src/kapi/memory.cpp
index e138641..703b3e1 100644
--- a/arch/x86_64/src/kapi/memory.cpp
+++ b/arch/x86_64/src/kapi/memory.cpp
@@ -5,6 +5,7 @@
#include "x86_64/boot/boot.hpp"
#include "x86_64/boot/ld.hpp"
#include "x86_64/cpu/registers.hpp"
+#include "x86_64/memory/buffered_allocator.hpp"
#include "x86_64/memory/mmu.hpp"
#include "x86_64/memory/page_table.hpp"
#include "x86_64/memory/paging_root.hpp"
@@ -95,7 +96,9 @@ namespace teachos::memory
auto allocator = create_early_frame_allocator();
enable_cpu_protections();
- inject_faux_pml4(allocator);
+
+ auto allocation_buffer = x86_64::buffered_allocator<4>{&allocator};
+ inject_faux_pml4(allocation_buffer);
// paging::kernel_mapper kernel(allocator, memory_information);
// kernel.remap_kernel();