Przeprowadzka (informatyka)

Relokacja to proces przypisywania adresów obciążenia dla zależnego od pozycji kodu i danych programu oraz dostosowywania kodu i danych w celu odzwierciedlenia przypisanych adresów. Przed pojawieniem się systemów wieloprocesowych, a nadal w wielu systemach wbudowanych, adresy obiektów zaczynały się bezwzględnie od znanej lokalizacji, często zera. Ponieważ systemy wieloprocesorowe dynamicznie łączą i przełączają się między programami, konieczna stała się możliwość przenoszenia obiektów przy użyciu kodu niezależnego od pozycji . Linker zwykle wykonuje relokację w połączeniu z rozpoznawaniem symboli , proces wyszukiwania plików i bibliotek w celu zastąpienia symbolicznych odniesień lub nazw bibliotek rzeczywistymi, użytecznymi adresami w pamięci przed uruchomieniem programu.

Relokacja jest zwykle wykonywana przez linker w czasie łączenia , ale może być również wykonana w czasie ładowania przez relokujący program ładujący lub w czasie wykonywania przez sam działający program . W niektórych architekturach całkowicie unika się relokacji, odraczając przypisanie adresu do czasu wykonania; jak na przykład w maszynach stosowych z zerową arytmetyką adresów lub w niektórych architekturach segmentowych, w których każda jednostka kompilacji jest ładowana do osobnego segmentu.

Segmentacja

Pliki obiektowe są podzielone na różne typy segmentów pamięci . Przykładowe segmenty obejmują segment kodu (.text) , zainicjowany segment danych (.data) , niezainicjowany segment danych (.bss) i inne. [ potrzebne wyjaśnienie ]

Tabela relokacji

Tablica relokacji to lista wskaźników utworzona przez tłumacza ( kompilator lub asembler ) i przechowywana w obiekcie lub pliku wykonywalnym. Każdy wpis w tabeli, czyli „naprawa”, jest wskaźnikiem do adresu bezwzględnego w kodzie wynikowym, który należy zmienić, gdy moduł ładujący przeniesie program, tak aby odnosił się on do właściwej lokalizacji. Poprawki mają na celu umożliwienie przeniesienia programu jako kompletnej jednostki. W niektórych przypadkach każda poprawka w tabeli jest sama względna w stosunku do adresu bazowego równego zero, zatem same poprawki muszą zostać zmienione w miarę poruszania się modułu ładującego po tabeli.

W niektórych architekturach poprawka, która przekracza pewne granice (takie jak granica segmentu) lub która nie jest wyrównana do granicy słowa, jest nielegalna i oznaczana przez linker jako błąd.

DOS i 16-bitowy Windows

Dalekie wskaźniki ( 32-bitowe wskaźniki z segmentem :offset, używane do adresowania 20-bitowej przestrzeni pamięci o pojemności 640 KB dostępnej dla programów DOS-owych ), które wskazują na kod lub dane w pliku wykonywalnym DOS ( EXE ), nie mają segmentów bezwzględnych, ponieważ rzeczywisty adres kodu/danych zależy od tego, gdzie program jest załadowany do pamięci i nie jest on znany do momentu załadowania programu.

Zamiast tego segmenty są wartościami względnymi w pliku DOS EXE. Segmenty te należy poprawić po załadowaniu pliku wykonywalnego do pamięci. Program ładujący EXE korzysta z tabeli relokacji, aby znaleźć segmenty, które wymagają dostosowania.

32-bitowy system Windows

W 32-bitowych systemach operacyjnych Windows udostępnianie tabel relokacji dla plików EXE nie jest obowiązkowe, ponieważ są one pierwszym obrazem ładowanym do wirtualnej przestrzeni adresowej i dlatego zostaną załadowane pod preferowanym adresem bazowym.

Zarówno w przypadku bibliotek DLL, jak i plików EXE, które zdecydowały się na randomizację układu przestrzeni adresowej (ASLR), technikę ograniczania exploitów wprowadzoną w systemie Windows Vista , tabele relokacji ponownie stają się obowiązkowe ze względu na możliwość dynamicznego przenoszenia pliku binarnego przed wykonaniem, nawet jeśli są nadal pierwszą rzeczą ładowaną w wirtualnej przestrzeni adresowej.

64-bitowy system Windows

Podczas uruchamiania natywnych 64-bitowych plików binarnych w systemie Windows Vista i nowszych, ASLR jest obowiązkowy [ potrzebne źródło ] , dlatego kompilator nie może pominąć sekcji relokacji.

Systemy typu Unix

Format pliku wykonywalnego i format biblioteki współdzielonej (ELF) Executable and Linkable Format (ELF) używany w większości systemów uniksowych umożliwia zdefiniowanie kilku typów relokacji.

Procedura relokacji

Linker odczytuje informacje o segmentach i tabele relokacji z plików obiektowych i dokonuje relokacji poprzez:

  • łączenie wszystkich segmentów wspólnego typu w jeden segment tego typu
  • przypisanie unikalnych adresów wykonawczych do każdej sekcji i każdego symbolu, nadanie całemu kodowi (funkcjom) i danym (zmiennym globalnym) unikalnych adresów wykonawczych [ potrzebne wyjaśnienie ]
  • odnosząc się do tabeli relokacji , aby zmodyfikować [ dlaczego? ] , tak aby wskazywały prawidłowe [ wymagane wyjaśnienie ] adresy czasu wykonania.

Przykład

Poniższy przykład wykorzystuje architekturę MIX Donalda Knutha i język asemblera MIXAL. Zasady są takie same dla każdej architektury, choć szczegóły ulegną zmianie.

Relocation example.tif
  • (A) Program SUBR jest kompilowany w celu utworzenia pliku obiektowego (B), pokazanego zarówno jako kod maszynowy, jak i asembler. Kompilator może uruchomić skompilowany kod w dowolnej lokalizacji, często w lokalizacji 1, jak pokazano. Lokalizacja 13 zawiera kod maszynowy dla instrukcji skoku do instrukcji ST w lokalizacji 5.
  • (C) Jeśli SUBR zostanie później połączony z innym kodem, może zostać zapisany w lokalizacji innej niż 1. W tym przykładzie linker umieszcza go w lokalizacji 120. Adres w instrukcji skoku, który znajduje się teraz w lokalizacji 133, musi zostać przeniesiony aby wskazać nową lokalizację kodu instrukcji ST , teraz 125. [1 61 pokazane w instrukcji to reprezentacja 125 w kodzie maszynowym MIX].
  • (D) Kiedy program jest ładowany do pamięci w celu uruchomienia, może zostać załadowany w innym miejscu niż to przypisane przez linker. W tym przykładzie SUBR znajduje się teraz w lokalizacji 300. Adres w instrukcji skoku, obecnie pod adresem 313, musi zostać ponownie przeniesiony, tak aby wskazywał zaktualizowaną lokalizację ST , 305. [4 49 to reprezentacja maszyny MIX dla 305].

Zobacz też

Dalsza lektura