Ich bereite mich gerade auf eine Betriebssysteme-Klausur vor, und da bin ich gerade am Punkt Relocation.
Also dabei werden ja wohl irgendwelche Adressen angepasst, wenn das Image (z.B. Exe,
DLL) an eine bestimmte Stelle im Speicher geladen wird.
Ich frag mich nur: Wo braucht man das überhaupt? Ich habe mich ja mal ein bisschen mit der Generierung von Assembler-Code befasst, und alle JMPs, CALLs usw. beziehen sich in der Regel auf relative Offsets an und nicht auf absolute Adressen.
Das kann nicht sein, denn dazu muessten alle Prozessoren das auch koennen. Das ist aber definitiv nicht der Fall. Du hast Dir vermutlich nur halbwegs aktuelle Intel-kompatible Prozessoren angeschaut.
Ich weiß, dass es auch zwar entsprechende Codes für absolute Adressen gibt
Genau.
Wozu/Wann verwendet man absolute Adressen überhaupt jemals? Der einzige Grund, den ich mir vorstellen könnte, wäre eine minimale Performancesteigerung, da man z.B., wenn man Code aus einer
DLL anspringen will, nicht erst einen Pointer dereferenzieren muss, um das Sprungziel zu ermitteln*. Aber das könnte man auch zur Not im Programm selbst regeln mit selbstmodifizierendem Code, Betriebssystemunterstützung bräuchte man eigentlich nicht.
Wie schon oben geschrieben: Nicht alle Prozessoren beherrschen relative Adressierung oder es ist ggf. ineffizienter als absolulte Adressierung. Selbst modifizierender Code wiederum ist ein Sicherheitsrisiko und wird deshalb von aktuellen Betriebssystemen teilweise blockiert.