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)
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
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.
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
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:
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
wie gesagt - danke für deine Antwort und bis denn denn
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?
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.
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).
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.