1. 程式人生 > >Linux記憶體管理之malloc實現

Linux記憶體管理之malloc實現

程序虛擬地址空間由一個一個VMA來表示,這裡先接收VMA相關操作.

1.1 查詢VMA函式find_vma()

struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)

找到的vma結果需滿足條件:

/* 找到前一個VMA,基於find_vma實現*/

struct vm_area_struct *
find_vma_prev(struct mm_struct *mm, unsigned long addr,struct vm_area_struct **pprev)

/*找到一個與start和end重合的vma */

static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * mm, unsigned long start_addr, unsigned long end_addr)

 

1.2 插入vma

int insert_vm_struct(struct mm_struct *mm, struct vm_area_struct *vma)

1.3 合併VMA

struct vm_area_struct *vma_merge(struct mm_struct *mm,
            struct vm_area_struct *prev, unsigned long addr,
            unsigned long end, unsigned long vm_flags,
            struct anon_vma *anon_vma, struct file *file,
            pgoff_t pgoff, struct mempolicy *policy,
            struct vm_userfaultfd_ctx vm_userfaultfd_ctx,
            const char __user *anon_name)

2. malloc核心實現

核心通過brk系統呼叫實現malloc函式功能.

4.幾個重要函式

給使用者空間地址分配物理頁面,並進行對映。

long get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
        unsigned long start, unsigned long nr_pages, int write,
        int force, struct page **pages, struct vm_area_struct **vmas)

根據使用者空間虛擬地址,返回page結構

static inline struct page *follow_page(struct vm_area_struct *vma,
        unsigned long address, unsigned int foll_flags)

根據PTE獲取page結構

struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr,
                pte_t pte)