diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-04-01 11:12:20 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-04-01 11:12:20 +0200 |
| commit | 419f4bebff5745b46bf30092dc7a7ca43449ea2e (patch) | |
| tree | 4b509ca6da26eeadaec193440c936954e4367f4e /kernel/tests/kapi | |
| parent | c30ba8bc8c1cf80a7e9b46e9f1a66dc1b409fcbd (diff) | |
| download | teachos-419f4bebff5745b46bf30092dc7a7ca43449ea2e.tar.xz teachos-419f4bebff5745b46bf30092dc7a7ca43449ea2e.zip | |
kernel/tests: implement basic simulated memory
Diffstat (limited to 'kernel/tests/kapi')
| -rw-r--r-- | kernel/tests/kapi/memory.cpp | 77 |
1 files changed, 76 insertions, 1 deletions
diff --git a/kernel/tests/kapi/memory.cpp b/kernel/tests/kapi/memory.cpp index 4482c74..6de2f60 100644 --- a/kernel/tests/kapi/memory.cpp +++ b/kernel/tests/kapi/memory.cpp @@ -1,11 +1,86 @@ +#include "kapi/memory.hpp" + #include <kapi/memory.hpp> +#include "kernel/tests/simulated_memory.hpp" + +#include <kstd/print> +#include <kstd/units> + +#include <cstddef> +#include <cstdint> +#include <optional> +#include <utility> + namespace kapi::memory { + namespace + { + //! The size of the simulated RAM. + constexpr auto simulate_memory_size = kstd::units::MiB(32); + + struct test_boostrap_frame_allocator : frame_allocator + { + auto mark_used(frame) -> void override {} + + auto allocate_many(std::size_t count) noexcept -> std::optional<std::pair<frame, std::size_t>> override + { + auto start = next_free_frame; + next_free_frame += count; + return std::pair{frame{start}, count}; + } + + auto release_many(std::pair<frame, std::size_t>) -> void override {} + + std::size_t next_free_frame{}; + } boostrap_allocator; + + struct test_page_mapper : page_mapper + { + auto map(page page, frame frame, flags flags) -> std::byte * override + { + kstd::println("mapping page {} onto frame {} with flags {}", page.number(), frame.number(), + static_cast<std::uint64_t>(flags)); + + if ((page.start_address() & pmm_metadata_base.raw()) == pmm_metadata_base.raw()) + { + auto offset = page.start_address() & ~pmm_metadata_base.raw(); + return kernel::tests::simulated_memory::pmm_metadata_base() + offset; + } + + return nullptr; + } + + auto unmap(page page) -> void override + { + kstd::println("unmapping page {}", page.number()); + } + + auto try_unmap(page page) noexcept -> bool override + { + kstd::println("trying to unmap page {}", page.number()); + return false; + } + } test_mapper; + + auto handoff_to_kernel_pmm(frame_allocator & new_allocator) -> void + { + for (auto i = 0uz; i < boostrap_allocator.next_free_frame; ++i) + { + new_allocator.mark_used(frame{i}); + } + } + + } // namespace + auto init() -> void { - // TODO: initialize simulated memory. + kernel::tests::simulated_memory::init(simulate_memory_size); + set_frame_allocator(boostrap_allocator); + set_page_mapper(test_mapper); + + init_pmm(simulate_memory_size / frame::size, handoff_to_kernel_pmm); } } // namespace kapi::memory
\ No newline at end of file |
