2013-03-27 9 views
5

Questa è una questione molto basilare da quando ho sentito parlare del concetto di memoria virtuale e fisica nella mia classe OS. Ora so che al momento del caricamento e del tempo di compilazione, lo schema di indirizzi virtuali e di indirizzi logici è lo stesso, ma al momento dell'esecuzione differiscono.Quale tipo di indirizzo è stato restituito quando si applica la e commerciale a una variabile o un tipo di dati in C/C++ o in qualsiasi altra lingua del genere?

Prima di tutto perché è utile generare indirizzo virtuale in fase di compilazione e caricamento e cosa viene restituito quando si applica l'operatore commerciale per ottenere l'indirizzo di una variabile, tipi di dati ingenui, tipo definito dall'utente e indirizzi di definizione della funzione ?

E in che modo il sistema operativo esegue il mapping esattamente da indirizzo virtuale a indirizzo fisico quando lo fa? Queste domande sono state sottratte alla curiosità e mi piacerebbe un po 'di intuizioni profonde e profonde considerando l'OS moderno, Com'è stato agli inizi OS?. Sono solo C/C++ specifico dato che non ne so molto di altre lingue.

+2

L'indirizzo di una variabile non è determinato al momento della compilazione ... che dovrebbe rispondere alla maggior parte di questo. –

+0

"Ora so che al momento del caricamento e della compilazione, viene generato l'indirizzo virtuale ma al momento dell'esecuzione viene generato l'indirizzo fisico?" - No. Se lo pensi, allora non capisci quali sono gli indirizzi virtuali e fisici e devi studiare ulteriormente il problema. La risposta alla tua domanda è "indirizzi virtuali" ... questo è l'unico tipo di programma di indirizzi visualizzato o trattato (eccetto per le eccezioni tecniche che riguardano alcune chiamate di sistema su alcuni sistemi). –

+0

@JimBalter: l'ho corretto. –

risposta

3

Gli indirizzi fisici si verificano nell'hardware, non nel software. Un'eccezione possibile/occasionale si trova nel kernel del sistema operativo. Fisico significa che è l'indirizzo che vedono il bus di sistema e i chip di RAM.

Non solo gli indirizzi fisici sono inutili per il software, ma potrebbe essere un problema di sicurezza. Essere in grado di accedere a qualsiasi memoria fisica senza la traduzione degli indirizzi e conoscere gli indirizzi di altri processi, consentirebbe l'accesso senza restrizioni alla macchina.

Detto questo, le macchine più piccole o incorporate potrebbero non avere memoria virtuale e alcuni sistemi operativi meno recenti hanno consentito alle librerie condivise di specificare la loro posizione di memoria fisica finale. Tali politiche danneggiano la sicurezza e sono obsolete.

+0

Il punto di rilascio della sicurezza è molto significativo. –

+0

Gli indirizzi fisici sono irrilevanti per la sicurezza. Il controllo dell'accesso è rilevante. Ogni processo potrebbe condividere uno spazio di indirizzo a condizione che l'hardware impedisca a un processo di accedere alla memoria di un altro processo. Infatti, matematicamente, la combinazione di (ID di processo, indirizzo virtuale) è identica a un singolo spazio di indirizzo (in cui l'ID di processo è concatenato con l'indirizzo virtuale). –

+0

@EricPostpischil Idealmente, sì, ma non aiuta quando un programma malevolo sa dove trovare le cose che non dovrebbe, una volta che ha le chiavi del castello. In termini pratici, il malware * otterrà l'accesso come root, quindi vale la pena di banalizzare l'applicazione delle patch alle librerie condivise. – Potatoswatter

4

A livello di applicazione (ad esempio processo di applicazione Linux), esistono solo indirizzi virtuali. Le variabili locali sono in pila (o nei registri). Lo stack è organizzato in call frames. Il compilatore genera l'offset di una variabile locale all'interno del frame di chiamata corrente, in genere un offset relativo al puntatore dello stack o al registro del puntatore del frame (quindi l'indirizzo di una variabile locale, ad esempio in una funzione ricorsiva, è noto solo al runtime).

Prova ad eseguire una funzione ricorsiva nel tuo debugger gdb e visualizza l'indirizzo di alcune variabili locali per comprenderne altre. Prova anche il comando bt di gdb.

Tipo

cat /proc/self/maps 

per capire lo spazio di indirizzi (e virtual memory mappatura) del processo in esecuzione che cat comando.

All'interno del kernel, la mappatura dagli indirizzi virtuali alla RAM fisica viene eseguita mediante il codice che implementa paging e guida lo MMU. Alcune chiamate di sistema (in particolare mmap(2) e altre) possono modificare lo spazio degli indirizzi del processo.

Alcuni primi computer (ad esempio quelli del 1950-s o all'inizio del 1960-s come CAB 500 o IBM 1130 o IBM 1620) non ha avuto alcun MMU, anche l'originale Intel 8086 non avevano alcuna protezione della memoria. A quel tempo (1960-s), C non esisteva. Sui processori senza MMU non si dispone di indirizzi virtuali (solo quelli fisici, incluso il codice C incorporato per un produttore di lavatrici). Alcune macchine potrebbero proteggere la scrittura in alcuni banchi di memoria tramite interruttori fisici. Oggi alcuni processori economici di fascia bassa (quelli delle lavatrici) non hanno MMU. Il più economico microcontrollers non ha MMU. Spesso (ma non sempre), il programma è in alcune ROM quindi non può essere sovrascritto dal codice buggy.

+1

Um, Intel 8086 non aveva MMU e sono stati prodotti molto più recentemente rispetto agli anni '50. Diamine, molte CPU incorporate non hanno ancora MMU. –

+0

Era più per i micro computer che per i computer –

+0

I microcomputer sono computer. Ogni computer desktop, laptop, tablet e telefono è un microcomputer. –