【发布时间】:2012-07-21 16:18:56
【问题描述】:
程序加载器初始化/加载text、data+bss 区域。这些分配在靠近开始的进程的虚拟地址空间中。然后堆会向更大的地址增长(在 data+bss 之后)。堆栈从较大的地址向较低的地址增长。
不知道堆栈指针的初始值是如何确定的。
如果我要求每个进程的虚拟地址限制 (ulimit -v) 我得到 p>
virtual memory (kbytes, -v) unlimited
现在,unlimited 肯定是指可用于寻址的有限位数所带来的技术限制(在 64 位 Linux 上,我记得是 48 位?!)
那么,除非有不同的ulimit 应用,否则堆栈指针大致初始化为(vmem 开头 + 2^48 位)就这么简单吗?
【问题讨论】:
-
在某些系统中,SP 初始化为 0,因为
push会先递减地址,然后再写入内存。但是我不知道Linux现在使用什么算法。另外,出于安全原因,堆栈指针的地址可能不再固定。 -
当递减零时,您会得到一个
int下溢,它会回滚到最大int数字。这就是您所说的系统如何确定堆栈指针与开始的距离。这是你说的吗? -
@Frank:你会得到适当类型的下溢。对于与 32 位
int不同的 64 位指针。 -
是的,当然,
int不会在 0 处下溢。我的意思是 C 中的uint或size_t等效项。在 64 位上它是无符号长的。 -
@Frank:是的。 CPU 架构将确保您获得尽可能大的地址。然后,VM 表会将这个虚拟地址映射到实际内存中的某个页面。