Перемещение (вычисления)

Назначение или настройка адресов во время выполнения

Перемещение — это процесс назначения адресов загрузки для позиционно-зависимого кода и данных программы и корректировка кода и данных для отражения назначенных адресов. [1] [2] До появления многопроцессорных систем и до сих пор во многих встроенных системах адреса для объектов были абсолютными, начиная с известного местоположения, часто с нуля. Поскольку многопроцессорные системы динамически связываются и переключаются между программами, возникла необходимость в возможности перемещать объекты с использованием позиционно-независимого кода . Компоновщик обычно выполняет перемещение совместно с разрешением символов , процессом поиска файлов и библиотек для замены символических ссылок или имен библиотек фактическими используемыми адресами в памяти перед запуском программы.

Перемещение обычно выполняется компоновщиком во время компоновки , но оно также может быть выполнено во время загрузки перемещающим загрузчиком или во время выполнения самой запущенной программой . Некоторые архитектуры полностью избегают перемещения, откладывая назначение адреса на время выполнения; например, в стековых машинах с нулевой адресной арифметикой или в некоторых сегментированных архитектурах, где каждый блок компиляции загружается в отдельный сегмент.

Сегментация

Объектные файлы сегментируются в различные типы сегментов памяти или секций. Примеры типов сегментов включают сегмент кода (.text) , инициализированный сегмент данных (.data) , неинициализированный сегмент данных (.bss) или другие, установленные программистом, такие как общие сегменты или именованные статические сегменты.

Таблица переездов

Таблица перемещений представляет собой список указателей, созданных транслятором (компилятором или ассемблером ) и сохраненных в объектном или исполняемом файле. Каждая запись в таблице, или «fixup», представляет собой указатель на абсолютный адрес в объектном коде, который должен быть изменен, когда загрузчик перемещает программу, чтобы она ссылалась на правильное местоположение. Fixups предназначены для поддержки перемещения программы как целостной единицы. В некоторых случаях каждое fixup в таблице само по себе относится к базовому адресу, равному нулю, поэтому сами fixups должны быть изменены по мере перемещения загрузчика по таблице. [2]

В некоторых архитектурах исправление, которое пересекает определенные границы (например, границу сегмента) или не выровнено по границе слова, является недопустимым и помечается компоновщиком как ошибка. [3]

DOS и 16-битная Windows

Дальние указатели ( 32-битные указатели с сегментом :offset, используемые для адресации 20-битного пространства памяти размером 640 КБ , доступного программам DOS ), которые указывают на код или данные внутри исполняемого файла DOS ( EXE ), не имеют абсолютных сегментов, поскольку фактический адрес кода/данных зависит от того, где в памяти загружена программа, а это неизвестно, пока программа не загружена.

Вместо этого сегменты являются относительными значениями в файле DOS EXE. Эти сегменты необходимо исправить, когда исполняемый файл загружен в память. Загрузчик EXE использует таблицу перемещений для поиска сегментов, которые необходимо скорректировать.

32-битная Windows

В 32-разрядных операционных системах Windows не обязательно предоставлять таблицы перемещения для EXE-файлов, поскольку они являются первым образом, загружаемым в виртуальное адресное пространство, и, таким образом, будут загружены по своему предпочтительному базовому адресу.

Как для DLL , так и для EXE-файлов, которые используют рандомизацию адресного пространства (ASLR), технологию предотвращения эксплойтов , представленную в Windows Vista , таблицы перемещения снова становятся обязательными из-за возможности динамического перемещения двоичного файла перед выполнением, даже если они по-прежнему первыми загружаются в виртуальное адресное пространство.

64-битная Windows

При запуске собственных 64-разрядных двоичных файлов в Windows Vista и более поздних версиях ASLR является обязательным [ требуется ссылка ] , и поэтому разделы перемещения не могут быть пропущены компилятором.

Unix-подобные системы

Исполняемый формат Executable and Linkable Format (ELF) и формат разделяемой библиотеки, используемые большинством Unix-подобных систем, позволяют определять несколько типов перемещения. [4]

Процедура переезда

Компоновщик считывает информацию о сегментах и ​​таблицы перемещения в объектных файлах и выполняет перемещение следующим образом:

  • объединение всех сегментов общего типа в один сегмент этого типа
  • назначение уникальных адресов времени выполнения каждому разделу и каждому символу, предоставление всему коду (функциям) и данным (глобальным переменным) уникальных адресов времени выполнения [ необходимо разъяснение ]
  • обращаясь к таблице перемещений, чтобы изменить [ почему? ] ссылки на символы так, чтобы они указывали на правильные [ необходимо разъяснение ] адреса времени выполнения.

