SimpleKernel 1.17.0
Loading...
Searching...
No Matches
virtual_memory.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <cpu_io.h>
8#include <etl/singleton.h>
9
10#include <cstddef>
11#include <cstdint>
12
13#include "expected.hpp"
14
31 public:
37 auto InitCurrentCore() const -> void;
38
46 [[nodiscard]] auto MapMMIO(
47 uint64_t phys_addr, size_t size,
50
59 [[nodiscard]] auto MapPage(void* page_dir, void* virtual_addr,
60 void* physical_addr, uint32_t flags)
62
69 [[nodiscard]] auto UnmapPage(void* page_dir, void* virtual_addr)
71
78 [[nodiscard]] auto GetMapping(void* page_dir, void* virtual_addr)
80
87 auto DestroyPageDirectory(void* page_dir, bool free_pages = false) -> void;
88
97 [[nodiscard]] auto ClonePageDirectory(void* src_page_dir,
98 bool copy_mappings = true)
100
103
109 VirtualMemory(const VirtualMemory&) = delete;
111 auto operator=(const VirtualMemory&) -> VirtualMemory& = delete;
112 auto operator=(VirtualMemory&&) -> VirtualMemory& = default;
113 ~VirtualMemory() = default;
115
116 private:
117 void* kernel_page_dir_{nullptr};
118
119 static constexpr size_t kEntriesPerTable =
120 cpu_io::virtual_memory::kPageSize / sizeof(void*);
121
128 auto RecursiveFreePageTable(uint64_t* table, size_t level, bool free_pages)
129 -> void;
138 auto RecursiveClonePageTable(uint64_t* src_table, uint64_t* dst_table,
139 size_t level, bool copy_mappings)
141
149 [[nodiscard]] auto FindPageTableEntry(void* page_dir, void* virtual_addr,
150 bool allocate = false)
152};
153
154using VirtualMemorySingleton = etl::singleton<VirtualMemory>;
虚拟内存管理器(具体类,非抽象基类)
VirtualMemory()
构造函数
auto MapMMIO(uint64_t phys_addr, size_t size, uint32_t flags=cpu_io::virtual_memory::GetKernelPagePermissions()) -> Expected< void * >
映射设备内存 (MMIO)
auto DestroyPageDirectory(void *page_dir, bool free_pages=false) -> void
回收页表,释放所有映射和子页表
auto GetMapping(void *page_dir, void *virtual_addr) -> Expected< void * >
获取虚拟地址对应的物理地址映射
VirtualMemory(const VirtualMemory &)=delete
auto InitCurrentCore() const -> void
初始化当前核心的页表
auto operator=(VirtualMemory &&) -> VirtualMemory &=default
~VirtualMemory()=default
auto FindPageTableEntry(void *page_dir, void *virtual_addr, bool allocate=false) -> Expected< uint64_t * >
在页表中查找虚拟地址对应的页表项
auto operator=(const VirtualMemory &) -> VirtualMemory &=delete
auto RecursiveFreePageTable(uint64_t *table, size_t level, bool free_pages) -> void
递归释放页表
static constexpr size_t kEntriesPerTable
auto MapPage(void *page_dir, void *virtual_addr, void *physical_addr, uint32_t flags) -> Expected< void >
映射单个页面
auto RecursiveClonePageTable(uint64_t *src_table, uint64_t *dst_table, size_t level, bool copy_mappings) -> Expected< void >
递归复制页表
auto ClonePageDirectory(void *src_page_dir, bool copy_mappings=true) -> Expected< void * >
复制页表
VirtualMemory(VirtualMemory &&)=default
auto UnmapPage(void *page_dir, void *virtual_addr) -> Expected< void >
取消映射单个页面
std::expected< T, Error > Expected
std::expected 别名模板
Definition expected.hpp:365
static constexpr size_t kPageSize
Definition cpu_io.h:63
auto GetKernelPagePermissions(bool readable=true, bool writable=false, bool executable=false, bool global=false) -> uint64_t
Definition cpu_io.h:99
etl::singleton< VirtualMemory > VirtualMemorySingleton