“堆栈以每个程序的相同地址开头”

时间:2010-12-31 06:24:02

标签: assembly x86

在机器上运行的每个进程都被赋予一种错觉,即它是唯一运行在它上面的进程。每个进程都有文本,数据和堆栈部分。

但是,我无法理解为什么每个进程的堆栈地址都在同一地址开始(假设没有安装内核补丁并禁用地址随机化)。

有人可以指点我一些阅读资源或解释为什么会这样吗?

3 个答案:

答案 0 :(得分:2)

堆增长并且堆栈增长,因此在大多数操作系统上,虚拟空间看起来像:

Program text
Program data/bss
Heap
(dynamically grows up)
...
...
(dynamically growing down)
stack

因此堆的位置根据程序大小而移动,但堆栈的起始空间不依赖于程序的任何内容。

答案 1 :(得分:1)

因为有一个实际地址及其,我将使用“虚拟”地址。就像你说的那样,这是一种幻觉。起始地址实际上并不相同。

答案 2 :(得分:1)

这不是一个asm问题,它取决于操作系统。 对于linux(开源,你知道),请查看 fs / exec.c

/*
 * Place the stack at the largest stack address the architecture
 * supports. Later, we'll move this to an appropriate place. We don't
 * use STACK_TOP because that can depend on attributes which aren't
 * configured yet.
 */
vma->vm_end = STACK_TOP_MAX;

后来:

stack_top = arch_align_stack(stack_top);
stack_top = PAGE_ALIGN(stack_top);

随机化在arch_align_stack完成。