Wie genau funktioniert der Stack?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
Wann wird der Stack erstellt? Beim Aufruf des Entry Points?

Der Stack wird bei Laden des Programmes Reserviert und die Größe kann auch als Kompileroption angegeben werden.

Wächst der Stack mit der Laufzeit oder ist das Prinzip dass immer soweit "aufgeräumt" wird, das der Stack nie wirklich größer wird insgesamt?

Ein Stack sollte immer die gleiche Adresse haben, daher kann man ihn auch nicht einfach neu Reservieren.

Wo wird der Stack erstellt?

Auf einer zufälligen Adresse, wo gerade frei ist. Bei Mikrocontrollern habe ich gesehen, dass das Ende des Adressraums für den Stack verwendet wird.

Wie genau funktioniert der Stack?

ESP zeigt beim Programmstart auf das erste Byte nach dem Stack Buffer.
Das Bedeutet ESP = Stack Adresse + Stack Größe
Wenn mit PUSH ein Register auf den Stack gelegt wird, wird der ESP um die Größe des Registers verringert und dann zeigt ESP direkt auf den Neuen Speicher, und der Register wird zur ESP Adresse gespeichert.

Das Bedeutet:

push eax

Ist dasselbe wie:

sub esp, 4
mov [esp], eax

Es ist auch möglich beliebig große Buffer am Stack zu reservieren, jedoch muss man wissen, dass der Stack ein beim Programmstart festgelegtes Limit hat.

Ich könnte hier noch sehr vieles mehr erzählen, aber da müsste ich ein ganzes Tutorial schreiben.

Ich hoffe, ich konnte ein bisschen weiterhelfen.

Woher ich das weiß:Hobby

Usedefault 
Fragesteller
 04.07.2020, 14:18

Wenn man ein Programm öffnet wird dann der Speicher 0x00000 bis 0x7fffff mal reserviert?

Weil mir ist aufgefallen, dass der Stack wenn man in den Modulen herumhüpft immer wo anders ist aber IM jeweiligen Modul immer etwa an derselben Stelle.

Ist der Heap sowas ähnliches wie der Stack, also ein Speicher der auch irgendwo angelegt wird? Wird der Heap bei CreateHeap angelegt, was jedes Modul ziemlich am Anfang vom Compiler mitbekommt?

0
Klawutzel  04.07.2020, 14:41
@Usedefault
 der Stack wenn man in den Modulen herumhüpft immer wo anders ist aber IM jeweiligen Modul immer etwa an derselben Stelle.

Die ESP Adresse müsste sich immer im gleichen Stack Buffer befinden, egal welche Funktion in welchem Modul du aufrufst.
Es sei denn du sprichst von mehren Threads, denn jeder Thread hat seinen eigenen Stack.

0
Usedefault 
Fragesteller
 04.07.2020, 14:51
@Klawutzel

Aja ich hab es gerade selber auch herausgefunden. Dass heißt wenn mehrere Threads auf dieselben Funktionen zugreifen benutzen sie immer unterschiedliche Stacks?

Übrigens hast du Recht: Bei manchen Threads ist der Stack über der Base Adresse des Moduls und bei manchen unterhalb!

1
Klawutzel  04.07.2020, 14:58
@Usedefault
Dass heißt wenn mehrere Threads auf dieselben Funktionen zugreifen benutzen sie immer unterschiedliche Stacks?

Ja ein Thread hat seine eigenen Register und seinen eigenen Stack.
Die Adresse des Stack ist zufällig aber für die Zeit, die der Thread existiert, wird sie nicht verändert.

0
Usedefault 
Fragesteller
 04.07.2020, 15:58
@Klawutzel

Wie unterscheidet man in ASM ob man eine Adresse oder ein DWORD an eine Funktion übergeben will?

Weil wenn ich schreibe PUSH 0x47E90 und dann einen CALL, verweist das dann immer auf eine Adresse bzw. auf das was die Funktion dann aus 0x47E90 macht? Obs mathematisch rumspielt damit oder einen Offset abfragt als wäre eine statische Struktur übergeben worden?

0

1) Kommt drauf an, Spätestens dann, aber kann auch früher sein.

2) Kann beides sein, stacks können die größe dynamisch ändern oder eine feste größe haben. Kommt aufs betriebsystem an.
Es ist ja z.B. denkbar dass man den heap(oder einen anderen stack) mit etwas abstand über dem stack anordnet und nach unten wechsen lässt. Dann können beide wachsen bis sie zusammenstoßen in der mitte irgendwo.

3) Wo der stack erstellt wird, kommt auch drauf an. Moderne computer nutzen aber offsets, sprich dein programm landet irgendwo im speicher wo platz ist und funktioniert immer gleich. Die addressangaben in dem programm sind immer nur relativ zu dem offset, nie absolut.

Also, kommt alles drauf an, man kann keine einzige frage davon beantworten ohne zu wissen über was für eine platform du redest.


Usedefault 
Fragesteller
 04.07.2020, 14:12

Ich rede von Windows.

Gibt es nur einen Stack der für das ganze Programm zuständig ist?

Weil mir fällt grade auf das im Debugger der Stack bei 0x180000 etwa liegt.

Bedeutet das, dass keine Module Base unter 0x20000 sein darf um nicht mit dem Stack in Konflikt zu geraden?

0