do_brk()是这么被调用的:
/* Ok, looks good - let it rip. */
if (do_brk(oldbrk, newbrk-oldbrk) != oldbrk)
goto out;
所以就是将进程的堆空间从oldbrk扩展到newbrk,其中newbrk是通过brk(2)系统调用传进来了。
扩展堆空间时,需要确保被扩展的这段范围[oldbrk, newbrk)不能有已经存在的映射区间,否则就会有冲突。因此在do_brk()里你看到的那段循环就是在vma树里检索在[oldbrk, newbrk)这个区域内有没有vma覆盖(已经建立的映射),如果有则将这些映射解除掉,然后再继续brk扩展堆空间vma的处理逻辑。
【 在 flynetcn 的大作中提到: 】
:
https://elixir.bootlin.com/linux/v3.13.11/source/mm/mmap.c#L2626: 发自「今日水木 on 键盘侠」
--
FROM 123.120.110.*