Áthelyezés (számítástechnika) - Relocation (computing)

Az áthelyezés az a folyamat, amikor terhelési címeket rendelnek hozzá egy program pozíciófüggő kódjához és adataihoz, és a kódot és az adatokat a hozzárendelt címekhez igazítják. A többfolyamatos rendszerek megjelenése előtt, és még mindig sok beágyazott rendszerben, az objektumok címei abszolút egy ismert helyen kezdődtek, gyakran nulla. Mivel a többprocesszoros rendszerek dinamikusan kapcsolódnak és váltanak a programok között, szükségessé vált, hogy az objektumokat helyfüggetlen kóddal át lehessen helyezni . A linker általában az áthelyezést a szimbólumfeloldással együtt hajtja végre , a fájlok és könyvtárak keresésének folyamata, hogy a szimbolikus hivatkozásokat vagy könyvtárak neveit tényleges használható címekre cserélje a memóriában egy program futtatása előtt.

Relocation általában úgy történik, a kapcsoló a kapcsolat ideje , de ez is elvégezhető betöltési időt egy áthelyezésével rakodó , vagy futás közben a futó program maga . Egyes architektúrák teljesen elkerülik az áthelyezést azzal, hogy a cím -hozzárendelést a futási időre halasztják ; ezt nulla cím aritmetikának nevezik .

Szegmentáció

Az objektumfájlok különböző memóriaszegmens típusokba vannak osztva . A példaszegmensek közé tartozik a kódszegmens (.text) , az inicializált adatszegmens (.data) , az inicializálatlan adatszegmens (.bss ) vagy mások.

Áthelyezési táblázat

Az áthelyezési táblázat a fordító ( fordító vagy összeállító ) által létrehozott és az objektumban vagy a végrehajtható fájlban tárolt mutatók listája . A táblázat minden bejegyzése vagy "javítás" egy mutató az abszolút címre az objektumkódban, amelyet meg kell változtatni, amikor a betöltő áthelyezi a programot, hogy az a megfelelő helyre utaljon. A javításokat úgy tervezték, hogy támogassák a program teljes egységként történő áthelyezését. Bizonyos esetekben a táblázat minden javítása önmagában a nulla alapcímhez képest van, ezért magukat a javításokat meg kell változtatni, amikor a betöltő áthalad a táblán.

Bizonyos architektúrákban az olyan javítás, amely átlép bizonyos határokat (például egy szegmenshatárt), vagy nem igazodik egy szóhatárhoz, illegális, és a linkelő hibaként jelzi.

DOS és 16 bites Windows

A távoli mutatók ( 32 bites mutatók szegmens : eltolás, a DOS programok számára rendelkezésre álló 20 bites 640 KB memóriahely kezelésére ), amelyek a DOS futtatható fájlon ( EXE ) található kódra vagy adatra mutatnak , nem rendelkeznek abszolút szegmensekkel, mert A kód/adatok tényleges címe attól függ, hogy a programot hol töltötték be a memóriába, és ez a program betöltéséig nem ismert.

Ehelyett a szegmensek relatív értékek a DOS EXE fájlban. Ezeket a szegmenseket ki kell javítani, amikor a végrehajtható fájl betöltődött a memóriába. Az EXE betöltő egy áthelyezési táblát használ a kiigazítandó szegmensek megkereséséhez.

32 bites Windows

A 32 bites Windows operációs rendszereknél nem kötelező áthelyezési táblázatokat biztosítani az EXE fájlokhoz, mivel ezek az első kép, amelyet a virtuális címtérbe töltenek be, és így a kívánt alapcímre töltődnek be.

Mind a DLL -ek, mind az EXE -ek esetében, amelyek a címtér -elrendezés randomizálását (ASLR) választják - ez a Windows Vista rendszerben bevezetett kizsákmányolás -csökkentési technika, az áthelyezési táblák ismét kötelezővé válnak, mivel lehetséges, hogy a bináris fájl dinamikusan áthelyezhető a végrehajtás előtt, annak ellenére, hogy továbbra is az első dolog, ami betöltődik a virtuális címtérbe.

64 bites Windows

Ha natív 64 bites bináris fájlokat futtat Windows Vista vagy újabb verzióin, az ASLR kötelező, és így a fordító nem hagyhatja ki az áthelyezési szakaszokat.

Unix-szerű rendszerek

A legtöbb Unix-szerű rendszer által használt Végrehajtható és összekapcsolható formátum (ELF) végrehajtható formátum és megosztott könyvtári formátum lehetővé teszi többféle áthelyezés meghatározását.

Áthelyezési eljárás

A linker beolvassa a szegmensinformációkat és az áthelyezési táblázatokat az objektumfájlokban, és végrehajtja az áthelyezést:

  • az összes közös típusú szegmens egyesítése az adott típusú egyetlen szegmensbe
  • egyedi futási időcímek hozzárendelése minden szakaszhoz és szimbólumhoz, minden kódnak (funkciónak) és adatnak (globális változók) egyedi futási időcímek megadása
  • hivatkozva az áthelyezési táblára a szimbólumok módosításához úgy, hogy azok a helyes futási időcímekre mutassanak.

Példa

A következő példa Donald Knuth „s MIX építészet és MIXAL assembly. Az elvek ugyanazok minden architektúránál, bár a részletek változnak.

Áthelyezési példa.tif
  • (A) A program SUBR -t úgy állítjuk össze, hogy létrehozza a (B) objektumfájlt, amely gépi kódként és összeszerelőként is megjelenik. A fordító elindíthatja a fordított kódot tetszőleges helyen, gyakran az 1. helyen, ahogy az látható. A 13. hely tartalmazza az 5. utasítás ST utasításához való ugrási utasítás gépkódját az 5. helyen.
  • (C) Ha a SUBR -t később más kóddal kapcsolják össze, akkor az 1 -től eltérő helyen tárolható. Ebben a példában a linker a 120 -as helyre helyezi. Az ugrási utasításban szereplő címet, amely most a 133 -as helyen van, át kell helyezni hogy az ST utasítás kódjának új helyére mutasson , most 125. [1 61 az utasításban látható 125 -ös MIX gépi kódábrázolás].
  • (D) Amikor a programot betöltik a memóriába a futtatáshoz, akkor a linker által kijelölt helytől eltérő helyre lehet betölteni. Ez a példa a SUBR -t mutatja most a 300 -as helyen. Az ugrásutasítás 313 -as címét újra át kell helyezni, hogy az az ST , 305 frissített helyére mutasson. [4 49 a 305 -ös MIX gépi ábrázolása].

Lásd még

Hivatkozások

További irodalom