2013-08-20 17 views
5

Edytowałem 1.c, jak poniżej.jak uzyskać dostęp do pamięci przydzielonej do różnych procesów?

#include<stdio.h> 
int x=100; 
int main(void) 
{ 
    printf("%p",&x); 
    while(1); 
    return 0; 
} 

Następnie otworzyłem wiersz poleceń i uruchomiłem ten program i otrzymałem wynik 00402000 podczas działania programu. Teraz biegnę 2.C

#include<stdio.h> 
int main(void) 
{ 
    int *p=(int *)0x00402000; 
    printf("%d",*p); 
    return 0; 
} 

w innej instancji wiersza polecenia i dostał wyjście -1, spodziewam 100, który znajduje się w miejscu 00402000. proszę wyjaśnić, dlaczego jest to zachowanie?

+3

Brak nowoczesnego wielozadaniowego systemu operacyjnego umożliwia dostęp do pamięci z innych procesów. Warto jednak przeczytać o [wspólnej pamięci] (http://en.wikipedia.org/wiki/Shared_memory). Powodem, dla którego nie można użyć innej pamięci procesu, jest to, że oba procesy mają swoją własną mapę pamięci, a to wszystko [pamięć wirtualna] (http://en.wikipedia.org/wiki/Virtual_memory). Jeśli dodałeś zmienną globalną do drugiego programu i wydrukowałeś jej adres, może to być nawet ten sam adres, co pierwszy proces. –

+0

To nie prawda. Moduły jądra mają uprawnienia jądra – Magn3s1um

+1

@Joachim: powiedz to do API ReadProcessMemory. Oczywiście, że tak, jak inaczej debugować? To tylko uprzywilejowana operacja. –

Odpowiedz

11

Przede wszystkim pozwól mi powiedzieć, że we współczesnych systemach operacyjnych wartości adresowe, które widzi twój program (np. 0x00402000) to adresy fizyczne: , a nie. Są to adresy wirtualne, są prywatne w stosunku do procesu będącego właścicielem (tj. Nie mają sensu ani nie znaczą czegoś innego w innych procesach) i są mapowane na adresy fizyczne za pośrednictwem mechanizmu opartego na procesorze ("jednostka stronicowania"), który tylko system operacyjny ma kontrola.

Jeśli chcesz udostępnić zmienną między różnymi procesami, istnieje mechanizm o nazwie pamięć dzielona. Przeczytaj na ten temat. Odpowiednie API to CreateFileMapping, przy czym pierwszym parametrem jest INVALID_HANDLE_VALUE, MapViewOfFile, OpenFileMapping. Są też inne sposoby komunikacji międzyprocesowej.

Jeśli chcesz przeczytać wyraźną współpracę procesu "pamięć bez tego procesu", musisz przeczytać na temat debugowania interfejsu API. Jest to znacznie trudniejsze zadanie niż korzystanie z pamięci współdzielonej.

Nawiasem mówiąc, to, co zakodowałeś, to klasyczne niezdefiniowane zachowanie.

+0

, więc każdy proces w pamięci będzie miał własną mapę pamięci wirtualnej? –

+1

@MSharathHegde YES Za każdym razem, gdy aplikacja jest uruchamiana w systemie operacyjnym (OS), system operacyjny tworzy nowy proces i nowy system VAS dla tego procesu. –

+1

@MSharathHegde Tak. Przynajmniej część "użytkownika" (w systemie Windows, "jądro" połowa mapy pamięci wirtualnej jest współdzielona przez wszystkie procesy) – Medinoc

1

Pojawia się niezdefiniowane zachowanie. Ponieważ proces użytkownika ma jedynie dostęp do pamięci, która została do niego przypisana. Tak więc, próbując uzyskać dostęp do pamięci o adresie, przydzielając nieprawidłowy adres i uruchamiasz niezdefiniowane zachowanie.

1

demo na koncepcję przestrzeni adresowej, modyfikować swój drugi przykład do:

#include<stdio.h> 
int y = 101; 
int main(void) 
{ 
    int *p=(int *)0x00402000; // hope this works?? 
    printf("%d",*p); 

    printf("%p", p); // print value of p to ensure correct assignment 
    return 0; 
} 

Prawdopodobnie/może wydrukować "101" !! Dzieje się tak, ponieważ system operacyjny traktuje każdą przestrzeń adresową tak samo. Więc, globalny var dla int niezależnie od jego nazwy prawdopodobnie zostanie przydzielony do lokalizacji 0x004002000.

+0

drukuje 101, jak powiedziałeś .. –

+0

@MSharathHegde, fantastycznie! Komputery naprawdę są przewidywalne !! – JackCColeman

Powiązane problemy