2010-06-03 17 views
28

Disassemblare un binario ELF su un sistema Ubuntu x86 Non ho potuto fare a meno di notare che la sezione del codice (.text) parte dall'indirizzo virtuale 0x8048000 e tutti gli indirizzi di memoria inferiori sembrano non essere utilizzati.Perché gli indirizzi di memoria virtuale per i binari Linux iniziano a 0x8048000?

Questo sembra essere piuttosto dispendioso e tutto ciò che appare su Google è folklore involving STACK_TOP o protezione contro i dereferenze con puntatore nullo. L'ultimo caso sembra che possa essere risolto utilizzando una singola pagina invece di lasciare un intervallo di 128 MB.

Quindi la mia domanda è questa: c'è una risposta definitiva al motivo per cui il layout è stato fissato a questi valori o è solo una scelta arbitraria?

+0

Non conosco la risposta effettiva; ma forse questo articolo potrebbe aiutare o almeno fornire una lettura interessante! http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html –

+0

possibile duplicato di [Perché l'indirizzo virtuale del punto di ingresso dell'esecuzione ELF del modulo 0x80xxxxx e non zero 0x0?] (http: // stackoverflow .com/domande/2187484/why-è-il-elf-esecuzione-entry-point-virtual-address-of-the-form-0x80xxxxx-e-n) –

risposta

24

Dal Linkers and loaders libro:

Su sistemi 386, l'indirizzo di base testo è 0x08048000, che permette una ragionevolmente grande pila sotto il testo pur restando sopra indirizzo 0x08000000, permettendo maggior parte dei programmi di utilizzare un solo secondo tabella di pagina di livello. (Ricordare che sul 386, ogni tabella di secondo livello mappa gli indirizzi 0x00400000.)