Windows-Baugruppenheap und -Stapel?

8

Betriebssystem: Windows 7 32bit

So wie in 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. Also ist die Implementierung von Heap und Stack 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 Stackgröße sein muss?

Was ist los?

EDIT: Vielleicht könnte jemand einen Link zur Verfügung stellen, wie Heap- und Stack-Speicher für einen Prozess von der CPU / OS behandelt werden

    
Daniel 11.03.2010, 03:05
quelle

2 Antworten

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 keine Low-Level-Primitive für die Heapspeicherverwaltung.

Sie müssen sich bei Windows nicht um die Stapelgröße kümmern. 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.

    
Seva Alekseyev 11.03.2010, 03:37
quelle
11

Die meisten meiner Kenntnisse sind nicht Windows-spezifisch, also ertragen Sie mich:

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 Heap wird durch Speicherzuweisungsmethoden verwaltet; Dokumentation finden Sie hier . Ich bin mir über die Einzelheiten von Winows nicht sicher, aber im Allgemeinen wird es einen Speichermanager geben, der dafür verantwortlich ist, sicherzustellen, dass kein Speicherblock mehr als einer Anwendung zugewiesen ist.

    
danben 11.03.2010 03:24
quelle

Tags und Links