Scopo dell'indirizzo di base?

3

Qual è lo scopo di un indirizzo di base in un file eseguibile?

Ad esempio, nel linker di Microsoft Visual C ++, puoi impostare un indirizzo di base o utilizzare il valore predefinito di 0x1000000 . Ma con la memoria virtuale, perché sarebbe necessario un indirizzo di base?

Perché non dovresti semplicemente collegarlo a 0x0 e mettere la routine di inizializzazione ( mainCRTStartup su Windows) lì che farebbe in modo che scrivere su NULL ( 0x0 ) semplicemente sovrascrivere la routine di avvio (un metodo che non sarà mai più chiamato). Inoltre, puoi semplicemente impostare le pagine del codice da eseguire solo su un processore x86, in modo che la scrittura possa causare un'eccezione.

    
posta Cole Johnson 25.01.2013 - 17:17
fonte

2 risposte

5

Tradizionalmente gli eseguibili vengono mappati all'indirizzo di destinazione desiderato, se non è ancora in uso. Non puoi mappare a 0, poiché la parte più bassa dello spazio degli indirizzi è riservata (causa l'arresto anomalo del dereferenziamento del puntatore nullo, invece dell'accesso alla memoria che non avevi intenzione di acquisire).

Poiché si carica un singolo file .exe in un processo, non è necessario utilizzare un unico indirizzo di base. Quindi la maggior parte dei file .exe mantiene il valore predefinito 0x400000 . Spesso manca una tabella di riposizionamento e quindi deve essere caricato a quell'indirizzo.

Per le DLL le cose sono un po 'più complicate, dal momento che il loro indirizzo di destinazione può essere già in uso. In tal caso verranno mappati su un altro indirizzo e una tabella di riposizionamento verrà utilizzata per correggere parti del suo codice che ora devono puntare ad altri indirizzi. Questa correzione costa sia la CPU che la memoria (gli eseguibili sono mappati come copia-su-scrittura e la correzione significa che l'applicazione ottiene una copia univoca della dll). Gli indirizzi di base per le DLL vengono in genere scelti per evitare sovrapposizioni e quindi il trasferimento.

Al giorno d'oggi le cose sono diverse. La RAM è molto più economica, quindi il costo della delocalizzazione non è più così importante. D'altra parte la sicurezza è molto importante ora. Quindi usiamo un processo chiamato ASLR dove gli eseguibili sono mappati a indirizzi non guidabili. Questo rende l'indirizzo di base specificato dall'eseguibile piuttosto privo di significato.

Quindi gli executables che possono scegliere il proprio indirizzo di base è un'ottimizzazione delle prestazioni che è stata utile su computer lenti con poca RAM ma non è più utile nei sistemi moderni poiché MS ha deciso di scambiare un po 'di prestazioni per una maggiore sicurezza.

    
risposta data 25.01.2013 - 19:16
fonte
2

Gli indirizzi di base sono necessari per calcolare gli indirizzi virtuali degli oggetti nel file dopo sono stati caricati nella memoria virtuale. Ricorda che il linker potrebbe dover collegare molti file PE, ognuno dei quali potrebbe richiedere di essere caricato a 0x0 - ciò significa che il file PE dovrà far fronte al fatto di trovarsi in posti diversi nella memoria virtuale.

L'indirizzo di base viene utilizzato per rendere gli altri indirizzi relativi, quindi se si ha un vtable, si carica l'indirizzo 0x1000FF00, ad esempio. Quindi, quando il linker dinamico rebase l'eseguibile perché c'era già qualcosa, sa come modificare questo indirizzo in modo che punti alla nuova posizione.

    
risposta data 25.01.2013 - 19:00
fonte

Leggi altre domande sui tag