2010-07-09 18 views
13

Quando si parla di memoria di un processo, ho sentito parlare di cose come memoria di codice e memoria dati.Come viene gestita la memoria del codice?

E per la memoria dati , ci sono 2 principali meccanismi di gestione, stack e heap.

Ora mi chiedo come è gestita la memoria codice ? E chi lo gestisce?

Scusami se la mia affermazione non è chiara.

Grazie.

risposta

17

Raccomando http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory (e gli altri articoli relativi alla memoria) se sei interessato a saperne di più sui dettagli del processo di gestione della memoria.

codice di memoria = segmento Testo

Notate come lo spazio di indirizzi è di 4 GB. Quando il kernel crea un processo gli dà memoria virtuale. Di seguito è riportato un esempio di un sistema operativo a 32 bit. Il kernel gestisce quali indirizzi vengono mappati sulla RAM effettiva tramite il processore MMU. Quindi, il kernel e l'MMU gestiscono la memoria del codice, così come gestiscono l'intero spazio di indirizzamento di un processo.

Borrowed from duartes.org http://static.duartes.org/img/blogPosts/linuxFlexibleAddressSpaceLayout.png

+1

link molto bello ... – wrapperm

+0

I secondo wrapperm. :) – smwikipedia

+2

Il layout è generalmente impostato (e gestito) dal linker piuttosto che dal kernel.Il kernel legge semplicemente le informazioni nell'immagine eseguibile e imposta di conseguenza la mappa della memoria. Il linker dinamico verrà mappato se l'eseguibile lo specifica (cosa che fa per gli eseguibili collegati dinamicamente) e gestisce un sacco di cose. Potresti considerare il linker come parte del sistema operativo, ma potresti creare un linker personalizzato che fa tutto ciò che vuoi, –

2

È gestito dal sistema operativo. Quando viene eseguito un programma, il codice viene caricato da un file eseguibile in un indirizzo di memoria. A seconda della natura del programma, alcune modifiche vengono applicate alle sezioni di codice, ad es. salti alle librerie collegate dinamicamente sono risolti.

Come proposto da Space_C0wb0y, consultare en.wikipedia.org/wiki/Dynamic_linker per i dettagli su ciò che sta accadendo.

+1

Controlla questo articolo di wikipedia sul caricamento dinamico per alcune informazioni su ciò che sta accadendo: http://en.wikipedia.org/wiki/Dynamic_linker –

+0

Grazie Space_C0wb0y, quel collegamento è utile. – smwikipedia

0

Il sistema operativo fornisce così chiamata chiamate di sistema per allocare dinamicamente la memoria (malloc, libero, ecc), ma fornisce anche il meccanismo per caricare ed eseguire il programma.

Quando il programma viene caricato dall'OS, il segmento di testo (memoria di codice) viene impostato e la memoria allocata staticamente nel programma è immediatamente disponibile. Quando il codice chiama le funzioni, le variabili (allocate staticamente) nelle funzioni vengono allocate nello stack e la memoria allocata dinamicamente (usando malloc() per esempio) viene allocata nell'heap. Durante il periodo di esecuzione del programma, è responsabilità del programmatore (il programmatore) gestire la memoria (la mancanza di ciò causerà perdite di memoria e alla fine causerà l'esaurimento della memoria di un programma a esecuzione prolungata o in caso di arresto anomalo casi, a seconda del sistema operativo, abbattere l'intero sistema operativo con esso).

Vedi anche questo articolo: http://www.maxi-pedia.com/what+is+heap+and+stack

+0

L'heap non è gestito dal kernel sulla maggior parte dei sistemi operativi. Solitamente si tratta di un componente puramente in modalità utente che risiede in una sorta di libreria di runtime (ad esempio ntdll, libc) che quindi effettua chiamate di sistema a funzioni di gestione della pagina di livello inferiore (ad esempio NtAllocateVirtualMemory). – wj32

4

La memoria di codice non ha bisogno di gestione perché non cambia. Quando un file eseguibile viene caricato nello spazio degli indirizzi, il codice viene semplicemente letto dal file eseguibile in memoria. In effetti, su sistemi operativi moderni, il segmento di codice è solo la memoria mappata sul file eseguibile.

+1

Bene, bene .... dipende dal sistema operativo. Come ricordo dal libro di A. Silberschatz sui sistemi operativi, alcune architetture potrebbero essere in grado di spostare il codice, ma deve essere trasparente per il programmatore. Anche il caricamento e lo scaricamento di librerie dinamiche comporta una certa gestione della memoria del codice. – doc

+0

@doc: vero, ma varia tra sistema operativo e architettura. Quello che ho detto sopra si basa principalmente su come ottenere informazioni sul formato di file eseguibile di OS X. – JeremyP

Problemi correlati