首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于sbrk()和malloc()

关于sbrk()和malloc()
EN

Stack Overflow用户
提问于 2015-12-13 07:18:21
回答 1查看 3.6K关注 0票数 4

我已经彻底阅读了有关sbrk()的linux手册:

sbrk()更改程序中断的位置,该位置定义进程数据段的结束(即,程序中断是未初始化数据段结束后的第一个位置)。

我知道用户空间内存的组织方式如下所示:

问题是:当我调用sbrk(1)时,为什么它说我要增加堆的大小?如手册所述,我正在改变“数据段& bss”的末尾位置。那么,应该增加数据段的大小& bss,对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()手册页面也没有它的链接。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34248854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档