gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:09:15 25 4
gpt4 key购买 nike

程序加载器初始化/加载textdata+bss区域。它们被分配在进程的虚拟地址空间的开头附近。然后堆将向更大的地址增长(在 data+bss 之后)。堆栈从较大的地址向较低的地址增长。

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

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

virtual memory          (kbytes, -v) unlimited

现在,这个无限肯定是指可用于寻址的有限位数所带来的技术限制(在 64 位 Linux 上,我记得是 48 位?!)

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

最佳答案

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

  • 对于现代 Linux 系统,单线程程序的初始堆栈基础由内核控制 Address Space Layout Randomization (ASLR) feature
  • 在 ASLR 出现之前的古代,我认为主线程的堆栈曾经位于 32 位 Linux 的高固定地址。对于 ASLR 之前的 64 位(或者如果禁用它),它可能位于远离其他所有内容的固定地址,但如果该地址与内核版本相关,我不会感到惊讶。
  • 对于多线程 Linux 程序,在启动线程的 clone() 调用之前,glibc 使用 mmap 分配堆栈(请参阅: nptl/allocatestack.c )
  • 在 32 位单线程 AIX 上,堆栈和堆(sbrk 控制)过去常共存于 16 256 mb 段之一(我忘记是哪一个。)我记得有很多乐趣 如果您使用允许堆栈增长为堆的选项进行编译,则所有人都可以使用。
  • ...

关于linux - 堆栈指针的初始值是如何确定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11612378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com