8#include <etl/singleton.h>
47 uint64_t phys_addr,
size_t size,
59 [[nodiscard]]
auto MapPage(
void* page_dir,
void* virtual_addr,
60 void* physical_addr, uint32_t flags)
69 [[nodiscard]]
auto UnmapPage(
void* page_dir,
void* virtual_addr)
78 [[nodiscard]]
auto GetMapping(
void* page_dir,
void* virtual_addr)
98 bool copy_mappings =
true)
139 size_t level,
bool copy_mappings)
150 bool allocate =
false)
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
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 别名模板
static constexpr size_t kPageSize
auto GetKernelPagePermissions(bool readable=true, bool writable=false, bool executable=false, bool global=false) -> uint64_t
etl::singleton< VirtualMemory > VirtualMemorySingleton