Přemístění (výpočet) - Relocation (computing)
Přemístění je proces přiřazování zátěžových adres pro kód a data závislý na poloze programu a přizpůsobení kódu a dat tak, aby odrážely přiřazené adresy.[1][2] Před příchodem víceprocesorových systémů a stále v mnoha vestavěných systémech byly adresy objektů absolutní počínaje známým místem, často nulovým. Vzhledem k tomu, že se systémy s více procesy dynamicky propojují a přepínají mezi programy, bylo nutné umět přemístit objekty pomocí kód nezávislý na poloze.A linker obvykle provádí přemístění ve spojení s rozlišení symbolů, proces hledání souborů a knihoven za účelem nahrazení symbolických odkazů nebo názvů knihovny se skutečnými použitelnými adresami v Paměť před spuštěním programu.
Přemístění obvykle provádí linker na adrese čas propojení, ale lze to provést také na doba načítání přemístěním nakladač, nebo na doba běhu spuštěným programem sám. Některé architektury se přemístění zcela vyhnou odkladem přiřazení adresy doba běhu; toto je známé jako aritmetika nulové adresy.[který? ]
Segmentace
Soubory objektů jsou rozděleny na různé segment paměti typy. Příklad segmentů zahrnuje segment kódu (.text), inicializovaný datový segment (.data), neinicializovaný datový segment (.bss ) nebo další.[je zapotřebí objasnění ]
Tabulka přemístění
Tabulka přemístění je seznam ukazatele vytvořil překladatel (a překladač nebo assembler ) a uloženy v objektu nebo spustitelném souboru. Každá položka v tabulce, nebo „oprava“, je a ukazatel na absolutní adresu v kódu objektu, která musí být změněna, 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 sama relativní k základní adrese nula, takže samotné opravy musí být změněny, když se zavaděč pohybuje tabulkou.[2]
V některých architekturách je oprava, která překračuje určité hranice (například hranici segmentu) nebo není zarovnána na hranici slova, nelegální a označuje ji jako chybu linker.[3]
DOS a 16bitové Windows
Daleko ukazatele (32-bit ukazatele s segment: offset, používá se k adresování 20bitových 640 KB Paměť místo k dispozici DOS programy ), které ukazují na kód nebo data v rámci a Spustitelný systém 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 je známo až po načtení programu.
Místo toho jsou segmenty relativní hodnoty v souboru DOS EXE. Tyto segmenty je třeba opravit, když byl spustitelný soubor načten do paměti. EXE nakladač používá tabulku přemístění k vyhledání segmentů, které je třeba upravit.
32bitový systém Windows
U 32bitových operačních systémů Windows není povinné poskytovat tabulky EXE 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.
Pro DLL i pro EXE, které se přihlásí randomizace rozvržení adresního prostoru (ASLR) - an využívat mitigační technika zavedená v systému Windows Vista, přemisťovací tabulky se opět stávají povinnými kvůli možnosti, že binární soubor může být před spuštěním dynamicky přesunut, přestože jsou stále první věcí načtenou ve virtuálním adresovém prostoru.
64bitový systém Windows
Při spuštění nativních 64bitových binárních souborů ve Windows Vista a novějších je ASLR povinný[Citace je zapotřebí ], a tudíž kompilátor nemůže vynechat sekce přemístění.
Unixové systémy
The Spustitelný a propojitelný formát (ELF) spustitelný formát a formát sdílené knihovny používaný většinou systémů podobných systému Unix umožňuje definovat několik typů přemístění.[4]
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í pomocí:
- sloučení všech segmentů společného typu do jednoho segmentu tohoto typu
- přiřazení jedinečných adres za běhu každé sekci a každému symbolu, což dává všem kódům (funkcím) a datům (globální proměnné) jedinečné adresy za běhu
- s odkazem na přemístění tabulky pozměnit[proč? ] symboly tak, aby ukazovaly na správné[je zapotřebí objasnění ] adresy za běhu.
Příklad
Následující příklad používá Donald Knuth je SMĚS architektura a montážní jazyk MIXAL. Principy jsou stejné pro jakoukoli architekturu, i když se podrobnosti změní.
- (Program SUBR je sestaven tak, aby vytvořil soubor objektu (B), zobrazený jako strojový kód i jako assembler. Kompilátor může spustit kompilovaný kód na libovolném místě, často na místě 1, jak je znázorněno. Umístění 13 obsahuje strojový kód instrukce skoku na příkaz SVATÝ v lokalitě 5.
- (C) Pokud SUBR je později propojen s jiným kódem, může být uložen na jiném místě než 1. V tomto příkladu jej linker umístí na místo 120. Adresa v instrukci skoku, která je nyní na místě 133, musí být přemístěn přejděte na nové umístění kódu pro výpis SVATÝ, nyní 125. [1 61 zobrazený v instrukci je MIX strojový kód reprezentace 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ž které je přiřazeno linkerem. Tento příklad ukazuje SUBR nyní na místě 300. Adresa v instrukci skoku, nyní na 313, musí být znovu přemístěna, aby ukazovala na aktualizované umístění SVATÝ, 305. [4 49 je reprezentace stroje MIX 305].
Viz také
- Linker (výpočetní)
- Knihovna (výpočetní)
- Soubor objektu
- Předvázání
- Statická knihovna
- Vlastní přemístění
- Kód nezávislý na poloze (PIC)
- Rebasing
- Sběr odpadu
Reference
- ^ "Typy objektového kódu". Referenční příručka pro zavaděč aplikací iRMX 86 (PDF). Intel. str. 1-2, 1-3. Archivováno (PDF) od původního dne 2020-01-11. Citováno 2020-01-11.
[…] Absolutní kód, a modul absolutního objektu, je kód, který byl zpracován LOC86 tak, aby běžel pouze na určitém místě v paměti. The Nakladač načte modul absolutního objektu pouze do konkrétního umístění, které musí modul obsadit. Kód nezávislý na poloze (běžně označovaný jako PIC) se liší od absolutního kódu v tom, že PIC lze načíst do libovolného paměťového místa. Výhodou PIC oproti absolutnímu kódu je, že PIC nevyžaduje, abyste si rezervovali konkrétní blok paměti. Když zavaděč načte PIC, získá iRMX 86 segmenty paměti z fondu úlohy volajícího úkolu a načte PIC do segmentů. Omezení týkající se PIC spočívá v tom, že stejně jako v EU PL / M-86 KOMPAKTNÍ model segmentace […], může mít pouze jeden segment kódu a jeden segment dat, místo aby se základní adresy těchto segmentů, a tedy i samotné segmenty, dynamicky lišily. To znamená, že programy PIC jsou nutně kratší než 64 kB bajtů. PIC kód lze vytvořit pomocí BIND řízení LINK86. Lokalizovatelný kód načítání (běžně označovaný jako LTL kód) je třetí forma objektového kódu. Kód LTL je podobný PIC, protože kód LTL lze načíst kdekoli v paměti. Při načítání kódu LTL však zavaděč změní základní část ukazatelů tak, aby ukazatele byly nezávislé na počátečním obsahu registrů v mikroprocesoru. Z důvodu této opravy (úpravy základních adres) lze kód LTL použít u úkolů, které mají více než jeden segment kódu nebo více než jeden datový segment. To znamená, že programy LTL mohou mít délku více než 64 kB. FORTRAN 86 a Pascal 86 automaticky vytváří kód LTL, a to i pro krátké programy. LTL kód může být vytvořen pomocí BIND ovládání LINK86. […]
- ^ A b Levine, John R. (2000) [říjen 1999]. "Kapitola 1: Propojování a načítání a Kapitola 3: Soubory objektů". Linkery a nakladače. Řada Morgan Kaufmann v softwarovém inženýrství a programování (1. vyd.). San Francisco, USA: Morgan Kaufmann. p. 5. ISBN 1-55860-496-0. OCLC 42413382. Archivováno z původního dne 2012-12-05. Citováno 2020-01-12. Kód: [1][2] Errata: [3]
- ^ Borland (1999-09-01) [1998-07-02]. „Borland article # 15961: Coping with 'Fixup Overflow' messages". community.borland.com. Databáze technických informací - produkt: Borland C ++ 3.1. TI961C.txt # 15961. Archivováno z původního dne 2008-07-07. Citováno 2007-01-15.
- ^ „Spustitelný a spojitelný formát (ELF)“ (PDF). skyfree.org. Standardy rozhraní nástrojů (TIS) Specifikace přenosných formátů, verze 1.1. Archivováno (PDF) z původního dne 2019-12-24. Citováno 2018-10-01.
Další čtení
- Johnson, Glenn (21.12.1975) [13.11.1975], 11/34 Test paměti Základní logický test, Digital Equipment Corporation (DEC), MAINDEC-11-DFKTA-A-D, vyvoláno 2017-08-19
- Kildall, Gary Arlen (Únor 1978). "Jednoduchá technika pro statické přemístění absolutního strojového kódu". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia. Lidová počítačová společnost. 3 (2): 10–13 (66–69). ISBN 0-8104-5490-4. #22. Archivováno z původního dne 2017-09-09. Citováno 2017-08-19. [4] [5] [6] (Tato metoda "změny velikosti", pojmenovaná přemístění hranice stránky, lze použít staticky na a CP / M-80 obraz disku pomocí MOVCPM s cílem maximalizovat TPA pro spuštění programů. Také jej dynamicky využil debugger CP / M Nástroj pro dynamické ladění (DDT) do přemístit se do vyšší paměti. Stejný přístup vyvinul nezávisle Bruce Van Natta z IMS Associates vyrábět přemístitelné PL / M kód. Tak jako přemístění hranice odstavce, jiná varianta této metody byl později dynamicky využit HMA samovolné přemístění TSR jako KLÍČ, PODÍL, a NLSFUNC pod DR DOS 6.0 a vyšší. Mnohem propracovanější a granulární na úrovni bytu metodu založenou na poněkud podobném přístupu nezávisle navrhli a implementovali Matthias R. Paul a Axel C. Frinke pro své dynamická eliminace mrtvého kódu dynamicky minimalizovat stopu běhu rezidentních ovladačů a TSR (jako FreeKEYB).)
- Huitt, Robert; Eubanks, Gordone; Rolander, Thomas "Tom" Alan; Zákony, David; Michel, Howard E .; Halla, Brian; Wharton, John Harrison; Berg, Brian; Su, Weilian; Kildall, Scott; Kampe, Bill (2014-04-25). Zákony, David (ed.). „Legacy of Gary Kildall: The CP / M IEEE Milestone Dedication“ (PDF) (přepis videa). Pacific Grove, Kalifornie, USA: Muzeum počítačové historie. CHM Referenční číslo: X7170.2014. Archivováno (PDF) z původního dne 2014-12-27. Citováno 2020-01-19.
[…] Zákony: […] „dynamické přemístění“ OS. Můžete nám říct, co to je a proč to bylo důležité? […] Eubanks: […] co Gary bylo […] […] ohromující. […] Pamatuji si den v škola Přišel skákat do laboratoře a řekl: Přišel jsem na to, jak se přemístit. Využil skutečnosti, že jediným bajtem bude vždy ten bajt vyššího řádu. A tak vytvořil bitmapa. […] Nezáleželo na tom, kolik paměti měl počítač, operační systém mohl být vždy přesunut do vysoké paměti. Proto byste mohli tento […] komercializovat na strojích s různým množstvím paměti. […] Nemůžete prodat 64 tis CP / M a 47K CP / M. Bylo by směšné mít v adresách tvrdý kompilace. Gary na to tedy přišel jednou v noci, pravděpodobně uprostřed noci a přemýšlel o nějaké kódovací věci, a to opravdu umožnilo CP / M komercializovat. Opravdu si myslím, že bez tohoto přemístění by to byl velmi těžký problém. Chcete-li přimět lidi, aby si ji koupili, zdálo by se jim to komplikované, a pokud jste přidali více paměti, museli byste si pořídit jiný operační systém. […] Intel […] Měl bajtů obráceno, správně, pro adresy paměti. Vždy však byli na stejném místě, takže je můžete přemístit na Hranice 256 bajtů, být přesný. Dalo by se proto vždy přemístit pouze s bitmapou, kde jsou ty […] Zákony: Určitě to výmluvné vysvětlení, jaké jsem kdy měl o dynamickém přemístění […]
[7][8] (33 stránek) - Lieber, Eckhard; von Massenbach, Thomas (1987). "CP / M 2 lernt dazu. Modulare Systemerweiterungen auch für das 'alte' CP / M". c't - magazin für computertechnik (část 1) (v němčině). Heise Verlag. 1987 (1): 124–135; Lieber, Eckhard; von Massenbach, Thomas (1987). "CP / M 2 lernt dazu. Modulare Systemerweiterungen auch für das 'alte' CP / M". c't - magazin für computertechnik (část 2) (v němčině). Heise Verlag. 1987 (2): 78–85; Huck, Alex (10.10.2016). „RSM für CP / M 2.2“. Domácí počítač DDR (v němčině). Archivováno od originálu dne 2016-11-25. Citováno 2016-11-25.
- Guzis, Charles "Chuck" P. (2015-03-16). „Re: CP / M assembling language programming“. Vintage počítačové fórum. Žánr: CP / M a MP / M. Archivováno od původního dne 2020-02-01. Citováno 2020-02-01.
[…] Zajímalo by mě, jak MOVCPM funguje? Protože BDOS a CCP je ve vysoké paměti, nad uživatelskou aplikací, adresy je třeba měnit pokaždé, když se změní velikost systémové paměti. To nyní vyžaduje přemístění adres 8080 kód, protože relativní adresování není součástí hardwaru. Jak je možné bez implementace plnohodnotného přemístitelného asembleru a nakladače? Je to vlastně docela chytré a MP / M dokonce používá toto schéma ke konstrukci svých souborů, které lze přemístit. Jednoduše sestavíte zdrojový program dvakrát s počátkem druhého sestavení o 100 H (256 bajtů) vyšším než první. Dva binární obrazy jsou poté porovnány, byte pro byte a a mapa konstruováno z místa, kde se páry bajtů liší v hodnotě přesně o 100H. Výsledkem je seznam umístění, kde je třeba upravit hodnotu přemístění, pokud se má přesunout umístění programu v paměti. MP / M volá tento druh souboru PRL (stránka přemístitelná), ale nevím, že CP / M 2.2 pro něj někdy vytvořil název. […]
- Guzis, Charles "Chuck" P. (2015-07-29). "Re: Jak funguje MOVCPM.COM?". Vintage počítačové fórum. Žánr: CP / M a MP / M. Archivováno od původního dne 2020-02-01. Citováno 2020-02-01.
[…] MOVCPM používá časný typ formátu PRL. V podstatě, CP / M je sestaven dvakrát; podruhé je posun 100H bajtů. Tyto dva binární soubory jsou porovnány a bitmapa postavena. Nastavený bit znamená, že bajt vyššího řádu adresy je třeba upravit. Bajty adresy nízké objednávky nejsou ovlivněny; tedy „Soubor pro přemístění stránky“. Každý bajt v bitmapě odpovídá 8 bajtům v binárních datech. […] Všechno, co má být přesunuto v MOVCPM, je tedy součástí obrazu a jeho bitmapy přemístění. […]
- Guzis, Charles "Chuck" P. (11.11.2016). „Re: Je bezpečné používat RST 28h v montážních programech CP / M?“. Vintage počítačové fórum. Žánr: CP / M a MP / M. Archivováno od původního dne 2020-02-01. Citováno 2020-02-01.
[…] Odkázal jsem na soubory PRL a na to, jak původně začaly MOVCPM , ale stal se nedílnou součástí MP / M a CP / M 3.0. Soubory PRL však používají a bitová mapa ve kterém každý bit odpovídá umístění v paměti; jeden bit označuje, že by měl být na odpovídající místo v paměti přidán offset přemístění stránky. Pokud máte velmi málo odkazů na absolutní paměť (na rozdíl od relativních), můžete místo rastrového obrázku použít seznam ukazatelů (2 bajty na odkaz). To je nepravděpodobné v 8080 kód, který nemá relativní skoky, ale může být považován za Z80 kód. Trik, jak to rychle zjistit, je sestavit program dvakrát; druhý časový posun o 100 H, poté porovnejte dvě binární soubory. Výhoda run-time přemístění je to, že nemusíte platit pokutu za kód, který se pokouší obejít problém přemístění - žádné „triky“; stačí napsat rovný kód. […]
- Roth, Richard L. (únor 1978) [1977]. „Přemístění není jen přesun programů“. Dr. Dobb's Journal of Computer Calisthenics & Orthodontia. Ridgefield, CA, USA: Lidová počítačová společnost. 3 (2): 14–20 (70–76). ISBN 0-8104-5490-4. #22. Archivováno od originálu na 2019-04-20. Citováno 2019-04-19.
- Calingaert, Peter (1979) [05.11.1978]. „8.2.2 Přemístění nakladače“. Napsáno v University of North Carolina at Chapel Hill. v Horowitz, Ellis (vyd.). Assemblers, Compilers a Program Translation. Řada počítačového softwarového inženýrství (1. tisk, 1. vyd.). Potomac, Maryland, USA: Computer Science Press, Inc. str.237 –241. ISBN 0-914894-23-4. ISSN 0888-2088. LCCN 78-21905. Citováno 2020-03-20. (2 + xiv + 270 + 6 stránek)
- Formát souboru Microsoft OBJ. Microsoft Služby podpory produktů. Poznámka k aplikaci SS0288. Archivováno z původního dne 2017-09-09. Citováno 2017-08-21.
- Tanenbaum, Andrew Stuart; Bos, Herbert (2015). Moderní operační systémy (4. vyd.). Pearson Education Inc. ISBN 978-0-13359162-0.
- Elliott, John C. (06.06.2012) [02.01.2000]. "Formát souboru PRL". seasip.info. Archivováno od původního dne 2020-01-26. Citováno 2020-01-26.
[…] Soubor PRL je přemístitelný binární soubor, který používá MP / M a CP / M Plus pro různé moduly jiné než Soubory .COM. Formát souboru se také používá pro soubory FID na internetu Amstrad PCW. Existuje několik formátů souborů, které používají verze PRL: SPR (System PRL), RSP (Resident System Process). LINK-80 může také vytvářet soubory OVL (overlay), které mají záhlaví PRL, ale nelze je přemístit. GSX ovladače jsou ve formátu PRL; tak jsou Resident System Extensions (.RSX). […]
[9] - Elliott, John C. (06.06.2012) [02.01.2000]. „Microsoft REL format“. seasip.info. Archivováno od původního dne 2020-01-26. Citováno 2020-01-26.
[…] Formát REL generuje Microsoft je M80 a Digitální výzkum RMAC. […]
- feilipu (05.09.2018) [2018-09-02]. "Podpora pro PRL, spustitelný soubor pro MP / M". z88dk. Archivováno od původního dne 2020-02-01. Citováno 2020-01-26.
[…] Ze shromážděných Microsoft Soubory .REL, které musí linker vygenerovat pro spustitelný soubor ve formátu .PRL MP / M. Formát .PRL je v zásadě a Soubor .COM s některými dalšími informacemi umožňujícími přemístění programu a jeho dat na libovolnou stránku. Jak vypadá soubor .PRL? První bajty jsou velikost programu, následovaná počátkem programu na 0x0100. V návaznosti na program je připojena maska bit za bajt, která umožňuje systému MP / M vědět, které bajty v programu je třeba změnit, když je program přemístěn. Jak to dělá linker bez demontáže celé aplikace? Program je předem propojen na dva různé počátky 0x0100 a 0x0200 z objektů .REL. Linkerový trik jednoduše rozpoznává, které bajty ve dvou verzích spustitelného souboru se liší. Tyto bajty jsou poté zaznamenány v bitové masce uložené po spustitelném souboru a konečný program .PRL je navržen tak, aby běžel od 0x0100 plus jeho posun stránky. Stejný trik se provádí pro spustitelné soubory .RSP a .SPR, kromě toho, že oba tyto formáty se vzdávají offsetu a běží od 0x0000 plus jejich offset stránky. […]
- Brothers, Hardin (duben 1983). „Porozumění přemístitelnému kódu“. 80 mikro. Další krok. 1001001, Inc. (39): 38, 40, 42, 45. ISSN 0744-7868. Citováno 2020-02-06. [10][11]
- Brothers, Hardin (duben 1985). „Přemístitelné programy: Hoboes mikropočítačů“. 80 mikro. Další krok. CW Communications / Peterborough, Inc. (63): 98, 100, 102–103. ISSN 0744-7868. Citováno 2020-02-06. [12][13]
- Mitchell, Bridger (červenec – srpen 1988). Carlson, Art (ed.). „Z3PLUS & Relocation - Informace o ZCPR3PLUS a jak psát vlastní přemístitelný kód Z80“. Počítačový deník (TCJ) - Programování, Uživatelská podpora, Aplikace. Pokročilé CP / M. Columbia Falls, Montana, USA (33): 9 –15. ISSN 0748-9331. archa: / 13960 / t36121780. Citováno 2020-02-09. [14][15]
- Sage, Jay (září – říjen 1988). Carlson, Art (ed.). „ZCPR3 Corner - více o přemístitelném kódu, souborech PRL, programech ZCPR34 a Type-4“. Počítačový deník (TCJ) - Programování, Uživatelská podpora, Aplikace. Pokročilé CP / M. Columbia Falls, Montana, USA (34): 20 –25. ISSN 0748-9331. archa: / 13960 / t0ks7pc39. Citováno 2020-02-09. [16][17]
- Ganssle, Jack (únor 1992). „Writing Relocatable Code - Some embedded code must run at more than one address“. Programování vestavěných systémů. Ganssle Group - Zdokonalování umění budování vestavěných systémů / TGG. Archivováno z původního dne 2019-07-18. Citováno 2020-02-20.