两个进程具有相同的堆栈指针。为什么?

问题描述:

使用下面的代码打印ESP寄存器:两个进程具有相同的堆栈指针。为什么?

#include <stdio.h> 
#include <stdlib.h> 

unsigned long get_sp() { 
    __asm__("movl %esp, %eax"); 
} 

int main() { 
    sleep(5); 
    printf("Stack pointer (ESP): 0x%x\n", get_sp()); 
    return 0; 
} 

禁用ASLR

echo "0" > /proc/sys/kernel/randomize_va_space 

体形:

gcc get_sp.c -o get_sp 

运行两个过程:

./get_sp & ./get_sp 

我得到:

Stack pointer (ESP): 0xbffff158 
Stack pointer (ESP): 0xbffff158 

虽然我期待着不同的地址。任何人都可以对此有所了解吗?是否因为这些是虚拟内存地址,并且Linux在每个进程跟踪内存并正确映射到主内存?

感谢

+2

这是因为每个程序都有一个'虚拟地址空间',而不是物理地址空间 - 这是允许页面文件工作的原因,因为虚拟和真实的物理地址空间被分开,允许程序中的地址保持不变但是指的是截然不同的点(甚至是当前换出到磁盘的点)。这也意味着程序不能通过编程不好来“破坏”彼此的记忆 - 记住windows 3.1和windows 95,哪一个崩溃的游戏会让整个计算机失效? – Patashu 2013-02-09 03:07:38

是因为这些都是虚拟内存地址和引擎盖下的Linux跟踪存储每个进程并正确映射到主内存?

是的。