Přemístění (výpočetní technika) - Relocation (computing)

Přemístění je proces přiřazování zatěžovacích adres kódu závislého na poloze a datům programu a úpravy kódu a dat tak, aby odrážely přiřazené adresy. Před příchodem víceprocesních systémů a ještě v mnoha vestavěných systémech adresy pro objekty začínaly absolutně na známém místě, často na nule. Protože systémy s více procesy dynamicky propojují a přepínají mezi programy, bylo nutné umět přemístit objekty pomocí kódu nezávislého na poloze . Linker se obvykle provádí přemisťování ve spojení s rozlišením symbol , proces vyhledávání souborů a knihovny nahradit symbolické odkazy nebo názvy knihoven se skutečnými použitelných adres v paměti před spuštěním programu.

Přemístění obvykle provádí linker v době propojení , ale lze jej také provést v době načítání přemístěním zavaděče nebo v době běhu samotným spuštěným programem . Některé architektury se vyhýbají přemístění úplně tím, že odloží přiřazení adresy na dobu běhu; toto je známé jako aritmetika nulové adresy .

Segmentace

Soubory objektů jsou segmentovány do různých typů paměťových segmentů . Mezi příklady segmentů patří segment kódu (.text) , inicializovaný datový segment (.data) , neinicializovaný datový segment (.bss ) nebo jiné.

Relokační tabulka

Tabulka přemístění je seznam ukazatelů vytvořených překladačem ( kompilátorem nebo assemblerem ) a uložených v objektu nebo spustitelném souboru. Každý záznam v tabulce nebo „oprava“ je ukazatelem na absolutní adresu v kódu objektu, který je třeba změnit, když zavaděč přemístí program tak, aby odkazoval na správné umístění. Opravy jsou navrženy tak, aby podporovaly přemístění programu jako kompletní jednotky. V některých případech je každá oprava v tabulce relativní vůči základní adrese nula, takže samotné opravy je třeba změnit, jak se zavaděč pohybuje tabulkou.

V některých architekturách je oprava, která překračuje určité hranice (například hranice segmentu) nebo která není zarovnána na hranici slova, nezákonná a je spojovačem označena jako chyba.

DOS a 16bitová Windows

Daleké ukazatele ( 32bitové ukazatele se segmentem : offset, používané k adresování 20bitového 640 kB paměťového prostoru dostupného pro programy DOS ), které ukazují na kód nebo data v spustitelném souboru DOS ( EXE ), nemají absolutní segmenty, protože skutečná adresa kódu/dat závisí na tom, kde je program načten do paměti, a to není známo, dokud se program nenačte.

Místo toho jsou segmenty relativní hodnoty v souboru EXE DOS. Tyto segmenty je třeba opravit, když byl spustitelný soubor načten do paměti. Zavaděč EXE používá relokační tabulku k vyhledání segmentů, které je třeba upravit.

32bitová Windows

U 32bitových operačních systémů Windows není povinné poskytovat relokační tabulky pro soubory EXE, protože jsou prvním obrazem načteným do virtuálního adresního prostoru, a proto budou načteny na jejich preferovanou základní adresu.

U knihoven DLL i EXE, které se přihlásily k randomizaci rozložení adresního prostoru (ASLR) - technika zmírňování zneužití zavedená v systému Windows Vista, se relokační tabulky opět stanou povinnými kvůli možnosti, že binární soubor lze před spuštěním dynamicky přesouvat, přestože jsou stále první věcí načtenou ve virtuálním adresním prostoru.

64bitová Windows

Při spuštění nativních 64bitových binárních souborů v systému Windows Vista a novějších je ASLR povinné, a proto kompilátor nemůže vynechat sekce přemístění.

Unixové systémy

Spustitelný a Propojení Format (ELF) spustitelného formátu a sdílené formát knihovna používá většina unixových systémů umožňuje několik druhů přemístění musí být definovány.

Postup přemístění

Linker čte informace o segmentech a tabulky přemístění v souborech objektů a provádí přemístění podle:

  • sloučení všech segmentů běžného typu do jednoho segmentu tohoto typu
  • přiřazení jedinečných adres doby běhu každé sekci a každému symbolu, přičemž všechny kódy (funkce) a data (globální proměnné) budou dávat jedinečné adresy běhu
  • podle tabulky přemístění upravit symboly tak, aby ukazovaly na správné adresy doby běhu.

Příklad

Následující příklad používá Donald Knuth ‚s MIX architekturu a MIXAL assembleru. Principy jsou stejné pro jakoukoli architekturu, i když se detaily změní.

Příklad přemístění.tif
  • (A) Program SUBR je kompilován tak, aby vytvářel objektový soubor (B), zobrazený jako strojový kód i jako assembler. Kompilátor může spustit zkompilovaný kód na libovolném místě, často umístění 1, jak je znázorněno. Umístění 13 obsahuje strojový kód pro skokovou instrukci k příkazu ST v umístění 5.
  • (C) Pokud je SUBR později propojen s jiným kódem, může být uložen na jiném místě než 1. V tomto případě jej linker umístí na místo 120. Adresu v instrukci skoku, která je nyní na místě 133, je třeba přemístit aby ukázal na nové umístění kódu pro příkaz ST , nyní 125. [1 61 ukázaný v instrukci je reprezentace strojového kódu MIX 125].
  • (D) Když je program načten do paměti ke spuštění, může být načten na jiném místě, než je přiřazeno linkerem. Tento příklad ukazuje SUBR nyní v umístění 300. Adresu v instrukci skoku, nyní na 313, je třeba znovu přemístit, aby ukazovala na aktualizované umístění ST , 305. [4 49 je strojní reprezentace MIX 305].

Viz také

Reference

Další čtení