diff options
Diffstat (limited to 'arch/x86_64/include')
| -rw-r--r-- | arch/x86_64/include/arch/memory/paging/page_mapper.hpp | 30 | ||||
| -rw-r--r-- | arch/x86_64/include/arch/memory/paging/virtual_page.hpp | 51 |
2 files changed, 30 insertions, 51 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 new file mode 100644 index 0000000..b151a7f --- /dev/null +++ b/arch/x86_64/include/arch/memory/paging/page_mapper.hpp @@ -0,0 +1,30 @@ +#ifndef TEACHOS_ARCH_X86_64_MEMORY_PAGING_PAGE_MAPPER_HPP +#define TEACHOS_ARCH_X86_64_MEMORY_PAGING_PAGE_MAPPER_HPP + +#include "arch/memory/paging/virtual_page.hpp" + +#include <optional> + +namespace teachos::arch::memory::paging +{ + /** + * @brief Translate page into physical_frame + * + * @param page Page to translate into physical_frame + * @return Physical frame corresponding to the provided page_table + */ + auto translate_page(virtual_page page) -> std::optional<allocator::physical_frame>; + + /** + * @brief Translate virtual into phyical address + * + * @param virtual_address Address to translate into physical + * @return Physical address + */ + auto translate_address(std::size_t virtual_address) -> std::optional<std::size_t>; + + auto map_page_to_frame(memory::allocator::area_frame_allocator & allocator, const Page & page, const Frame & frame, + EntryFlags flags) -> void; +} // namespace teachos::arch::memory::paging + +#endif
\ No newline at end of file diff --git a/arch/x86_64/include/arch/memory/paging/virtual_page.hpp b/arch/x86_64/include/arch/memory/paging/virtual_page.hpp index 705de29..6b9a641 100644 --- a/arch/x86_64/include/arch/memory/paging/virtual_page.hpp +++ b/arch/x86_64/include/arch/memory/paging/virtual_page.hpp @@ -58,57 +58,6 @@ namespace teachos::arch::memory::paging std::size_t page_number; ///< Index number of the current virtual page, used to distinguish it from other pages. }; - /** - * @brief Translate page into physical_frame - * - * @param page Page to translate into physical_frame - * @return Physical frame corresponding to the provided page_table - */ - auto translate_page(virtual_page page) -> std::optional<allocator::physical_frame> - { - page_table page_table{}; - bool is_valid = false; - auto huge_page = []() -> std::optional<allocator::physical_frame> { 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) - { - auto level1_index = page.get_level_index(page_table::LEVEL1); - auto frame = page_table[level1_index].calculate_pointed_to_frame(); - return frame; - } - - return huge_page(); - } - - /** - * @brief Translate virtual into phyical address - * - * @param virtual_address Address to translate into physical - * @return Physical address - */ - auto translate_address(std::size_t virtual_address) -> std::optional<std::size_t> - { - std::size_t offset = virtual_address % allocator::PAGE_FRAME_SIZE; - virtual_page page = virtual_page::containing_address(virtual_address); - std::optional<allocator::physical_frame> frame = translate_page(page); - - if (frame.has_value()) - { - return frame.value().frame_number * allocator::PAGE_FRAME_SIZE + offset; - } - - return std::nullopt; - } - } // namespace teachos::arch::memory::paging #endif // TEACHOS_ARCH_X86_64_MEMORY_PAGING_VIRTUAL_PAGE_HPP |
