2013-12-01 3 views
1

я составил на Slackware 14 (32 бит) следующие примеры программ:памяти в Linux - система() поведение

// p1.c 
#include <stdio.h> 
unsigned char *sp() { asm("movl %esp, %eax\n\taddl $8, %eax"); } 
int main(int argc, char **argv) 
    { 
    char *s1="1111111111"; 
    printf("p1: s1=%p, SP=%p\n", s1, sp()); 
    system("./p2.bin"); 
    printf("p1: s1=%p, SP=%p\n", s1, sp()); 
    } 

// p2.c 
#include <stdio.h> 
unsigned char *sp() { asm("movl %esp, %eax\n\taddl $8, %eax"); } 
int main(int argc, char **argv) 
    { 
    char *s2="2222222222"; 
    printf("p2: s2=%p, SP=%p\n", s2, sp()); 
    } 

ESP печатных значений были идентичны:
bash-4.2$ ./p1.bin
p1: s1=0x8048580, SP=0xbffff6b0
p2: s2=0x8048530, SP=0xbffff6b0
p1: s1=0x8048580, SP=0xbffff6b0
Но я ожидал, что разные, потому что кадр стека основной функции p2 должен быть выделен поверх фрейма стека основной функции p1. Что не так?

Другой вопрос:
Если я изменяю p2.c сбросить память из 0x8048580 я могу видеть «2222222222» (в настоящее время addrress 0x80486f0), но не «1111111111» в 0x8048580. Зачем?
Благодарим за помощь.

ответ

4

p2 - совершенно другой процесс. Он не «распределяется поверх p1». Несмотря на то, что адреса одинаковы, они фактически ссылаются на разные места физической памяти. Все это скрыто виртуальной памятью и MMU процессора.

Причина, по которой эти значения совпадают, связана с тем, как Linux загружает исполняемые файлы. Не полагайтесь на то, что они всегда одинаковы.

+0

Большое спасибо – user2431763

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