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

Это потому, что каждая программа имеет «виртуальное адресное пространство», а не физическое - это то, что позволяет работать с файлом страницы, поскольку разделяемые виртуальные и реальные физические адресные пространства позволяют адресам в программе оставаться неизменными но относятся к совершенно другим местам (и даже пятнам, которые в настоящее время выгружаются на диск). Это также означает, что программы не могут «сжимать» воспоминания друг друга, будучи плохо запрограммированными, - помните окна 3.1 и окна 95, где одна из них разбила весь компьютер? – Patashu

ответ

0

Это потому, что эти виртуальные адреса памяти и под капотом Linux отслеживает память для каждого процесса и правильно отображает основную память?

Да.

Смежные вопросы