Memory Descriptor
include/mem/mm.h View source View on GitHubStructs
Section titled “Structs”mm_context
Section titled “mm_context” struct mm_context (3 fields) source
struct mm (7 fields) source
§
refcount_t users threads sharing this address space
§
refcount_t refcount keep the struct alive past last user
mm_map_flags
Section titled “mm_map_flags”mm_fault_flags
Section titled “mm_fault_flags” enum mm_fault_flags (3 variants) source
mm_fault_result
Section titled “mm_fault_result” enum mm_fault_result (4 variants) source
Functions
Section titled “Functions”mm_alloc
Section titled “mm_alloc”mm_free
Section titled “mm_free”mm_fork
Section titled “mm_fork”mm_exit
Section titled “mm_exit”exit_mmap: unmap + tear down every VMA, but leave the struct/pml4 standing
mm_vma_range_insert
Section titled “mm_vma_range_insert”mm_vma_range_remove
Section titled “mm_vma_range_remove”mm_vma_range_find
Section titled “mm_vma_range_find”mm_vma_range_find_intersection
Section titled “mm_vma_range_find_intersection”mm_vma_range_find_gap
Section titled “mm_vma_range_find_gap”vaddr_t mm_vma_range_find_gap(
struct mm *mm,
size_t len,
size_t align,
vaddr_t low,
vaddr_t high
) source lowest gap >= len in [low, high)
mm_map
Section titled “mm_map”vaddr_t mm_map(
struct mm *mm,
vaddr_t hint,
size_t len,
enum vma_range_protection prot,
enum mm_map_flags flags
) source find a gap (or honor a hint), build a vma_range, insert
mm_unmap
Section titled “mm_unmap”tear down [start, start+len): split VMAs at the boundaries, unmap their PTEs, drop rmap, free/trim the VMAs
mm_protect
Section titled “mm_protect”enum err mm_protect(
struct mm *mm,
vaddr_t start,
size_t len,
enum vma_range_protection prot
) source change protection over a range: split at boundaries, vma_range_set_prot each, re-protect the live PTEs
mm_pgtable_init
Section titled “mm_pgtable_init”vmm_make_user_pml4() -> mm->pml4
mm_pgtable_free
Section titled “mm_pgtable_free”mm_activate
Section titled “mm_activate”mm_map_page
Section titled “mm_map_page”mm_unmap_page
Section titled “mm_unmap_page”mm_query
Section titled “mm_query”mm_fault
Section titled “mm_fault”enum mm_fault_result mm_fault(
struct mm *mm,
vaddr_t addr,
enum mm_fault_flags flags
) source mm_do_anon_fault
Section titled “mm_do_anon_fault”enum mm_fault_result mm_do_anon_fault(
struct vma_range *vma_range,
vaddr_t addr,
enum mm_fault_flags
) source mm_do_cow_fault
Section titled “mm_do_cow_fault”enum mm_fault_result mm_do_cow_fault(
struct vma_range *vma_range,
vaddr_t addr,
enum mm_fault_flags
) source mm_getref
Section titled “mm_getref”mm_putref
Section titled “mm_putref”mm_users_getref
Section titled “mm_users_getref”mm_users_putref
Section titled “mm_users_putref”last user -> mm_exit(mm); then mm_putref()