2009-08-24 15 views
10

quando otteniamo l'indirizzo di una funzione o di qualsiasi oggetto per quella materia, è l'indirizzo virtuale o l'indirizzo fisico di quell'oggetto?: indirizzo fisico o virtuale

risposta

11

Stai chiedendo informazioni sugli indicatori in generale?

Sulla maggior parte dei sistemi operativi, sono indirizzi logici.

Il sistema operativo è responsabile della loro traduzione in indirizzi fisici tramite la memoria virtuale e il meccanismo di paging. Questo è trasparente per il programma. Ecco perché un programma fuorviato "supera i confini" e GPF.

Su alcuni vecchi sistemi (ad esempio, DOS), sarebbero fisici, consentendo di sovrascrivere la roba in altre parti della memoria.

7

Dipende dal sistema operativo ea quale livello è in esecuzione il codice.

Per un normale programma utente su un sistema operativo moderno, si otterrà l'indirizzo virtuale.

+1

ma se eseguo il seguente prog: int main() {int (* p)(); p = main; printf ("% p", p);} sta dando l'indirizzo come 0x80483c4, pensa che sia l'indirizzo fisico, perché l'indirizzo virtuale di main start a un indirizzo così grande ?? sto facendo funzionare questo su linux.plz chiarire se ho sbagliato ?? – mawia

+4

Ti stai sbagliando. Questo è un indirizzo virtuale. Nessuno ha detto che la tua funzione main() viene caricata all'indirizzo virtuale 0. Infatti, per impostazione predefinita nei binari ELF (usati in linux) il segmento di codice inizia all'indirizzo virtuale 0x80482c0, che sembra giusto (c'è qualche impostazione nascosta codice prima di main()). Tieni presente che lo spazio degli indirizzi virtuali è spesso non contiguo e gli indirizzi virtuali vengono assegnati solo quando li utilizzi. Solo perché il tuo programma è caricato a 0x80482c0 non significa che tutto tra lì e 0x0 è già stato allocato. –

+0

Se sei veramente interessato a sapere come il tuo programma è organizzato in memoria sotto Linux, dai una lettura: http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html –

Problemi correlati