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)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值