Пример

Следующий пример использует архитектуру MIX Дональда Кнута и язык ассемблера MIXAL. Принципы одинаковы для любой архитектуры, хотя детали будут меняться.

  • (A) Программа SUBR компилируется для создания объектного файла (B), показанного как машинный код и ассемблер. Компилятор может запустить скомпилированный код в произвольном месте, часто в месте 1, как показано. Место 13 содержит машинный код для инструкции перехода к оператору ST в месте 5.
  • (C) Если SUBR позже связывается с другим кодом, он может быть сохранен в месте, отличном от 1. В этом примере компоновщик помещает его в место 120. Адрес в инструкции перехода, который теперь находится в месте 133, должен быть перемещен , чтобы указывать на новое место кода для оператора ST , теперь 125. [1 61, показанный в инструкции, является представлением машинного кода MIX для 125].
  • (D) Когда программа загружается в память для запуска, она может быть загружена в какое-то место, отличное от того, которое назначено компоновщиком. Этот пример показывает SUBR теперь в месте 300. Адрес в инструкции перехода, теперь 313, необходимо снова переместить, чтобы он указывал на обновленное место ST , 305. [4 49 — это машинное представление MIX 305].

Смотрите также

Ссылки

  1. ^ "Типы объектного кода". Справочное руководство по загрузчику приложений iRMX 86 (PDF) . Intel . стр. 1-2–1-3. Архивировано (PDF) из оригинала 2020-01-11 . Получено 2020-01-11 . […] Абсолютный код и абсолютный объектный модуль — это код, который был обработан LOC86 для выполнения только в определенном месте памяти. Загрузчик загружает абсолютный объектный модуль только в определенное место, которое модуль должен занимать. Позиционно-независимый код (обычно называемый PIC) отличается от абсолютного кода тем, что PIC может быть загружен в любое место памяти. Преимущество PIC над абсолютным кодом заключается в том, что PIC не требует резервирования определенного блока памяти. Когда загрузчик загружает PIC, он получает сегменты памяти iRMX 86 из пула задания вызывающей задачи и загружает PIC в сегменты. Ограничение, касающееся PIC, заключается в том, что, как и в модели сегментации PL/M-86 COMPACT […], он может иметь только один сегмент кода и один сегмент данных, вместо того, чтобы позволять базовым адресам этих сегментов, а следовательно, и самим сегментам, динамически изменяться. Это означает, что программы PIC обязательно имеют длину менее 64 Кбайт. Код PIC может быть создан с помощью элемента управления BIND LINK86. Локализуемый во время загрузки код (обычно называемый кодом LTL) является третьей формой объектного кода. Код LTL похож на PIC тем, что код LTL может быть загружен в любое место памяти. Однако при загрузке кода LTL загрузчик изменяет базовую часть указателей, так что указатели не зависят от начального содержимого регистров в микропроцессоре. Из-за этой корректировки (корректировки базовых адресов) код LTL может использоваться задачами, имеющими более одного сегмента кода или более одного сегмента данных. Это означает, что программы LTL могут иметь длину более 64 Кбайт. FORTRAN 86 и Pascal 86 автоматически создают код LTL, даже для коротких программ. Код LTL может быть создан с помощью элемента управления BIND LINK86. […]
  2. ^ ab Levine, John R. (2000) [октябрь 1999]. "Глава 1: Связывание и загрузка и Глава 3: Объектные файлы". Линкеры и загрузчики. Серия Моргана Кауфмана по программной инженерии и программированию (1-е изд.). Сан-Франциско, Калифорния, США: Morgan Kaufmann . стр. 5. ISBN 1-55860-496-0. OCLC  42413382. Архивировано из оригинала 2012-12-05 . Получено 2020-01-12 .Код: [1][2] Опечатки: [3]
  3. ^ Borland (1999-09-01) [1998-07-02]. "Статья Borland № 15961: Борьба с сообщениями 'Fixup Overflow'". community.borland.com . База данных технической информации - Продукт: Borland C++ 3.1. TI961C.txt № 15961. Архивировано из оригинала 2008-07-07 . Получено 2007-01-15 .
  4. ^ "Исполняемый и компонуемый формат (ELF)" (PDF) . skyfree.org . Спецификация переносимых форматов стандартов интерфейса инструментов (TIS), версия 1.1. Архивировано (PDF) из оригинала 2019-12-24 . Получено 2018-10-01 .

