2010-03-11 6 views
8

OS: Windows 7 32bitWindows-Assembly-Heap und -Stapel?

Also in wie C++ hat man einen Haufen und einen Stapel. Aber ich habe in letzter Zeit mit einigen Assembly Learning angefangen und habe nichts dergleichen gesehen, nur einen Stack, aber es sieht einfach nach reiner Erinnerung aus. So ist Heap und Stack-Implementierung spezifisch für C++ und andere Sprachen? Oder erhalten Sie immer noch einen Heap und Stack in der Assembly? Wenn Windows eine ausführbare Datei startet, was tun Windows in Bezug auf die Zuweisung von Speicher für den Prozess? Und wie weiß ein Prozess, wie groß die Stack-Größe sein muss?

Was gehen die

EDIT: Vielleicht könnte jemand Provider einen Link auf, wie Heap und Stack-Speicher für einen Prozess

von der CPU/OS gehandhabt wird

Antwort

9

Der Stapel wird hauptsächlich von der CPU verwaltet (Befehle PUSH/POP/CALL/RET); Der Heap ist eine reine Betriebssystem-/Laufzeitbibliotheksfunktion. Daher ist der Stapelzugriff in der Baugruppe natürlich. Für den Heapzugriff rufen Sie einfach die relevanten APIs aus Ihrem Assemblycode (HeapAlloc/HeapFree oder aus einer anderen Bibliothek) auf. Im Gegensatz zum Stapel gibt es in der Assemblersprache für die Heap-Speicherverwaltung keine Low-Level-Primitive.

Sie müssen sich keine Sorgen über die Stapelgröße unter Windows machen. Wenn Sie mehr und mehr davon verbrauchen, wird es transparent wachsen. Auf niedriger Ebene erstellt Windows eine Guard-Speicherseite unterhalb des Stack-Bottom (unter der Annahme, dass der Stack kleiner wird). Wenn Ihr Stapel die Schutzseite erreicht, wird eine Zugriffsverletzungsausnahme in der CPU generiert. Windows-Kernel würde es fangen, die Situation bemerken und den Stack wachsen lassen.

+0

Danke für die Info, aber es wirft mehr Fragen auf xD!Woher wissen Windows, wo sie den Heap und Stack im Raw-RAM abbilden sollen, damit sie sich nicht überschneiden oder mit anderen Prozessen kollidieren? Besonders wenn sich seine Größe dynamisch ändert? – Daniel

+0

@Daniel: Bei anderen Prozessen verwendet ein Betriebssystem virtuellen Speicher. Jeder Prozess sieht seine eigene Sicht auf den Speicher (der virtuelle Adressraum). Und ja, der Prozessor hat einen Mechanismus, um eine virtuelle Adresse in eine physische umzuwandeln. Siehe http://en.wikipedia.org/wiki/Virtual_memory – Bahbar

11

Die meisten meiner Kenntnis ist nicht Windows-spezifische, so Bär mit mir:

Der Heap und der Stack beziehen sich auf verschiedene Bereiche im Speicher (aber wir sprechen immer noch über den Hauptspeicher). Dies ist für keine Sprache spezifisch. Der Heap lebt in den niedrigen Speicheradressen und wächst nach oben; Der Stapel lebt in den hohen Speicheradressen und wächst nach unten. Dies soll verhindern, dass sie sich überschneiden (was sehr schlimm wäre).

Bei einer 32-Bit-Architektur verfolgen die EBP- und ESP-Register den aktuellen Stapelrahmen. EBP ist der Basiszeiger - dies zeigt auf die hohe Adresse des aktuellen Stapelrahmens. ESP ist der Stapelzeiger und zeigt auf die niedrige Adresse des aktuellen Stapelrahmens.

Denken Sie daran, dass das Konzept des freien/zugewiesenen Heap- und Stack-Speichers hauptsächlich auf Anwendungsebene relevant ist. Auf der Maschinenebene sieht der gesamte Speicher gleich aus - es liegt am Programmierer (oder Compiler), zu verfolgen, welche Speichersegmente verwendet werden.

Der Stapel wird durch eine Kombination von Anweisungen verwaltet, die Funktionen aufrufen, und explizite Änderungen an EBP und ESP. Alles unter ESP gilt als befreit; Um Speicher freizugeben, können Sie ESP einfach hinzufügen.

Der Haufen von Speicherzuordnungsverfahren verwaltet wird; Dokumentation kann here gefunden werden. Ich bin über die Einzelheiten von Winows nicht sicher, aber im Allgemeinen wird es einige Speicher-Manager sein, der die Verantwortung dafür, dass kein Speicherblock hat auf mehr als eine Anwendung zugeordnet.

+1

Nizza Informationen durch, bedeutet, so dass EBP - ESP = die Gesamtmenge der Größe des Stapelrahmens? – Daniel

+1

Recht, und wenn ein neue Funktion Anruf getätigt wird dann der Wert von EBP auf dem Stapel gespeichert, wird der Wert von ESP in EBP bewegt und die Größe des neuen Stapelrahmen wird von ESP abgezogen. – danben

+0

+1 sehr hilfreiche Antwort, danke! – kolistivra