2012-03-29 23 views
0

Ich bin ein wenig verwirrt über Windows-Speicherverwaltung.Windows-Speicherverwaltung

Ich habe irgendwo gelesen, dass jeder Prozess in Windows (32 Bit) seine eigenen 4 GB Speicher bekommt - dank dem Wechsel auf die Festplatte. Aber 32-Bit Windows kann maximal 4 GB nutzen. Also dachte ich, dass jeder Prozess nur "denkt", dass es 4 GB hat, aber in Wirklichkeit hat es weniger. Bin ich richtig?

Wie kann ich also auf Daten von einem Prozess zum anderen zugreifen? Wenn 2 PEs bei 0x400000 geladen werden, wie mache ich das? Können Sie mir ein Beispiel in C oder ASM geben?

Kann mir das jemand weiter erklären? Vielleicht weisen Sie mich auf einen guten Artikel hin.

Nur eine kurze Beschreibung ist genug :). Danke.

+0

nicht Adressraum und physischen Speicher Menge verwirren Sie. – Joey

Antwort

1

Prozesse können bis zu 4 GB Adressen adressieren, die von "echtem" Speicher unterstützt werden oder nicht. Windows-Betriebssysteme, sogar 32-Bit, können mehr als 4 GB adressieren, haben aber möglicherweise Gründe, diesen Betrag zu begrenzen, oder die Grenzwerte werden von der Hardware festgelegt.

Jeder Prozess auf 32-Bit Microsoft Windows verfügt über einen eigenen virtuellen Adressraum, der bis zu 4 Gigabyte Speicheradressierung bis ermöglicht. [...]

+0

Und wie kann ich feststellen, ob eine Adresse virtuell oder physisch ist? Kannst du mir ein Beispiel geben? Z.B. JMP XXX oder CALL XXX - wie kann ich sagen, welcher Speicher XXX ist? Oder vielleicht fehlt mir gerade etwas. Was ist, wenn ich auf die Funktion von DLL zugreifen möchte, die in ImageBase 0x400000 von meinem Programm geladen wird, das auch bei 0x400000 geladen wird? – Samuel

+0

Anwendungen im Benutzermodus behandeln nicht direkt den physischen Speicher. In asm oder nicht verwenden Sie nur die Adressen, die Ihnen bekannt sind. Das heißt, Sie haben einen Zeiger von 'VirtualAlloc' erhalten - Sie können ihn verwenden. OS- und Kernel-Modus-Komponenten machen das Mapping virtueller Adressen zu echtem Speicher für Sie. Sie können nicht nur unbekannte [Speicher-] Adressen treffen und erwarten, dass es irgendwie funktioniert. –

+0

OK, ich verstehe. Aber wie kann ich auf den Speicher eines anderen Prozesses zugreifen? Oder DLLs? Wird die DLL erneut in jeden Prozess geladen, der sie verwendet? Wenn meine App z. Kernel32.dll (die fast immer unter Windows verwendet wird) kann ich auf den virtuellen Adressraum meiner App oder auf einen anderen zugreifen? Gibt es einen gemeinsamen Adressraum? Es scheint sinnlos, die gleiche DLL xxx mal für jeden Prozess zu laden. – Samuel