2013-08-20 12 views
5

Ich habe 1.c wie folgt bearbeitet.wie auf Speicher zugreifen, der verschiedenen Prozessen zugeordnet ist?

Dann habe ich Command Prompt geöffnet und dieses Programm ausgeführt und bekam die Ausgabe 00402000, während das Programm noch läuft. Jetzt laufe ich 2.c

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

in einer anderen Instanz von Eingabeaufforderung und bekam Ausgang -1, I 100 erwarten, die in Lage ist 00402000. bitte erklären, warum ist dieses Verhalten?

+3

Kein modernes Multitasking-Betriebssystem ermöglicht Ihnen den Zugriff auf Speicher von anderen Prozessen. Vielleicht möchten Sie jedoch über [shared memory] (http://en.wikipedia.org/wiki/Shared_memory) lesen. Ein Grund, warum Sie keinen anderen Prozessspeicher verwenden können, ist einfach, weil beide Prozesse ihre eigene Speicherzuordnung haben, und es ist sowieso alles [virtueller Speicher] (http://en.wikipedia.org/wiki/Virtual_memory). Wenn Sie dem zweiten Programm eine globale Variable hinzugefügt und seine Adresse ausgedruckt haben, ist möglicherweise sogar dieselbe Adresse wie beim ersten Prozess vorhanden. –

+0

Das stimmt nicht. Kernel-Module haben Kernel-Privilegien – Magn3s1um

+1

@ Joachim: sagen, dass ReadProcessMemory API. Klar, wie würdest du sonst noch debuggen? Es ist nur eine privilegierte Operation. –

Antwort

11

In erster Linie, lassen Sie mich sagen, dass in modernen Betriebssystemen die Adresswerte, die Ihr Programm sieht (wie 0x00402000) nicht physikalische Adressen sind. Sie sind virtuelle Adressen, sie sind privat für den besitzenden Prozess (dh sie machen in anderen Prozessen keinen Sinn oder meinen etwas anderes) und werden über einen CPU-basierten Mechanismus ("die Paging-Einheit"), den nur OS hat, physischen Adressen zugeordnet Kontrolle über.

Wenn Sie eine Variable zwischen verschiedenen Prozessen teilen möchten, gibt es einen Mechanismus namens Shared Memory. Lesen Sie darüber nach. Die relevanten APIs sind CreateFileMapping mit dem ersten Parameter INVALID_HANDLE_VALUE, MapViewOfFile, OpenFileMapping. Es gibt auch andere Möglichkeiten der Interprozesskommunikation.

Wenn Sie die explizite Zusammenarbeit des Prozesses 'Speicher ohne diesen Prozess' lesen möchten, müssen Sie die Debugging-API lesen. Dies ist eine viel schwierigere Aufgabe als die Verwendung von gemeinsam genutztem Speicher.

Was Sie übrigens codiert haben, ist ein klassisches undefiniertes Verhalten.

+0

, so dass jeder Prozess im Speicher eine eigene virtuelle Speicherkarte hat? –

+1

@MSharathHegde YES Jedes Mal, wenn eine Anwendung auf einem Betriebssystem ausgeführt wird, erstellt das Betriebssystem einen neuen Prozess und ein neues VAS für diesen Prozess. –

+1

@MSharathHegde Ja. Zumindest der "Benutzer" -Teil davon (unter Windows wird die "Kernel" -Hälfte der virtuellen Speicherzuordnung von allen Prozessen gemeinsam genutzt) – Medinoc

1

Scheint ein undefiniertes Verhalten zu sein. Da der Prozess eines Benutzers nur auf Speicher zugreifen darf, der ihm zugewiesen wurde. Wenn Sie also versuchen, auf den Speicher über die Adresse zuzugreifen, geben Sie eine ungültige Adresse an, und Sie geraten in ein undefiniertes Verhalten.

1

den Adressraum-Konzept zur Demo, ändern Sie Ihr zweites Beispiel:

#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; 
} 

Wahrscheinlich/könnten "101" drucken !! Dies liegt daran, dass das Betriebssystem jeden Adressraum gleich behandelt. So wird die globale Variable für eine int unabhängig von ihrem Namen wahrscheinlich auf die Position 0x004002000 zugewiesen.

+0

es druckt 101 wie du erzählt .. –

+0

@MSharathHegde, fantastisch! Computer sind wirklich vorhersehbar !! – JackCColeman

Verwandte Themen