在机器上运行的每个进程都被赋予一种错觉,即它是唯一运行在它上面的进程。每个进程都有文本,数据和堆栈部分。
但是,我无法理解为什么每个进程的堆栈地址都在同一地址开始(假设没有安装内核补丁并禁用地址随机化)。
有人可以指点我一些阅读资源或解释为什么会这样吗?
答案 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
完成。