我正在探索系统的低级工作,并想知道malloc
如何确定堆的起始地址。堆是否处于常量偏移量,或者是否有某种调用来获取起始地址?堆栈是否会影响堆的起始地址?
答案 0 :(得分:2)
sbrk 返回它添加(或删除)的字节的起始地址。在尚未分配堆的新进程中,第一次调用 sbrk 应该返回堆的“break”部分的起始地址。如果我不得不下注,那就是使用 brk / sbrk 的 malloc 实现可能会在第一次运行时执行。
答案 1 :(得分:1)
传统上,堆开始于文本部分的上方并且长大了;堆栈帧根本不影响起始地址,因为它们向未映射的0页面向下增长。然而,这些日子更为常见
malloc()
通常只调用mmap()
来获取虚拟地址空间中的任何地址