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í.
- (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é
- Linker (výpočetní)
- Knihovna (výpočetní)
- Objektový soubor
- Předběžná vazba
- Statická knihovna
- Vlastní přemístění
- Poziční nezávislý kód (PIC)
- Rebasing
- Sběr odpadků
Reference
Další čtení
- Johnson, Glenn (1975-12-21) [1975-11-13], 11/34 Základní logický test správy paměti , Digital Equipment Corporation (DEC), MAINDEC-11-DFKTA-AD , vyvoláno 19. 08. 2017
- 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 od originálu 2017-09-09 . Citováno 2017-08-19 . [4] [5] [6] (Tuto metodu „změny velikosti“, pojmenovanou přemístění okrajů stránky , lze staticky použít na obraz disku CP/M-80 pomocí MOVCPM aby se maximalizovala TPA pro spouštění programů. Byl také dynamicky využíván nástrojem pro ladění CP/M Dynamic Debugging Tool (DDT) k přemístění do vyšší paměti. Stejný přístup nezávisle vyvinul Bruce Van Natta z IMS Associates k výrobě přemístitelného kódu PL/M . Jako přemístění hranic odstavce , Další varianta tohoto způsobu byla později využita dynamicky HMA samostatně přesouvat TSR jako keyb , SHARE a NLSFUNC pod DR DOS 6.0 a vyšší. a mnohem sofistikovanější a zrnitý byte úrovni metoda založená na poněkud podobný přístup byl samostatně vytvářejí a realizují od Matthiase R. Paula a Axela C. Frinkeho za jejich dynamickou eliminaci mrtvého kódu za účelem dynamické minimalizace běhové stopy rezidentních řidičů a TSR (jako FreeKEYB).)
-
Huitt, Robert; Eubanks, Gordon ; 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: Computer History Museum . CHM Referenční číslo: X7170.2014. Archivováno (PDF) z originálu dne 2014-12-27 . Citováno 2020-01-19 .
[…] Zákony: […] „dynamické přemístění“ operačního systému. Můžete nám říci, co to je a proč to bylo důležité? […] Eubanks : […] to, co Gary udělal […], bylo […] ohromující. […] Pamatuji si ten den, kdy ve škole přišel do laboratoře a řekl: Zjistil jsem, jak se přestěhovat. Využil toho, že jediným bajtem vždy bude bajt vyššího řádu . A tak vytvořil bitmapu . […] 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 toto […] komercializovat na strojích s různým množstvím paměti. […] Nemohli byste prodávat 64K CP/M a 47K CP/M. Bylo by směšné mít v adresách tvrdý překlad. Gary to tedy jednou v noci zjistil, pravděpodobně uprostřed noci 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. Přimět lidi, aby si to koupili, by se jim zdálo složité a kdybyste přidali více paměti, museli byste si pořídit jiný operační systém. […] Intel […] nechal obrátit bajty , správně, pro paměťové adresy. Byli ale vždy na stejném místě, takže jste jej mohli přesunout na hranici 256 bajtů , přesněji. Dalo by se tedy vždy přemístit jen s bitmapou, kde jsou ty […] zákony: Určitě nejvýřečnější vysvětlení dynamického přemisťování, jaké jsem kdy měl […]
[7] [8] (33 stran) - 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 (09.10.2016). „RSM pro 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: Programovací jazyk sestavovacího jazyka CP/M" . Vintage počítačové fórum . Žánr: CP/M a MP/M. Archivováno od originálu 1. ledna 2020 . Citováno 2020-02-01 .
[…] Zajímalo vás někdy, jak funguje MOVCPM ? Vzhledem k tomu, že BDOS a CCP je ve vysoké paměti, nad uživatelskou aplikací musí být adresy změněny při každé změně velikosti systémové paměti. Nyní to vyžaduje přemístění adres v kódu 8080 , protože relativní adresování není součástí hardwaru. Jak se dá postupovat bez implementace plnohodnotného přemisťovacího assembleru a nakladače? Je to vlastně docela chytré a MP/M dokonce používá toto schéma ke konstrukci svých souborů přemístitelných na stránky. Jednoduše sestavíte zdrojový program dvakrát s druhým počátkem sestavení o 100 H (256 bajtů) vyšším než s prvním. Tyto dva binární obrazy jsou poté porovnány, bajt za bajtem, a mapa vytvořená z místa, kde se páry bajtů liší hodnotou přesně o 100H. Výsledkem je seznam umístění, kde je třeba upravit hodnotu přemístění, pokud má být přesunuto umístění programu v paměti. MP/M nazývá tento druh souboru PRL (přemístitelná stránka), 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 originálu 1. ledna 2020 . Citováno 2020-02-01 .
[…] MOVCPM používá raný typ formátu PRL. V zásadě je CP/M sestaven dvakrát; podruhé je offset 100H bytů. Tyto dva binární soubory jsou porovnány a vytvořena bitmapa . Nastavený bit znamená, že má být upraven bajt vyššího řádu adresy. Bajty nízké objednávky nejsou ovlivněny; proto „soubor přemístitelný na stránku“. Každý bajt v bitmapě odpovídá 8 bytům v binárních datech. […] Všechno, co má být přesunuto v MOVCPM, je součástí obrazu a jeho bitmapy přemístění. […]
-
Guzis, Charles "Chuck" P. (2016-11-08). "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 originálu 1. ledna 2020 . Citováno 2020-02-01 .
[…] Odkazoval jsem na soubory PRL a na to, jak původně začaly s MOVCPM , ale staly se nedílnou součástí MP/M a CP/M 3.0 . Soubory PRL však používají bitovou mapu, ve které každý bit odpovídá umístění v paměti; jeden bit udává, že na odpovídající místo v paměti by měl být přidán posun 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 bitmapy použít seznam ukazatelů (2 bajty na odkaz). To je nepravděpodobné v kódu 8080, který nemá relativní skoky, ale může to být úvaha pro kód Z80 . Trik, jak to rychle zjistit, je sestavit program dvakrát; podruhé posun o 100H, pak porovnejte dva binární soubory. Výhodou přemístění za běhu je, že nemusíte ukládat pokutu za kód, který se pokouší obejít problém s přemístěním-žádné „triky“; stačí napsat přímý 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: People's Computer Company . 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) [1978-11-05]. „8.2.2 Přemístění nakladače“. Napsáno na University of North Carolina at Chapel Hill . V Horowitz, Ellis (ed.). Assemblers, Compilers, and Program Translation . Řada inženýrství počítačového softwaru (1. tisk, 1. vyd.). Potomac, Maryland, USA: Computer Science Press, Inc. s. 237 –241. ISBN 0-914894-23-4. ISSN 0888-2088 . LCCN 78-21905 . Citováno 2020-03-20 . (2+xiv+270+6 stran)
- Formát souboru Microsoft OBJ . Microsoft , Služby podpory produktů. Poznámka k aplikaci SS0288. Archivováno od originálu 2017-09-09 . Citováno 2017-08-21 .
- Tanenbaum, Andrew Stuart ; Bos, Herbert (2015). Moderní operační systémy (4 ed.). ISBN Pearson Education Inc. 978-0-13359162-0.
-
Elliott, John C. (2012-06-05) [2000-01-02]. „Formát souboru PRL“ . seasip.info . Archivováno od originálu dne 26. ledna 2020 . Citováno 2020-01-26 .
[…] Soubor PRL je přemístitelný binární soubor, který používají MP/M a CP/M Plus pro různé moduly jiné než soubory .COM . Formát souboru se používá také pro soubory FID na 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. Ovladače GSX jsou ve formátu PRL; stejně jako Resident System Extensions (.RSX). […]
[9] -
Elliott, John C. (2012-06-05) [2000-01-02]. „Formát Microsoft REL“ . seasip.info . Archivováno od originálu dne 2020-01-26 . Citováno 2020-01-26 .
[…] Formát REL je generován společností Microsoft M80 a RMAC společnosti Digital Research . […]
-
feilipu (05.09.2018) [2018-09-02]. „Podpora PRL, spustitelný soubor přemístitelné stránky pro MP/M“ . z88dk . Archivováno od originálu 1. ledna 2020 . Citováno 2020-01-26 .
[…] Ze sestavených souborů Microsoft .REL musí linker vygenerovat formát .PRL spustitelný pro MP/M . Formát .PRL je v podstatě souborem .COM s několika dalšími informacemi, které umožňují 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. Za programem je připojena maska bitů za bajty, která systému MP/M umožňuje vědět, které bajty v programu je třeba při přemístění programu změnit. Jak to linker dělá bez rozebrání celé aplikace? Program je předem propojen pro dva různé počátky 0x0100 a 0x0200 z objektů .REL. Trik linkeru jednoduše rozpoznává, které bajty se ve dvou verzích spustitelného souboru liší. Tyto bajty jsou poté zaznamenány do bitové masky uložené po spustitelném souboru a konečný program .PRL je navržen tak, aby běžel od 0x0100 plus jeho ofset stránky. Stejný trik se provádí pro spustitelné soubory .RSP a .SPR, kromě toho, že oba tyto formáty se vzdávají ofsetu 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: Hoboové z 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 a přemístění - informace o ZCPR3PLUS a jak psát samovolně se přemisťující kód Z80“ . The Computer Journal (TCJ) - Programování, podpora uživatelů, 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.). „Roh ZCPR3 - více o přemístitelném kódu, souborech PRL, programech ZCPR34 a programech typu 4“ . The Computer Journal (TCJ) - Programování, podpora uživatelů, 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). „Zápis přemístitelného kódu - některý vložený kód musí běžet na více než jedné adrese“ . Programování vestavěných systémů . The Ganssle Group - Perfecting the Art of Building Embedded Systems / TGG. Archivováno od originálu dne 2019-07-18 . Citováno 2020-02-20 .