Дальнейшее чтение

  • Джонсон, Гленн (1975-12-21) [1975-11-13]. 11/34 Тест по базовой логике управления памятью. Digital Equipment Corporation (DEC). MAINDEC-11-DFKTA-AD . Получено 2017-08-19 .
  • Форманиак, Питер Г.; Лейтч, Дэвид (июль 1977 г.). «Предлагаемый стандарт программного обеспечения микропроцессора». BYTE — журнал малых систем . Технический форум. Том 2, № 7. Питерборо, Нью-Гемпшир, США: Byte Publications, Inc., стр. 34, 62–63 . ark:/13960/t32245485 . Получено 06.12.2021 .(3 страницы) (Примечание. Описывает перемещаемый шестнадцатеричный формат от Mostek .)
  • Огдин, Кэрол Энн; Колвин, Нил; Питтман, Том; Табб, Филипп (ноябрь 1977 г.). «Форматы кода перемещаемых объектов». BYTE — журнал малых систем . Технический форум. Том 2, № 11. Питерборо, Нью-Гемпшир, США: Byte Publications, Inc., стр.  198–205 . ark:/13960/t59c88b4h, ark:/13960/t3kw76j24 . Получено 06.12.2021 .(8 страниц) (Примечание. Описывает перемещаемый шестнадцатеричный формат TDL .)
  • Kildall, Gary Arlen (февраль 1978) [1976]. "Простая техника статического перемещения абсолютного машинного кода". Журнал компьютерной гимнастики и ортодонтии доктора Добба . 3 (2). People's Computer Company : 10–13 (66–69). ISBN 0-8104-5490-4. #22 ark:/13960/t8hf1g21p . Получено 2017-08-19 .[4][5][6]. Первоначально представлено в: Kildall, Gary Arlen (1977) [22–24 ноября 1976 г.]. «Простая техника статического перемещения абсолютного машинного кода». Написано в Военно-морской аспирантуре , Монтерей, Калифорния, США. В Titus, Harold A. (ред.). Отчет о конференции: Десятая ежегодная Асиломарская конференция по схемам, системам и компьютерам: доклады, представленные 22–24 ноября 1976 г. Асиломарская конференция по сигналам, системам и компьютерам . Отель и конференц-площадки Asilomar, Пасифик-Гроув, Калифорния, США: Western Periodicals Company. стр.  420–424 . ISSN  1058-6393 . Получено 06.12.2021 г.(609 страниц). (Этот метод «изменения размера», названный перемещением границы страницы , можно было статически применить к образу диска CP/M-80 с помощью MOVCPM  [pl] для максимизации TPA для запуска программ. Он также использовался динамически отладчиком CP/M Dynamic Debugging Tool (DDT) для перемещения себя в более высокую память. Тот же подход был независимо разработан Брюсом Х. Ван Наттой из IMS Associates для создания перемещаемого кода PL/M . Как перемещение границы абзаца , другой вариант этого метода позже использовался динамически самоперемещающимися резидентными программами HMA , такими как KEYB , SHARE и NLSFUNC в DR DOS 6.0 и выше. Гораздо более сложный и гранулярный на уровне байтов метод, основанный на несколько похожем подходе, был независимо задуман и реализован Маттиасом Р. Полом и Акселем К. Фринк для их динамического устранения мертвого кода с целью динамической минимизации следа времени выполнения резидентных драйверов и резидентных программ (таких как FreeKEYB).)
  • Mossip, Richard H. (сентябрь–октябрь 1980 г.). Написано в Bloomingdale, New Jersey, USA. "Relocatable Code" (PDF) . S-100 Microsystems . Vol. 1, no. 5. Mountainside & Springfield, New Jersey, USA: Libes, Inc. pp.  54–55 . ISSN  0199-7955. ark:/13960/s2cfgkmxcwg. ark:/13960/s2qdm1t01nr. Архивировано (PDF) из оригинала 27.11.2023 . Получено 27.11.2023 .[7][8] (2 страницы) (Примечание. Описывает перемещение границ страниц и перемещающие ассемблеры.)
  • Huitt, Robert; Eubanks, Gordon ; Rolander, Thomas "Tom" Alan ; Laws, David; Michel, Howard E.; Halla, Brian; Wharton, John Harrison ; Berg, Brian; Su, Weilian; Kildall, Scott ; Kampe, Bill (2014-04-25). Laws, David (ред.). "Legacy of Gary Kildall: The CP/M IEEE Milestone Dedication" (PDF) (видеотранскрипция). Pacific Grove, California, USA: Computer History Museum . CHM Reference number: X7170.2014. Архивировано (PDF) из оригинала 2014-12-27 . Получено 2020-01-19 . […] Laws: […] "динамическое перемещение" ОС. Можете ли вы рассказать нам, что это такое и почему это было важно? […] Юбэнкс : […] то, что сделал Гэри […], было […] ошеломляющим. […] Я помню тот день в школе, когда он вбежал в лабораторию и сказал: «Я придумал, как переместить». Он воспользовался тем фактом, что единственным байтом всегда будет байт старшего порядка . И поэтому он создал битовую карту . […] неважно, сколько памяти у компьютера, операционную систему всегда можно переместить в старшую память. Поэтому вы могли бы коммерциализировать это […] на машинах с разным объемом памяти. […] вы не могли бы продавать 64K CP/M и 47K CP/M. Было бы просто смешно иметь жесткую компиляцию в адресах. Так что Гэри понял это однажды ночью, вероятно, среди ночи, думая о чем-то кодирующем, и это действительно сделало CP/M возможным для коммерциализации. Я действительно думаю, что без этого перемещения это была бы очень сложная проблема. Чтобы заставить людей купить его, это покажется им сложным, и если вы добавите больше памяти, вам придется пойти и получить другую операционную систему. […] Intel […] перевернула байты , верно, для адресов памяти. Но они всегда были в одном и том же месте, поэтому вы могли переместить его на границу 256 байт , если быть точным. Поэтому вы всегда могли переместить его с помощью всего лишь битовой карты того, где эти […] Законы: Безусловно, самое красноречивое объяснение, которое я когда-либо получал о динамическом перемещении […][9][10] (33 страницы)
  • Либер, Экхард; фон Массенбах, Томас (1987). «CP/M 2 lernt dazu. Modulare Systemerweiterungen auch für das 'alte' CP/M». c't - журнал für Computertechnik (часть 1) (на немецком языке). 1987 (1). Хейзе Верлаг : 124–135 ; Либер, Экхард; фон Массенбах, Томас (1987). «CP/M 2 lernt dazu. Modulare Systemerweiterungen auch für das 'alte' CP/M». c't - журнал für Computertechnik (часть 2) (на немецком языке). 1987 (2). Хейзе Верлаг : 78–85 ; Хак, Алекс (2016-10-09). "RSM für CP/M 2.2". Homecomputer DDR (на немецком). Архивировано из оригинала 2016-11-25 . Получено 2016-11-25 .
  • Guzis, Charles "Chuck" P. (2015-03-16). "Re: CP/M assemble language programming". Vintage Computer Forum . Genre: CP/M and MP/M. Архивировано из оригинала 2020-02-01 . Получено 2020-02-01 . […] Вы когда-нибудь задумывались, как работает MOVCPM  [pl] ? Поскольку BDOS и CCP находятся в верхней памяти, выше пользовательского приложения, адреса приходится менять каждый раз при изменении размера системной памяти. Теперь, когда требуется перемещение адресов в коде 8080 , поскольку относительная адресация не является частью оборудования. Как это сделать без реализации полнофункционального перемещающего ассемблера и загрузчика? На самом деле это довольно умно, и MP/M даже использует эту схему для создания своих перемещаемых постраничных файлов. Вы просто дважды собираете исходную программу со вторым началом сборки на 100H (256 байт) выше первого. Затем два двоичных образа сравниваются побайтно, и строится карта , в которой пары байтов отличаются по значению ровно на 100H. Результатом является список мест, в которых необходимо скорректировать значение перемещения, если необходимо переместить местоположение программы в памяти. MP/M называет такой тип файла PRL (page relocatable), но я не знаю, придумывал ли CP/M 2.2 когда-либо название для него. […]
  • Guzis, Charles "Chuck" P. (2015-07-29). "Re: Как работает MOVCPM.COM?". Форум Vintage Computer . Жанр: CP/M и MP/M. Архивировано из оригинала 2020-02-01 . Получено 2020-02-01 . […] MOVCPM  [pl] использует ранний тип формата PRL. По сути, CP/M собирается дважды; во второй раз — смещение 100H байт. Два двоичных файла сравниваются, и создается битовая карта . Установленный бит подразумевает, что старший байт адреса должен быть скорректирован. Младшие байты адреса не затрагиваются; отсюда «Страничный перемещаемый файл». Каждый байт в битовой карте соответствует 8 байтам в двоичных данных. […] Таким образом, все, что должно быть перемещено в MOVCPM, является частью изображения и его битовой карты перемещения. […]
  • Guzis, Charles "Chuck" P. (2016-11-08). "Re: Безопасно ли использовать RST 28h в программах ассемблера CP/M?". Vintage Computer Forum . Жанр: CP/M и MP/M. Архивировано из оригинала 2020-02-01 . Получено 2020-02-01 . […] Я ссылался на файлы PRL и на то, как они изначально получили свое начало с MOVCPM  [pl] , но стали неотъемлемой частью MP/M и CP/M 3.0 . Но файлы PRL используют битовую карту , в которой каждый бит соответствует ячейке памяти; один бит указывает, что смещение перемещения страницы должно быть добавлено к соответствующей ячейке памяти. Если у вас очень мало абсолютных ссылок на память (в отличие от относительных), вы можете использовать список указателей (2 байта на ссылку) вместо битовой карты. Это маловероятно в коде 8080 , в котором нет относительных переходов, но может быть рассмотрено для кода Z80 . Хитрость, чтобы быстро это выяснить, состоит в том, чтобы дважды собрать вашу программу; во второй раз со смещением 100H, а затем сравнить два двоичных файла. Преимущество перемещения во время выполнения в том, что вам не нужно нести штраф за код, который пытается обойти проблему перемещения — никаких «трюков»; просто пишите прямой код. […]
  • Рот, Ричард Л. (февраль 1978 г.) [1977]. «Переезд — это не просто переезд программ». Журнал компьютерной гимнастики и ортодонтии доктора Добба . 3 (2). Риджфилд, Калифорния, США: People's Computer Company : 14–20 (70–76). ISBN 0-8104-5490-4. #22. Архивировано из оригинала 2019-04-20 . Получено 19-04-2019 .
  • Calingaert, Peter (1979) [1978-11-05]. "8.2.2 Перемещение загрузчика". Написано в Университете Северной Каролины в Чапел-Хилл . В Horowitz, Ellis (ред.). Assemblers, Compilers, and Program Translation . Серия Computer software engineering (1-е издание, 1-е изд.). Потомак, Мэриленд, США: Computer Science Press, Inc. стр. 237–241. ISBN 0-914894-23-4. ISSN  0888-2088. LCCN  78-21905 . Получено 20.03.2020 .(2+xiv+270+6 страниц)
  • Формат файла Microsoft OBJ. Microsoft , Службы поддержки продуктов. Примечание к применению SS0288. Архивировано из оригинала 2017-09-09 . Получено 2017-08-21 .
  • Таненбаум, Эндрю Стюарт ; Бос, Герберт (2015). Современные операционные системы (4-е изд.). Pearson Education Inc. ISBN 978-0-13359162-0.
  • Elliott, John C. (2012-06-05) [2000-01-02]. "Формат файла PRL". seasip.info . Архивировано из оригинала 2020-01-26 . Получено 2020-01-26 . […] Файл PRL — это перемещаемый двоичный файл, используемый MP/M и CP/M Plus для различных модулей, отличных от файлов .COM . Формат файла также используется для файлов FID на Amstrad PCW . Существует несколько форматов файлов, которые используют версии PRL: SPR (системный PRL), RSP (резидентный системный процесс). LINK-80 также может создавать файлы OVL ( оверлей ), которые имеют заголовок PRL, но не являются перемещаемыми. Драйверы GSX имеют формат PRL; как и резидентные системные расширения (.RSX). […][11]
  • Эллиотт, Джон К. (2012-06-05) [2000-01-02]. "Формат Microsoft REL". seasip.info . Архивировано из оригинала 2020-01-26 . Получено 2020-01-26 . […] Формат REL генерируется Microsoft M80 и Digital Research RMAC. […]
  • feilipu (2018-09-05) [2018-09-02]. "Поддержка PRL, исполняемый файл с возможностью перемещения страниц для MP/M". z88dk . Архивировано из оригинала 2020-02-01 . Получено 2020-01-26 . […] Из собранных файлов Microsoft .REL компоновщик должен сгенерировать исполняемый файл формата .PRL для MP/M . Формат .PRL по сути является файлом .COM с некоторой дополнительной информацией, позволяющей перемещать программу и ее данные на любую страницу. Как выглядит файл .PRL? Первые байты — это размер программы, за которым следует исходный адрес программы по адресу 0x0100. После программы добавляется побитовая маска, позволяющая системе MP/M знать, какие байты в программе необходимо изменить при перемещении программы. Как компоновщик делает это, не разбирая все приложение? Заранее программа скомпонована для двух разных источников 0x0100 и 0x0200 из объектов .REL. Трюк компоновщика заключается в простом распознавании того, какие байты в двух версиях исполняемого файла отличаются. Затем эти байты записываются в битовую маску, хранящуюся после исполняемого файла, и окончательная программа .PRL предназначена для запуска с 0x0100 плюс ее смещение страницы. Тот же трюк проделывается для исполняемых файлов .RSP и .SPR, за исключением того, что оба эти формата отказываются от смещения и запускаются с 0x0000 плюс их смещение страницы. […]
  • Brothers, Hardin (апрель 1983 г.). «Понимание перемещаемого кода». 80 Micro . Следующий шаг (39). 1001001, Inc .: 38, 40, 42, 45. ISSN  0744-7868 . Получено 06.02.2020 .[12][13]
  • Brothers, Hardin (апрель 1985 г.). «Перемещаемые программы: бродяги микрокомпьютеров». 80 Micro . Следующий шаг (63). CW Communications/Peterborough, Inc .: 98, 100, 102– 103. ISSN  0744-7868 . Получено 06.02.2020 .[14][15]
  • Sage, Jay (май–июнь 1988 г.). Carlson, Art (ред.). "ZCPR 3.4 - Программы типа 4". The Computer Journal (TCJ) - Программирование, Поддержка пользователей, Приложения . ZCPR3 Corner (32). Columbia Falls, Montana, USA: 10–17 [15–16]. ISSN  0748-9331. ark:/13960/t1wd4v943 . Получено 29.11.2021 .[16][17]
  • Mitchell, Bridger (июль–август 1988 г.). Carlson, Art (ред.). «Z3PLUS и перемещение — информация о ZCPR3PLUS и как писать самоперемещающийся код Z80». The Computer Journal (TCJ) — программирование, поддержка пользователей, приложения . Advanced CP/M (33). Columbia Falls, Montana, USA: 9–15. ISSN  0748-9331. ark:/13960/t36121780 . Получено 09.02.2020 .[18][19]
  • Sage, Jay (сентябрь–октябрь 1988 г.). Carlson, Art (ред.). «More on relocatable code, PRL files, ZCPR34, and Type-4 programs». The Computer Journal (TCJ) - Programming, User Support, Applications . ZCPR3 Corner (34). Columbia Falls, Montana, USA: 20–25. ISSN  0748-9331. ark:/13960/t0ks7pc39 . Получено 09.02.2020 .[20][21][22]
  • Sage, Jay (январь–февраль 1992 г.). Carlson, Art; McEwen, Chris (ред.). «Десять лет ZCPR». The Computer Journal (TCJ) — Программирование, Поддержка пользователей, Приложения . Z-System Corner (54). S. Plainfield, New Jersey, USA: Socrates Press: 3–7. ISSN  0748-9331. ark:/13960/t89g6n689 . Получено 29.11.2021 .[23][24][25]
  • Sage, Jay (май–июнь 1992 г.) [март–июнь 1992 г.]. Carlson, Art; McEwen, Chris (ред.). «Программы Type-3 и Type-4». The Computer Journal (TCJ) — Программирование, Поддержка пользователей, Приложения . Z-System Corner — Некоторые новые приложения программ Type-4 (55). S. Plainfield, New Jersey, USA: Socrates Press: 13–19. ISSN  0748-9331. ark:/13960/t4dn54d22 . Получено 29.11.2021 .[26][27]
  • Ganssle, Jack (февраль 1992 г.). «Написание перемещаемого кода — некоторый встроенный код должен выполняться по нескольким адресам». Программирование встраиваемых систем . The Ganssle Group — Совершенствуя искусство построения встраиваемых систем / TGG. Архивировано из оригинала 2019-07-18 . Получено 2020-02-20 .
Взято с "https://en.wikipedia.org/w/index.php?title=Перемещение_(вычисления)&oldid=1235472922"