2013-02-09 1 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 

나는 다른 주소를 기대하고있었습니다. 누구든지 이것에 대해 밝힐 수 있습니까? 이것이 가상 메모리 주소이고 후드 리눅스가 프로세스 당 메모리를 추적하고 주 메모리에 올바르게 매핑되기 때문입니까? 이러한 가상 메모리 주소입니다 및 후드 리눅스는 프로세스 당 메모리를 추적하고 메인 메모리에 제대로 매핑 있기 때문에

감사

+2

모든 프로그램은 실제 주소가 아닌 '가상 주소 공간'을 가지고 있기 때문에 페이지 파일이 작동하는 것을 허용합니다. 가상 주소와 실제 주소 공간이 분리되어있어 프로그램의 주소가 동일하게 유지됩니다 방대한 스팟들 (그리고 디스크에 현재 스왑 아웃 된 스팟들)을 참조하십시오. 또한 프로그램이 제대로 프로그램되지 않아서 서로의 추억을 '못쓰게'할 수 없음을 의미합니다. Windows 3.1 및 Windows 95를 기억하십시오. 충돌하는 게임 하나가 전체 컴퓨터를 다운시킨 곳입니까? – Patashu

답변

0

인가?

예.