Skip to content

Virtual Memory Area

include/mem/vma_range.h View source View on GitHub
struct vma_range (8 fields) source
§ struct rbit_node mm_node
§ vaddr_t min_low

min_low = lowest start in the subtree

§ size_t max_gap

max_gap = largest free gap between consecutive VMAs in the subtree

§ pgoff_t pgoff

object-space offset of start

r/w/x, etc.

§ struct anon_vma *anon_vma
§ struct mm *mm

whose page tables

§ struct list_head anon_vma_chain

AVCs: own object + every ancestor

enum vma_range_protection (3 variants) source
§ VMA_PROT_READ = 1
§ VMA_PROT_WRITE = 1 << 1
§ VMA_PROT_EX = 1 << 2
vaddr_t vma_range_start(const struct vma_range *vma_range)
source
vaddr_t vma_range_end(const struct vma_range *vma_range)
source
struct vma_range * vma_range_alloc(
    struct mm *mm,
    vaddr_t start,
    vaddr_t end,
    enum vma_range_protection prot
)
source
void vma_range_free(struct vma_range *vma_range)
source
void vma_range_init(
    struct vma_range *vma_range,
    struct mm *mm,
    vaddr_t start,
    vaddr_t end,
    enum vma_range_protection prot
)
source
struct vma_range * vma_range_find(struct mm *mm, vaddr_t addr)
source
struct vma_range * vma_range_find_intersection(
    struct mm *mm,
    vaddr_t s,
    vaddr_t e
)
source
struct vma_range * vma_range_next(struct vma_range *vma_range)
source
struct vma_range * vma_range_prev(struct vma_range *vma_range)
source
enum err vma_range_anon_prepare(struct vma_range *vma_range)
source

fault path helper: write fault on an anon VMA, allocate anon_vma and AVC, link, stash on vma_range->anon_vma

enum err vma_range_expand(
    struct vma_range *vma_range,
    vaddr_t new_start,
    vaddr_t new_end
)
source
struct vma_range * vma_range_merge(
    struct mm *mm,
    struct vma_range *prev,
    struct vma_range *vma_range
)
source
enum err vma_range_set_prot(
    struct vma_range *vma_range,
    enum vma_range_protection prot
)
source
void vma_range_unmap_range(
    struct vma_range *vma_range,
    vaddr_t s,
    vaddr_t e
)
source
void vma_range_teardown(struct vma_range *vma_range)
source
bool vma_range_is_anonymous(const struct vma_range *vma_range)
source
size_t vma_range_pages(const struct vma_range *vma_range)
source
struct vma_range * vma_range_split(
    struct vma_range *vma_range,
    vaddr_t addr
)
source

split one VMA into two at addr, recompute pgoff + tree intervals

struct vma_range * vma_range_dup(
    struct mm *dst_mm,
    const struct vma_range *src
)
source

fresh VMA in dst_mm with src’s attributes but no linkages

vaddr_t vma_range_address(
    const struct vma_range *vma_range,
    pgoff_t index
)
source

The index to VA translation. THE VMA’s job, not the anon_vma’s.