2013-04-03 12 views
7

Per quanto ne so, un programma di assemblaggio è diviso per due - 1) il codice 2) i dati. Ora, quando eseguiamo il codice, diciamo su c \ C++, il codice viene caricato nella memoria e quindi la CPU avvia il codice, una per una, come un programma di assemblaggio. Le mie domande sono: 1. dove è memorizzato il codice c? Voglio dire, quando eseguo un programma in Visual Studio, il codice è caricato su uno di essi: Heap, Stack ..? 2. Quindi la memoria è praticamente divisa per il segmento Stack, Heap e Date, ma quando la CPU esegue il programma, come un programma di assemblaggio, sono tutti 1 programma di assemblaggio con la stessa area dati o sono formati in, diciamo 2 o 3 programma assebmly che salti da uno all'altro?I segmenti Heap, Stack e Dati si trovano sullo stesso programma di assemblaggio?

** Vorrei aggiungere questa domanda, forse chiarirà la mia intenzione: Quando avvio un programma C, il codice (istruzioni macchina) viene caricato nella memoria. Quindi, questo è un programma di assemblaggio. Ma come avviene la divisione della memoria? Voglio dire, come le diverse sezioni di memoria come Stack, Data segment, ecc. Modificano il programma di assemblaggio?

risposta

3

I segmenti o sezioni sono divisioni contigui in file oggetto ed eseguibili, proprio come capitoli di un libro. Le sezioni stack e bss non esistono nel file ma vengono create in fase di runtime.

Il punto delle sezioni è principalmente di dividere il programma in aree che il sistema operativo può proteggere in modi diversi. Al fine di organizzare per che, sezioni devono iniziare i limiti di pagina ed essere contigui nella memoria.

La base ("importanti") sezioni sono ...

testo o codice - il sistema operativo scriverà proteggere questa sezione, e dal momento che è immutabile, può anche condividere tra più processi o thread in esecuzione lo stesso eseguibile

dati - il sistema operativo Visualizza la r/w e non sarà direttamente parti si

bss - questa sezione è composta da dati inizializzati con zero.

pila - tipicamente separato dal programma, in genere cresce verso il basso da indirizzi più alti

Le ultime due sezioni non sono nel file eseguibile, perché non hanno bisogno di alcuna intiialization.

Se si chiede come vengono implementati, l'assemblatore e il linker creano un sommario e scrivono le sezioni in capitoli binari come in un libro. Il sistema operativo quindi li legge separatamente e li inserisce in diverse sezioni dello spazio degli indirizzi.

le specifiche e la terminologia sono diversi tra i sistemi Unix-like e Windows, ma i principi sono gli stessi.


1. Sì sì, copy-on-write permette per la condivisione dei dati troppo, un po '.

5

Da wikipedia:

L'architettura PC supporta un paio di aree di memoria di lettura-scrittura di base in un programma e cioè: Pila, dati e codice. L'heap è un'altra area dello spazio di indirizzi disponibile per un programma, da cui la memoria può essere allocata dinamicamente o liberata dal sistema operativo in risposta alle chiamate di sistema come malloc e gratuite.

vi consiglio di leggere la full article

C'è anche questa domanda su SO: How are the different segments like heap, stack, text related to the physical memory?

Inoltre, questi articoli possono essere la pena di leggere. Soprattutto l'ultimo:

per rispondere alle vostre domande:

1. in cui è memorizzato il codice C?

Nel segmento di codice.

2. Così la memoria è praticamente diviso a Stack, Heap e il segmento Data,

In modalità reale, sì. In modalità protetta ... dipende. Per semplificare estremamente: la memoria del programma è mappata alla memoria fisica. Ogni programma vive nel proprio spazio di indirizzamento.

vi consiglio questi articoli, se volete saperne di più:

3. ma quando la CPU esegue il programma, come un assemblaggio programma, sono tutti 1 programma di assemblaggio con la stessa area di dati o sono formati in, diciamo 2 o 3 programma di controllo che è j umps da uno all'altro?

No. Non ci sono salti. I registri dei processori puntano verso la prossima istruzione da eseguire. Altri sono rivolte verso la pila, ecc

+0

Grazie ma non è esattamente quello che sto chiedendo. – user2162550

+0

@ user2162550 L'aggiornamento ti è utile?Se no, quali ulteriori informazioni stai cercando? Per capire le basi, è meglio mantenere la mappatura della memoria in modalità reale. Le cose sono molto più semplici. – Jean

+0

"No. Non ci sono salti, i registri dei processori puntano verso la prossima istruzione da eseguire, altri puntano verso lo stack ecc." se ci sono altri registri che puntano allo stack, ecc. come dici tu, quindi ci sono diversi programmi di assemblaggio, e la CPU effettivamente salta da uno all'altro, non è corretto? – user2162550