Virtual memory management
include/mem/vmm.h View source View on GitHubStructs
Section titled “Structs”vmm_request
Section titled “vmm_request” struct vmm_request (4 fields) source
e.g. vmm_map_page(virt, phys, .page_flags = PAGE_PRESENT | PAGE_WRITE, .page_size = VMM_MAP_PAGE_SIZE_2MB); vmm_api_internal.h has the defaults
page_flags_t page_flags enum vmm_map_page_size page_size vmm_map_request
Section titled “vmm_map_request” struct vmm_map_request (6 fields) source
map/unmap page full get these, everyone else uses it to call into it, wrappers automatically build these, everything’s hunky dory!
struct page_table *pml4 size_t len struct vmm_request rq bool is_unmap_internal Internal flags
vmm_map_page_size
Section titled “vmm_map_page_size” enum vmm_map_page_size : uint8_t (3 variants) source
vmm_flags
Section titled “vmm_flags” enum vmm_flags : uint64_t (5 variants) source
Big bitmap set that is embedded in vmm_request
VMM_FLAG_NONE = 0 VMM_FLAG_USER = 1 << 1 VMM_FLAG_MODIFY_LEAF = 1 << 2 This flag exists since certain calls simply serve to modify the leaf (e.g. faulting on a demand page and mapping in the physical frame)
By default, we panic if the leaf is modified, and this flag says “don’t panic, I know what I’m doing”
VMM_FLAG_CLEAR_LEAF = 1 << 3 Clear all the data (besides the lock bit, transiently), zeroing out the leaf
VMM_FLAG_HANDLE_PTE_EXISTING = 1 << 4 Will return ERR_EXIST when used in conjunction with MODIFY_LEAF and PRESENT is seen on the leaf PTE
Functions
Section titled “Functions”vmm_init
Section titled “vmm_init”void vmm_init(
struct limine_memmap_response *memmap,
struct limine_executable_address_response *xa
) source vmm_phys_is_kernel_text
Section titled “vmm_phys_is_kernel_text”vmm_map_aliased_full
Section titled “vmm_map_aliased_full”enum err vmm_map_aliased_full(
vaddr_t virt,
size_t len,
paddr_t phys,
struct vmm_request rq
) source vmm_unshare_path_full
Section titled “vmm_unshare_path_full”enum err vmm_unshare_path_full(vaddr_t virt, struct vmm_request rq) source vmm_map_page_full
Section titled “vmm_map_page_full”enum err vmm_map_page_full(
vaddr_t virt,
paddr_t phys,
struct vmm_request rq
) source vmm_map_page_user_full
Section titled “vmm_map_page_user_full”enum err vmm_map_page_user_full(
struct page_table *pml4,
vaddr_t virt,
paddr_t phys,
struct vmm_request rq
) source vmm_unmap_page_full
Section titled “vmm_unmap_page_full”void vmm_unmap_page_full(vaddr_t virt, struct vmm_request rq) source vmm_mark_demand_page_full
Section titled “vmm_mark_demand_page_full”enum err vmm_mark_demand_page_full(
vaddr_t virt,
enum demand_page_flags flags,
struct vmm_request rq
) source vmm_mark_demand_page_user_full
Section titled “vmm_mark_demand_page_user_full”enum err vmm_mark_demand_page_user_full(
struct page_table *pml4,
vaddr_t virt,
enum demand_page_flags flags,
struct vmm_request rq
) source vmm_map_demand_page_full
Section titled “vmm_map_demand_page_full”enum err vmm_map_demand_page_full(
vaddr_t virt,
paddr_t phys,
enum demand_page_flags flags,
struct vmm_request rq
) source vmm_get_phys_full
Section titled “vmm_get_phys_full”paddr_t vmm_get_phys_full(vaddr_t virt, struct vmm_request rq) source vmm_get_leaf_pte_full
Section titled “vmm_get_leaf_pte_full”pte_t vmm_get_leaf_pte_full(vaddr_t virt, struct vmm_request rq) source vmm_unmap_full
Section titled “vmm_unmap_full”void vmm_unmap_full(void *addr, uint64_t len, struct vmm_request rq) source vmm_map_full
Section titled “vmm_map_full”void * vmm_map_full(
paddr_t paddr,
vaddr_t vaddr,
uint64_t len,
struct vmm_request rq
) source vmm_map_bump_full
Section titled “vmm_map_bump_full”void * vmm_map_bump_full(
uint64_t addr,
uint64_t len,
struct vmm_request rq
) source vmm_make_user_pml4
Section titled “vmm_make_user_pml4”uintptr_t vmm_make_user_pml4(void) source vmm_unmap_all_user_pages_full
Section titled “vmm_unmap_all_user_pages_full”void vmm_unmap_all_user_pages_full(
struct page_table *pml4,
struct vmm_request rq
) source vmm_reclaim_page_tables
Section titled “vmm_reclaim_page_tables”void vmm_reclaim_page_tables(void) source vmm_phys_to_pml4
Section titled “vmm_phys_to_pml4”struct page_table * vmm_phys_to_pml4(paddr_t paddr) source