摘要
brk()用于用户进程向内核申请空间,进一步说用于扩展用户堆栈空间,或者回收用户堆栈空间。
本文仅简要介绍其函数主体结构,感兴趣的读者可以阅读相关源码书籍。
asmlinkage unsigned long sys_brk(unsigned long brk)
1.malloc为小空间申请,brk()为大块空间申请。
2.sys_brk()包括两部分
增长动态分配区
unsigned long do_brk(unsigned long addr, unsigned long len)
释放动态分配区
int do_munmap(struct mm_struct *mm, unsigned long addr, size_t len)
1.释放动态分配区
1.1获取释放区域:虚存地址newbrk~old_brk
1.2获取涉及到的所有vma结构链表
1.3处理单个vma结构,主要包括:
1.3.1循环处理该vma涉及到的目录表dir
1.3.1.1循环处理vma涉及到的页面表项pte
1.3.1.2将pte指向的页面脱链,释放
1.3.2需要注意的是处理当前vma是,虚存地址address并不一定与1<<22对齐,因此,例如处理当前目录表项dir时,处理的范围是address到下一个对齐的PGDIR_SIZE
1.4释放vma结构,调整释放范围边界落到某个vma内部的vma边界
1.5看看能否释放整个目录表
2.增长动态分配区
2.1检查增长是否超过顶部堆栈区,增长区需要落到空洞中
2.2vma flag一致,可以合并vma
2.3否则需要单独成一个新vma
2.4建立内存页面映射
参考资料: