diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/x86_64/include/arch/memory/paging/page_mapper.hpp | 11 | ||||
| -rw-r--r-- | arch/x86_64/src/memory/paging/page_mapper.cpp | 55 |
2 files changed, 28 insertions, 38 deletions
diff --git a/arch/x86_64/include/arch/memory/paging/page_mapper.hpp b/arch/x86_64/include/arch/memory/paging/page_mapper.hpp index fcaba26..5960aaf 100644 --- a/arch/x86_64/include/arch/memory/paging/page_mapper.hpp +++ b/arch/x86_64/include/arch/memory/paging/page_mapper.hpp @@ -1,6 +1,7 @@ #ifndef TEACHOS_ARCH_X86_64_MEMORY_PAGING_PAGE_MAPPER_HPP #define TEACHOS_ARCH_X86_64_MEMORY_PAGING_PAGE_MAPPER_HPP +#include "arch/memory/allocator/area_frame_allocator.hpp" #include "arch/memory/paging/virtual_page.hpp" #include <optional> @@ -32,8 +33,16 @@ namespace teachos::arch::memory::paging */ auto translate_address(std::size_t virtual_address) -> std::optional<std::size_t>; + /** + * @brief TODO + * + * @param allocator + * @param page + * @param frame + * @param flags + */ auto map_page_to_frame(memory::allocator::area_frame_allocator & allocator, const virtual_page & page, - const memory::allocator::physical_frame & frame, entry::bitset flags) -> void + const memory::allocator::physical_frame & frame, entry::bitset flags) -> void; } // namespace teachos::arch::memory::paging #endif
\ No newline at end of file diff --git a/arch/x86_64/src/memory/paging/page_mapper.cpp b/arch/x86_64/src/memory/paging/page_mapper.cpp index 32567be..ec1d5d5 100644 --- a/arch/x86_64/src/memory/paging/page_mapper.cpp +++ b/arch/x86_64/src/memory/paging/page_mapper.cpp @@ -1,33 +1,9 @@ #include "arch/memory/paging/page_mapper.hpp" #include "arch/exception_handling/assert.hpp" -#include "arch/memory/allocator/area_frame_allocator.hpp" namespace teachos::arch::memory::paging { - auto generate_page_table(virtual_page page) -> page_table * - { - page_table page_table{}; - bool is_valid = false; - auto huge_page = []() -> arch::memory::paging::page_table { return std::nullopt; }; - - for (auto level = page_table::LEVEL4; level != page_table::LEVEL1; level--) - { - is_valid = page_table.next_table(page.get_level_index(level)); - if (!is_valid) - { - break; - } - } - - if (is_valid) - { - return &page_table; - } - - return &huge_page(); - } - auto translate_page(virtual_page page) -> std::optional<allocator::physical_frame> { page_table page_table{}; @@ -104,21 +80,26 @@ namespace teachos::arch::memory::paging auto map_page_to_frame(memory::allocator::area_frame_allocator & allocator, const virtual_page & page, const memory::allocator::physical_frame & frame, entry::bitset flags) -> void { - std::optional<allocator::physical_frame> frame = - - page_table page_table{}; - - bool is_valid = page_table.next_table(page_table::LEVEL3); - page_table = page_table.next_table(page_table::LEVEL2); - page_table = page_table.next_table(page_table::LEVEL1); + page_table page_table{}; + bool is_valid = false; - auto p3 = p4->next_table_create(page.p4_index(), allocator); - auto p2 = p3->next_table_create(page.p3_index(), allocator); - auto p1 = p2->next_table_create(page.p2_index(), allocator); + for (auto level = page_table::LEVEL4; level != page_table::LEVEL1; level--) + { + std::size_t level_index = page.get_level_index(level); + is_valid = page_table.next_table(level_index); + page_table[level_index].set_entry(frame, entry::PRESENT | entry::WRITABLE); + page_table.zero_entries(); - page_table::level level1_index{page.get_level_index(page_table::LEVEL1)}; - arch::exception_handling::assert(p1[level1_index].is_unused(), ""); + if (!is_valid) + { + break; + } + } - p1[page.p1_index()].set(frame, flags | entry::bitset::PRESENT); + entry page_table_entry = page_table[page.get_level_index(page_table::LEVEL1)]; + arch::exception_handling::assert(!page_table_entry.contains_flags(entry::HUGE_PAGE), + "[Page Mapper]: Unable to map huge pages"); + arch::exception_handling::assert(!page_table_entry.is_unused(), "[Page Mapper]: Page table entry is already used"); + page_table_entry.set_entry(frame, flags | entry::PRESENT); } } // namespace teachos::arch::memory::paging
\ No newline at end of file |
