如何确定堆栈指针的初始值?

时间:2012-07-23 12:17:47

标签: linux memory 64-bit stack

程序加载器初始化/加载textdata+bss区域。这些是在进程的开头附近的虚拟地址空间中分配的。然后堆将(在数据+ bss之后)增长到更大的地址。堆栈从大的地址变为较低的地址。

我想知道如何确定堆栈指针的初始值。

如果我要求每个进程的虚拟地址限制(ulimit -v),我得到

virtual memory          (kbytes, -v) unlimited

现在,这个unlimited当然是指可用于寻址的有限位数的技术限制(在64位Linux上我记得48位?!)

那么,除非使用不同的ulimit,否则堆栈指针大致初始化为(vmem + 2 ^ 48位的开始),这是否很简单?

1 个答案:

答案 0 :(得分:0)

这是一个高度依赖平台的问题,它取决于您正在运行的程序的位数,所使用的操作系统版本,系统配置选项,程序是否为单线程或多线程,以及其他因素:

  • 对于现代Linux系统,单线程程序的初始堆栈库由内核Address Space Layout Randomization (ASLR) feature控制。
  • 在ASLR诞生之前的远古时代,我认为主线程的堆栈曾经位于32位Linux的高固定地址。对于ASLR之前的64位(或如果您将其禁用),它可能位于一个固定的地址,该地址与其他所有地址都相距甚远,但是如果该地址依赖于内核版本,我不会感到惊讶。
  • 对于多线程Linux程序,由glibc使用mmap在启动线程的clone()调用之前分配堆栈(请参阅:nptl/allocatestack.c
  • 在32位单线程AIX上,用于共存的16 256 mb段之一(我忘了哪一个)中的堆栈(受sbrk控制)。我记得有很多 fun
  • ...