Linux内核源码阅读之系统调用sys_brk()

摘要

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建立内存页面映射

参考资料:

《Linux内核情景分析》毛德操,胡希明

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值