Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#1

Wozu Relocation?

  Alt 16. Mär 2014, 14:31
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. Ich weiß, dass es auch zwar entsprechende Codes für absolute Adressen gibt, hab die aber noch nie in Verwendung gesehen. Ist Relocation nur für diese Instruktionen nötig, die sowieso in der Praxis praktisch nie verwendet werden? Bei relativen Sprüngen wüsste ich nicht, warum da etwas angepasst werden müsste.

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.

* Häufig macht man das ja so (in der Art):
Delphi-Quellcode:
type
  TMyAPICall = procedure (Foo: DWord); cdecl;
var
  MyAPICall: TMyAPICall = nil;
initialization
  MyAPICall := GetProcAdress(...);
Delphi-Quellcode:
MyAPICall(42);
// =>
// MOV EAX, [MyAPICall]; <- dereferenzierung
// CALL EAX;
// (oder so ähnlich zumindest)
  Mit Zitat antworten Zitat