0
使用下面的代碼打印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在每個進程跟蹤內存並正確映射到主內存?
感謝
這是因爲每個程序都有一個'虛擬地址空間',而不是物理地址空間 - 這是允許頁面文件工作的原因,因爲虛擬和真實的物理地址空間被分開,允許程序中的地址保持不變但是指的是截然不同的點(甚至是當前換出到磁盤的點)。這也意味着程序不能通過編程不好來「破壞」彼此的記憶 - 記住windows 3.1和windows 95,哪一個崩潰的遊戲會讓整個計算機失效? – Patashu 2013-02-09 03:07:38