我已经彻底阅读了有关sbrk()的linux手册:
sbrk()更改程序中断的位置,该位置定义进程数据段的结束(即,程序中断是未初始化数据段结束后的第一个位置)。
我知道用户空间内存的组织方式如下所示:

问题是:当我调用sbrk(1)时,为什么它说我要增加堆的大小?如手册所述,我正在改变“数据段& bss”的末尾位置。那么,应该增加数据段的大小& bss,对吗?
发布于 2015-12-13 07:23:22
数据和bss段是一个固定的大小。因此,在这些部分结束后分配给进程的空间并不是这些部分的一部分;它只是与这些部分相连。这个空间称为堆空间,用于动态内存分配。
如果您想把它看作是“扩展数据/bss段”,那也没关系。它不会对程序的行为、分配的空间或任何东西产生任何影响。
Mac上的手册页面表明,您真的不应该经常使用它们:
、brk和sbrk函数是虚拟内存管理出现前几天遗留下来的历史奇观。--
brk()函数将进程数据段(未初始化的数据)的中断地址或最低地址设置为addr(紧接bss之上)。数据寻址限制在addr和堆栈段的最低堆栈指针之间。内存是由brk以页大小块的形式分配的;如果addr不能被系统页面大小均匀地除以,则会增加到下一个页面边界。sbrk(0)可靠地返回程序中断的当前值(也请参见end(3))。getrlimit(2)系统调用可用于确定数据段的最大允许大小;不可能设置超出调用getrlimit返回的getrlimit值的中断,例如etext + rlp->rlim_max(etext的定义见end(3) )。
令人气恼的是,我无法找到一个手册页的结尾(3),尽管指南针看它。即使这个(稍旧的) sbrk()手册页面也没有它的链接。
https://stackoverflow.com/questions/34248854
复制相似问题