Euc*_* Ye 4 c linux operating-system sbrk
我已经彻底阅读了关于 sbrk() 的 linux 手册:
sbrk() 改变程序中断的位置,它定义了进程数据段的结束(即程序中断是未初始化数据段结束后的第一个位置)。
问题是: 当我调用 sbrk(1) 时,为什么它说我正在增加堆的大小?正如手册所说,我正在更改“数据段和 bss”的结束位置。那么,数据段和bss的大小应该增加多少,对吗?
data 和 bss 段的大小是固定的。因此,在这些段结束后分配给进程的空间不是这些段的一部分;它只是与它们相邻。该空间称为堆空间,用于动态内存分配。
如果您想将其视为“扩展数据/ bss 段”,那也很好。它不会对程序的行为、分配的空间或任何东西产生任何影响。
Mac OS X 上的手册页表明你真的不应该经常使用它们:
brk 和 sbrk 函数是早期虚拟内存管理出现之前遗留下来的历史奇事。该
brk()函数将进程数据段(未初始化数据)的中断或最低地址设置为addr(紧接在 bss 之上)。数据寻址被限制在addr和指向堆栈段的最低堆栈指针之间。内存按brk页大小分配;如果addr不能被系统页面大小整除,则增加到下一个页面边界。程序中断的当前值由
sbrk(0)(另请参见end(3))可靠返回。所述getrlimit(2)系统调用可以被用来确定数据段的最大可允许的大小; 不可能将中断设置为超出rlim_max调用返回的值getrlimit,例如etext + rlp->rlim_max(有关 的定义,请参见end(3)etext)。
尽管有查看它的指针,但我找不到end(3)的手册页,这有点令人恼火。即使这个(有点旧的)手册页sbrk()也没有它的链接。