Windows intern - Aufbau der Speicherstruktur eines Prozesses

Liebe/-r Experte/-in,

aktuell versuche ich herauszufinden, wie Windows(>=XP) intern die Speicherverwaltung für einzelne Prozesse regelt:

Was ich bereits weiss ist dass Windows jedem Prozess einen „freien“ Speicher von 4 Gigabyte zur Verfügung stellt, wobei dieser in Pages unterteilt ist welche dann jede für sich unter anderem einen unterschiedlichen Status, Schutz und Typ haben können.

Was ich (soweit ich das richtig verstanden habe) auch weiss ist, dass Windows beim Erstellen eines Prozesses nicht nur Automatisch den entsprechenden Code in den Speicher läd sondern auch (unter anderem) eine Inline Address Table (IAT) für API-Calls bereitstellt.

Nun meine Frage:
Wie kann ich nun - lediglich mit Hilfe des Speichers des jeweiligen Prozesses sowohl den EntryPoint des Prozesses und die IAT ermitteln als auch bei den einzelnen Memory-Pages zwischen Code und Datensegment unterscheiden.

Effektiv bin ich hier für jeden Hinweis dankbar, sowohl für Konkrete Antworten bzw. Hinweise auf Webseiten Informationen zu dem von mir genannten Thema als auch für Tips für Suchbegriffe mit denen ich die gewünschten Informationen finden kann. (Bisher habe ich zwar ‚gegoogel‘ - scheinbar aber bisher ohne die richtigen Stichwörter)

danke schon mal

Daniel Heinrich

Windows verwendet seit WinNT 3.1 das FLAT Speichermodell, dies ist eine deutliche Vereinfachung dessen, was die Hardware bereits seit i386 unterstützt

4 GB phys. Speicher; eine globale und eine lokale Deskriptortabelle mit je 2047 Einträgen für virt. Speicher-Segmente mit einer max. Größe von 4 GB;
macht daher:
2 * 2047 * 4 GB, und das sind knapp 16 TB gesamter virtueller Speicher;

im 16-bit Protected-mode des i286 waren es: 16 MB phys. Speicher; eine globale und eine lokale Deskriptortabelle mit je 2047 Einträgen für virt. Segmente-Segmente mit einer max. Größe von 64 kByte; macht daher:
2 * 2047 * 64 kByte, und das sind knapp 1 GB gesamter virtueller Speicher;

WinNT FLAT: ein Prozess bekommt 4 GB Adressraum zur Verfügung, wobei sich das Betriebssystem selbst 2 GB reserviert; der Rest wird über die Selektoren
CS, DS und SS dem Prozess zur Verfügung gestellt;
CS - Codesegemt-Selektor
DS - Datensegment-Selektor
SS - Stacksegment-Selektor

Hallo Daniel,

so exakt kenne ich mich hier bei der Bereitstellung von Speichern auf den Windows-Systemen nicht aus.

Hier wäre mit Sicherheit eine Referenzquelle die Technical Reference zum dem jeweiligen BS von MS oder halt einen Blick ins Technet. (evtl. gibts hier ja White Papers).

Zumindest für WindowsXP passt bei 32 bit die Aussage mit den 4GB pro Prozess nicht. Hier ist normalerweise eine 2 GB Grenze eingestellt.

Was Du hier prüfen könntest wäre die Informationen die du über WMI zu Processes bekommen kannst.

Sorry das ich dir hier nicht wirklich weiterhelfen kann, aber Speicher ist eben vom BS als Gott gegeben angesehen. :wink:

Gruss
Daniel

kein Schimmer.
Hab jetzt auch keine Zeit. Interessieren würd’s mich schon. Vielleicht nächste Woche.

Hallo Daniel,
leider kann ich dir darauf nicht direkt eine Antwort geben. Hast Du msdn zugriff? Hier sind ein paar Artikel zum Thema Speicherverwaltung in Windows, vieleicht bringt dich das weiter:
http://blogs.msdn.com/ericlippert/archive/2009/06/08…
http://msdn.microsoft.com/en-us/library/ms810616.aspx
Ansonsten glaube ich ehre das das mit dem Speicher nicht (mehr) so gut funktioniert, da es ja nur noch ein virtueller Speicher ist. Könntest Du nicht auch mit Process ID arbeiten?
Grüße

Thomas

Hi Thomas,

