【发布时间】:2016-03-18 22:01:40
【问题描述】:
我尝试在我的机器上使用 sbrk(1),然后故意写出测试页面大小,即 4096 字节。但是当我调用 malloc(1) 时,我在访问 135152 字节后得到了 SEGV,这远远超过一页大小。我知道 malloc 是库函数,它依赖于实现,但考虑到它最终会调用 sbrk,为什么它会给出一个以上的页面大小。谁能告诉我它的内部工作原理?
我的操作系统是 ubuntu 14.04,我的架构是 x86
更新:现在我想知道是否是因为 malloc 将地址返回到一个足够大以容纳我的数据的空闲列表块。但是那个地址可能在堆的中间,这样我就可以一直写,直到达到堆的上限。
【问题讨论】:
-
您具体使用的是什么操作系统和架构?另外,你确定 malloc() 调用 sbrk() 吗?
-
我不确定,但我的教授和一些在线资源告诉我。我在 ubuntu 14.04 下使用 x86 架构
-
ITYM 4096,而不是 4086。“(1)”是什么意思?
sbrk是系统调用 (2),malloc是库函数 (3)。 -
好吧,我只能推测您的特定 malloc(),但我经常看到人们假设“x 库函数在后台调用 y”,而这不一定是真的(例如,十年前可能 x() 称为 y(),但此后情况发生了变化)。另外,您是否尝试过在 malloc() 中设置断点,然后单步执行以查看它调用了什么?
-
我认为原因正是您在“更新:”下写的内容: