2010-03-11 19 views
8

SO: Windows 7 32bitAssemblaggio di Windows heap e stack?

Quindi, come in C++, uno ha un mucchio e uno stack. Ma ultimamente sto iniziando alcune fasi di assemblaggio e non ho visto nulla del genere, solo una pila ma sembra solo pura memoria. Quindi l'implementazione di heap e stack è specifica per C++ e altre lingue? O ti viene ancora assegnato un heap e lo stack in assembly? Quando si avvia un eseguibile cosa fa Windows in termini di allocazione della memoria per il processo? E in che modo un processo sa quanto deve essere grande la dimensione dello stack?

cosa è il go

EDIT: Forse qualcuno potrebbe fornitore di un link su come heap e stack di memoria è gestita per un processo da parte della CPU/OS

risposta

9

Lo stack è gestito principalmente dalla CPU (comandi PUSH/POP/CALL/RET); l'heap è puramente una funzionalità di libreria OS/runtime. Pertanto l'accesso allo stack è naturale in fase di assemblaggio. Per l'accesso all'heap basta chiamare le API pertinenti dal codice assembly (HeapAlloc/HeapFree o da un'altra libreria). A differenza dello stack, non esistono primitive di basso livello nel linguaggio assembly per la gestione della memoria heap.

Non devi preoccuparti delle dimensioni dello stack su Windows. Man mano che ne usi sempre di più, crescerà in modo trasparente. In termini di basso livello, Windows imposta una pagina di memoria di guardia sotto il livello inferiore dello stack (supponendo che lo stack aumenti). Quando lo stack raggiunge la pagina di guardia, viene generata un'eccezione di violazione di accesso nella CPU. Il kernel di Windows potrebbe prenderlo, notare la situazione e far crescere lo stack.

+0

Grazie per le informazioni, ma solleva più domande xD!In che modo Windows sa dove mappare l'heap e lo stack nella RAM raw in modo che non si sovrapponga o sia in conflitto con altri processi? Soprattutto se la sua dimensione cambia dinamicamente? – Daniel

+0

@Daniel: per altri processi, un sistema operativo utilizza la memoria virtuale. Ogni processo vede la propria vista della memoria (lo spazio degli indirizzi virtuali). E sì, il processore ha un meccanismo per convertire un indirizzo virtuale in uno fisico. Vedi http://en.wikipedia.org/wiki/Virtual_memory – Bahbar

11

maggior parte della mia conoscenza non è specifico di Windows, in modo da portami con me:

L'heap e lo stack si riferiscono a diverse aree in memoria (ma stiamo ancora parlando della memoria principale in ogni caso). Questo non è particolare per nessuna lingua. L'heap vive negli indirizzi di memoria bassi e cresce verso l'alto; lo stack vive negli indirizzi di memoria alti e cresce verso il basso. Questo per evitare che si sovrappongano (il che sarebbe molto brutto).

Su un'architettura a 32 bit, i registri EBP ed ESP tengono traccia del frame dello stack corrente. EBP è il puntatore di base - questo punta all'alto indirizzo del frame dello stack corrente. ESP è il puntatore dello stack e punta verso l'indirizzo basso del frame dello stack corrente.

Ricordare che il concetto di memoria heap/stack libera/allocata è per lo più rilevante a livello di applicazione. A livello macchina, tutta la memoria ha lo stesso aspetto: spetta al programmatore (o al compilatore) tenere traccia di quali segmenti di memoria sono in uso.

Lo stack è gestito da una combinazione di: istruzioni che chiamano funzioni e modifiche esplicite a EBP e ESP. Qualunque cosa al di sotto di ESP è considerata libera; quindi per liberare memoria basta aggiungere a ESP.

L'heap è gestito dai metodi di allocazione della memoria; la documentazione può essere trovata here. Non sono sicuro delle particolarità di Winows, ma in generale ci sarà un gestore di memoria che ha la responsabilità di assicurarsi che nessun blocco di memoria sia assegnato a più di un'applicazione.

+1

Informazioni utili, quindi EBP-ESP = la quantità totale di dimensioni del frame dello stack? – Daniel

+1

A destra, e quando viene effettuata una nuova chiamata di funzione, il valore di EBP viene salvato nello stack, il valore di ESP viene spostato in EBP e la dimensione del nuovo stack frame viene sottratta da ESP. – danben

+0

+1 risposta molto utile, grazie! – kolistivra

Problemi correlati