两个进程具有相同的堆栈指针。为什么?
问题描述:
使用下面的代码打印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在每个进程跟踪内存并正确映射到主内存?
感谢
答
是因为这些都是虚拟内存地址和引擎盖下的Linux跟踪存储每个进程并正确映射到主内存?
是的。
这是因为每个程序都有一个'虚拟地址空间',而不是物理地址空间 - 这是允许页面文件工作的原因,因为虚拟和真实的物理地址空间被分开,允许程序中的地址保持不变但是指的是截然不同的点(甚至是当前换出到磁盘的点)。这也意味着程序不能通过编程不好来“破坏”彼此的记忆 - 记住windows 3.1和windows 95,哪一个崩溃的游戏会让整个计算机失效? – Patashu 2013-02-09 03:07:38