2

我正在探索系统的较低级别的工作原理,并且想知道如何malloc确定堆的起始地址。堆是在一个恒定的偏移量还是有某种调用来获取起始地址?栈会影响堆的起始地址吗?

4

2 回答 2

3

sbrk返回它添加(或删除)的字节的起始地址。在尚未分配堆的新进程中,第一次调用sbrk应返回堆的“中断”部分的起始地址。如果我必须打赌,这就是使用brk/sbrk的malloc实现在第一次运行时可能会做的事情。

于 2011-02-19T22:09:31.150 回答
1

传统上,堆从文本部分的上方开始并逐渐长大。堆栈帧根本不影响起始地址,因为它们向下增长到未映射的 0 页面。然而,这几天更常见的是

  1. 第一个地址被随机化,使漏洞更难命中内存中的正确地址
  2. 堆是非连续的,malloc()通常只是调用mmap()以获取虚拟地址空间中任何位置的地址
于 2010-04-28T04:54:57.320 回答