Begründung dafür, dass das Textsegment im Benutzerbereich bei 0x8048000 beginnt

Begründung dafür, dass das Textsegment im Benutzerbereich bei 0x8048000 beginnt

Ich habe irgendwo gelesen, dass (zumindest seit Linux v. 2.6) der gesamte User-Space-Code an der Ladeadresse 0x8048000 im Adressraum des virtuellen Speichers platziert wird.

Meine eigenen Beobachtungen bestätigen dies. Ich habe eine

cat /proc/......../maps

für mehrere Prozesse und der allererste Abschnitt eines Prozessprogramms textbeginnt immer bei „0x8048000“.

Darüber hinaus scheinen der Startcode der C-Bibliothek und alle anderen Laufzeit-Goodies alle nach diesem Standardwert zugeordnet zu sein.

Dies entspricht fast 128 M Adressraum, was nicht viel ist, wenn man bedenkt, dass 0xC0000000 – 0x8048000 immer noch fast 3 G Adressraum für Benutzerbereichsdaten sind.

Meine Frage ist also: Warum?

Da es sich hier um virtuelle Adressen handelt, sind Störungen oder Überschneidungen mit anderen Programmen per Definition der Funktionsweise der VM ausgeschlossen.

Gibt es einige feste/Standardzuordnungen im Bereich 0x00000000 bis 0x8048000?

Abgesehen von der Tatsache, dass die Standardstartadresse auf eine Seitengrenze fällt, was ist der Grund dafür, diese Zahl und keinen anderen Wert zu wählen?

Antwort1

Ich gebe zu, dass das Folgende keine großartige Antwort ist, aber ich glaube, der Wert 0x8048000 ist verankert in derELF-Spezifikation. Siehe Abbildungen A.4, A.5 und A.6 in diesem Dokument. DieSystem V ABI Intel 386 Architektur-Ergänzungist ebenfalls auf 0x8048000 standardisiert. Siehe Seite 3-22, Abb. 3-25. 0x804800 ist als unterste Textsegmentadresse/oberste Stapeladresse vorgeschrieben. Und das ist an und für sich schon seltsam, da Stapel normalerweise in den oberen Adressen des Speicherbereichs eines Prozesses festgelegt werden, und Linux ist da keine Ausnahme.

Sie können den GNU-Linker dazu bringen, ldeine ELF-ausführbare Datei zu erstellen, sodass der Kernel sie einer etwas niedrigeren oder etwas höheren Adresse zuordnet. Die Vorgehensweise hierfür variiert von Version zu Version von GCC und ld, lesen Sie daher die Manpages sorgfältig durch. Dies deutet darauf hin, dass 0x8048000 nicht von einer Hardwareanforderung, sondern von anderen Überlegungen herrührt.

verwandte Informationen