Perché gli indirizzi di memoria virtuale per i binari di Linux partono da 0x8048000?

Disassemblando 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.

Questo sembra essere piuttosto dispendioso e tutto ciò che emerge da Google è il folclore che coinvolge STACK_TOP o la protezione contro le dereferenze con il 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 perché il layout è stato fissato a questi valori o è solo una scelta arbitraria?

Dal libro Linkers and loaders :

Su 386 sistemi, l’indirizzo di base del testo è 0x08048000, che consente uno stack ragionevolmente grande sotto il testo pur rimanendo sopra l’indirizzo 0x08000000, consentendo alla maggior parte dei programmi di utilizzare una singola tabella di pagina di secondo livello. (Ricorda che sul 386, ogni tabella di secondo livello mappa gli indirizzi 0x00400000.)