进程虚拟地址空间由一个一个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)
本文详细介绍了Linux内核中进程虚拟地址空间的管理机制,包括VMA的查找、插入、合并等关键操作,以及内核如何通过brk系统调用实现malloc功能。深入探讨了get_user_pages、follow_page和vm_normal_page等函数在用户空间地址与物理页面映射中的作用。
1万+

被折叠的 条评论
为什么被折叠?



