Siirto (tietojenkäsittely) - Relocation (computing)

Uudelleensijoittaminen on prosessi, jossa kuormitusosoitteet määritetään ohjelman sijaintiriippuvaiselle koodille ja ohjelman tiedoille ja säädetään koodi ja tiedot vastaamaan osoitettuja osoitteita. Ennen moniprosessijärjestelmien tuloa ja monissa sulautetuissa järjestelmissä objektien osoitteet olivat absoluuttisia alkaen tunnetusta paikasta, usein nolla. Koska moniprosessointijärjestelmät linkittävät ja vaihtavat ohjelmia dynaamisesti, tuli tarpeelliseksi pystyä siirtämään kohteita paikasta riippumattoman koodin avulla . Linkkeri yleensä tekee siirtäminen yhdessä symbolin resoluutio , hakuprosessi tiedostot ja kirjastot korvata symbolinen viittauksia tai nimet kirjastojen kanssa käytettävissä olevan osoitteet muistiin ennen käynnissä ohjelma.

Siirtäminen tehdään tyypillisesti linkkerillä linkin aikaa , mutta se voi myös olla tehty latausajan jonka siirtämällä kuormaajan , tai ajon aikana etenevästä ohjelmasta itse . Jotkut arkkitehtuurit välttävät siirtämisen kokonaan lykkäämällä osoitteen osoittamisen ajoaikaan ; tätä kutsutaan nollaosoitteen aritmeettiseksi .

Segmentointi

Objektitiedostot on jaettu eri muistisegmenttityyppeihin . Esimerkkejä segmenteistä ovat koodisegmentti (.text) , alustettu datasegmentti (.data) , alustamaton datasegmentti (.bss ) tai muut.

Siirtotaulukko

Siirtotaulukko on luettelo osoittimista , jotka kääntäjä ( kääntäjä tai kokoonpanija ) on luonut ja jotka on tallennettu objektiin tai suoritettavaan tiedostoon. Jokainen taulukon merkintä tai "korjaus" on osoitin absoluuttiseen osoitteeseen objektikoodissa, joka on muutettava, kun lataaja siirtää ohjelman niin, että se viittaa oikeaan paikkaan. Korjaukset on suunniteltu tukemaan ohjelman siirtämistä kokonaiseksi kokonaisuudeksi. Joissakin tapauksissa taulukon jokainen korjaus on itse suhteessa perusosoitteeseen nolla, joten itse korjaukset on muutettava kuormaimen liikkuessa taulukon läpi.

Joissakin arkkitehtuureissa korjaus, joka ylittää tietyt rajat (kuten segmentin rajan) tai jota ei ole kohdistettu sanan rajalle, on laitonta ja linkittäjä merkitsee sen virheeksi.

DOS ja 16-bittinen Windows

Kauko- osoittimilla ( 32-bittiset osoittimet segmentillä : offset, käytetään DOS- ohjelmien käytettävissä olevan 20-bittisen 640 kt: n muistitilan osoittamiseen ), jotka osoittavat koodia tai tietoja DOS-suoritettavassa tiedostossa ( EXE ), ei ole absoluuttisia segmenttejä, koska todellinen koodin/datan osoite riippuu siitä, missä ohjelma on ladattu muistiin, ja tämä tiedetään vasta, kun ohjelma on ladattu.

Sen sijaan segmentit ovat suhteellisia arvoja DOS EXE -tiedostossa. Nämä segmentit on korjattava, kun suoritettava tiedosto on ladattu muistiin. EXE -lataaja käyttää siirtotaulukkoa löytääkseen muokattavat segmentit.

32-bittinen Windows

32-bittisissä Windows-käyttöjärjestelmissä ei ole pakollista antaa siirtotaulukoita EXE-tiedostoille, koska ne ovat ensimmäinen virtuaaliseen osoitetilaan ladattu kuva ja ne ladataan siten haluamallasi perusosoitteella.

Sekä DLL -tiedostoille että EXE -tiedostoille, jotka ottavat käyttöön ASLR -osoitteen asettelun satunnaistamisen - Windows Vistan käyttöön otettu hyväksikäytön lieventämistekniikka, siirtotaulukot ovat jälleen pakollisia, koska binaari voidaan siirtää dynaamisesti ennen sen suorittamista, vaikka ovat edelleen ensimmäinen asia, joka ladataan virtuaaliseen osoitetilaan.

64-bittinen Windows

Kun suoritat 64-bittisiä binaaritiedostoja Windows Vistassa tai uudemmassa, ASLR on pakollinen, joten kääntäjä ei voi jättää pois siirto-osia.

Unixin kaltaiset järjestelmät

Executable ja yhdistettävissä Format (ELF) executable muodossa ja jaetun kirjaston käyttämä tiedostomuoto useimmat Unixin kaltaisissa järjestelmissä mahdollistaa useita erilaisia siirtäminen määriteltävä.

Siirtomenettely

Linkittäjä lukee objektitiedostojen segmenttitiedot ja siirtotaulukot ja suorittaa siirron seuraavasti:

  • yhdistämällä kaikki yleisen tyypin segmentit samaan segmenttiin
  • yksilöivien suoritusaikaosoitteiden määrittäminen kullekin osalle ja jokaiselle symbolille, antamalla kaikille koodi (toiminnot) ja tiedot (globaalimuuttujat) yksilölliset suoritusaikaosoitteet
  • viittaamalla siirtotaulukkoon symbolien muuttamiseksi siten, että ne osoittavat oikeisiin suoritusaikaosoitteisiin.

Esimerkki

Seuraavassa esimerkissä käytetään Donald Knuth : n MIX arkkitehtuuria ja MIXAL konekielellä. Periaatteet ovat samat kaikille arkkitehtuureille, vaikka yksityiskohdat muuttuvat.

Esimerkki siirtämisestä.tif
  • (A) Ohjelma SUBR kootaan tuottamaan objektitiedosto (B), joka näkyy sekä konekoodina että kokoonpanijana. Kääntäjä voi aloittaa käännetyn koodin mielivaltaisesta paikasta, usein sijainnista 1, kuten on esitetty. Sijainti 13 sisältää konekoodin hyppyohjeelle lausekkeelle ST sijainnissa 5.
  • (C) Jos SUBR linkitetään myöhemmin muuhun koodiin, se voidaan tallentaa muuhun paikkaan kuin 1. Tässä esimerkissä linkitin sijoittaa sen paikkaan 120. Hyppyohjeen osoite, joka on nyt paikassa 133, on siirrettävä osoittamaan lausekkeen ST koodin uuteen paikkaan , nyt 125. [1 61, joka on esitetty ohjeessa, on MIX -konekoodiesitys 125].
  • (D) Kun ohjelma ladataan muistiin suoritettavaksi, se voidaan ladata johonkin muuhun paikkaan kuin linkittäjän määrittämään paikkaan. Tässä esimerkissä SUBR on nyt sijainnissa 300. Hyppyohjeen osoite, joka on nyt kohdassa 313, on siirrettävä uudelleen, jotta se osoittaa ST: n päivitetyn sijainnin 305. [4 49 on 305: n MIX -koneen esitys].

Katso myös

Viitteet

Lue lisää