Erstmal Danke für deine beiden Links.

Wegen der Process-ID: Ich arbeite ja schon mit ihr, schließlich will ich ja nur jeweils den „virtuellen“ Speicher EINES Prozesses im laufenden Betrieb analysieren. (Wollte ich den „echten“ Arbeitsspeicher roh auslesen müsste ich mich in Ring 0 bewegen oder das ganze in einer Virtuellen Umgebung machen was meiner Meinung nach einen zu großen Overhead darstellt.)

Hast Du msdn zugriff? Hier sind ein paar Artikel zum Thema
Speicherverwaltung in Windows, vieleicht bringt dich das
weiter:

Ja ich habe einen MSDN-Account :smile:

bis bald und danke nochmal

Daniel

Hi!

Danke für deine Antwort :smile:

Zumindest für WindowsXP passt bei 32 bit die Aussage mit den
4GB pro Prozess nicht. Hier ist normalerweise eine 2 GB Grenze
eingestellt.

Stimmt so nicht ganz - es sind schon (fast) 4 GB - es sind lediglich 2 davon für das Betriebssystem selber reserviert, dennoch sind es (fast) 4 GB (sonst würde es auch irgendwie keinen Sinn machen ein 32-Bit-System zu verwenden ^^

Was Du hier prüfen könntest wäre die Informationen die du über
WMI zu Processes bekommen kannst.

Ok - da muss ich mal guggen :smile:

wie gesagt - danke für deine Antwort und bis denn denn

Daniel

Hallo Daniel,

kein Problem.

allerdings mahne ich hier sehr stark zur Vorsicht mit den 4 GB zumindest bei 32bit BS. Hier ist ein Prozess auf 2GB beschränkt. Mit WMI kannst Du dir das anzeigen lassen. Auf den Servern gibt es hier einen 3GB Schalter, der den Speicher pro Prozess von 3GB ermöglichst.

Weiterhin hast du hier mit einer Adressbusbreite zu tun. Hast Du denn geprüft, dass wirklich alle 32 Leitungen für die Adressierung zur Verfügung stehen?

Gruss
Daniel

Hi!

zumindest bei 32bit BS. Hier ist ein Prozess auf 2GB
beschränkt. Mit WMI kannst Du dir das anzeigen lassen.

schau mal hier - hab ich heute gefunden (muss ich mir aber noch gemau durchlesen): http://msdn.microsoft.com/en-us/library/ms810616(lob… :smile:

Weiterhin hast du hier mit einer Adressbusbreite zu tun. Hast
Du denn geprüft, dass wirklich alle 32 Leitungen für die
Adressierung zur Verfügung stehen?

Soweit ich weiss(korrigier mich wenn ich was falsches schreibe) gilt das nur für die Hardwareaddressierung. Theoretisch hast du auch hier 32 Bit zur Verfügung, allerdings werden dir hier einige Addressen „geklaut“, (z.B. für die verschiedenen Interrupts, Register usw…)
Da wir es hier allerdings nicht mehr mit dem „echten“ sondern nurnoch mit dem von Windows verwaltetem „virtuellen“ Speicher zu tun haben sollten wir zumindest theoretisch gesehen mit den ganzen 32 Bit arbeiten können.

bis bald

Daniel

Liebe/-r Experte/-in,

aktuell versuche ich herauszufinden, wie Windows(>=XP) intern
die Speicherverwaltung für einzelne Prozesse regelt:

Sorry, kenne mich aus mit Mikroprozessoren, aber bei PCs bin ich leider nur ahnungsloser Anwender.
Gruß, Henning.

Hallo Daniel,

ich hoffe Du hast schon eine weiterführende Antwort auf Deine Frage bekommen, denn ich bin eher der Hardwerker und Elektroniker. Tut mir leid, aber auf Deine Frage habe ich keine Antwort parat. Meine Softwarekenntnisse beschränken sich auf Assembler, Pascal und etwas ‚C‘ (angewendet zur Programmierung von Microcontrollern).

Gruß
Horst

Hi,

Ich habe das zwar noch nicht selber gemacht, allerdings geht das meines Wissens nur, wenn der Prozessor sich im höchsten Zugriffsstatus befindet und durch die Systemlisten arbeitest (Process-Entries). Allerdings bezweifle ich, daß die Speicherblöcke selbst irgendeine Kennung haben, die eindeutig ist.

Gruß

Crush