2013-02-09 94 views
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在每個進程跟蹤內存並正確映射到主內存?

感謝

+2

這是因爲每個程序都有一個'虛擬地址空間',而不是物理地址空間 - 這是允許頁面文件工作的原因,因爲虛擬和真實的物理地址空間被分開,允許程序中的地址保持不變但是指的是截然不同的點(甚至是當前換出到磁盤的點)。這也意味着程序不能通過編程不好來「破壞」彼此的記憶 - 記住windows 3.1和windows 95,哪一個崩潰的遊戲會讓整個計算機失效? – Patashu 2013-02-09 03:07:38

回答

0

是因爲這些都是虛擬內存地址和引擎蓋下的Linux跟蹤存儲每個進程並正確映射到主內存?

是的。