Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Relocation (информатика) )
Перейти к навигации Перейти к поиску

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

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

Сегментация [ править ]

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

Таблица перемещения [ править ]

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

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

DOS и 16-битная Windows [ править ]

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

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

32-битная Windows [ править ]

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

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

64-битная Windows [ править ]

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

Unix-подобные системы [ править ]

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

Процедура переселения [ править ]

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

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

Пример [ править ]

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

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

См. Также [ править ]

  • Компоновщик (вычисления)
  • Библиотека (вычислительная)
  • Файл объекта
  • Предварительная привязка
  • Статическая библиотека
  • Самостоятельный переезд
  • Позиционно-независимый код (PIC)
  • Ребазинг
  • Вывоз мусора

Ссылки [ править ]

  1. ^ «Типы объектного кода». Справочное руководство загрузчика приложений iRMX 86 (PDF) . Intel . С. 1-2, 1-3. Архивировано (PDF) из оригинала 11 января 2020 года . Проверено 11 января 2020 . […] Абсолютный код и абсолютный объектный модуль - это код, который был обработан 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. ^ a b Левин, Джон Р. (2000) [октябрь 1999]. «Глава 1: Связывание и загрузка и Глава 3: Объектные файлы». Линкеры и загрузчики . Серия Морган Кауфманн в программной инженерии и программировании (1-е изд.). Сан-Франциско, США: Морган Кауфманн . п. 5. ISBN 1-55860-496-0. OCLC  42413382 . Архивировано 05 декабря 2012 года . Проверено 12 января 2020 .Код: [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. Архивировано 07 июля 2008 года . Проверено 15 января 2007 .
  4. ^ «Исполняемый и связываемый формат (ELF)» (PDF) . skyfree.org . Спецификация переносимых форматов стандартов интерфейса инструментов (TIS), версия 1.1. Архивировано (PDF) из оригинала на 24.12.2019 . Проверено 1 октября 2018 .

Дальнейшее чтение [ править ]

  • Джонсон, Гленн (1975-12-21) [1975-11-13], 11/34 Базовый логический тест управления памятью , Digital Equipment Corporation (DEC), MAINDEC-11-DFKTA-AD , получено 19 августа 2017 г.
  • Килдалл, Гэри Арлен (февраль 1978 г.). «Простая техника статического перемещения абсолютного машинного кода» . Журнал доктора Добба по компьютерной гимнастике и ортодонтии . Народная компьютерная компания . 3 (2): 10–13 (66–69). ISBN 0-8104-5490-4. №22. Архивировано 9 сентября 2017 года . Проверено 19 августа 2017 . [4] [5] [6] (Этот метод «изменения размера», называемый перемещением границы страницы , может быть применен статически к образу диска CP / M-80 с помощью MOVCPM  [ pl ] , чтобы максимизировать TPA для запуска программ. Он также динамически использовался отладчиком CP / M Dynamic Debugging Tool (DDT) для перемещения в более высокую память. Тот же подход был независимо разработан Брюсом Ван Натта из IMS Associates для создания перемещаемого кода PL / M. В качестве перемещения границы абзаца , другой вариантЭтот метод позже использовался динамически перемещающимися резидентами HMA, такими как KEYB , SHARE и NLSFUNC под DR DOS 6.0 и выше. Гораздо более сложный и детализированный метод на уровне байтов, основанный на подобном подходе, был независимо разработан и реализован Маттиасом Р. Полом и Акселем К. Фринке для их динамического устранения мертвого кода, чтобы динамически минимизировать следы времени выполнения резидентных драйверов и резидентных драйверов (TSR) ( вроде FreeKEYB).)
  • Хайтт, Роберт; Юбэнкс, Гордон ; Роландер, Томас «Том» Алан ; Законы, Дэвид; Michel, Howard E .; Халла, Брайан; Уортон, Джон Харрисон ; Берг, Брайан; Су, Вейлиан; Килдалл, Скотт ; Кампе, Билл (25 апреля 2014 г.). Законы, Дэвид (ред.). "Наследие Гэри Килдалла: Посвящение CP / M IEEE" (PDF) (транскрипция видео). Пасифик Гроув, Калифорния, США: Музей истории компьютеров . Номер ссылки CHM: X7170.2014. Архивировано (PDF) из оригинала 27 декабря 2014 года . Проверено 19 января 2020 . […] Законы: […] «динамическое перемещение» ОС. Вы можете рассказать нам, что это такое и почему это было важно? […]Юбэнкс : […] то, что сделал Гэри […] было […] ошеломляющим. […] Я помню день в школе, когда он прыгнул в лабораторию и сказал: «Я придумал, как переехать». Он воспользовался тем фактом, что единственным байтом всегда был старший байт . И поэтому он создал растровое изображение . […] Неважно, сколько памяти было у компьютера, операционная система всегда могла быть перемещена в верхнюю память. Следовательно, вы можете коммерциализировать это […] на машинах с разным объемом памяти. […] Нельзя продавать 64K CP / Mи 47K CP / M. Было бы просто смешно иметь жесткую компиляцию адресов. Итак, Гэри понял это однажды ночью, вероятно, посреди ночи, думая о каком-то кодировании, и это действительно сделало возможным коммерциализацию CP / M. Я действительно думаю, что без этого переезда это было бы очень сложной проблемой. Чтобы заставить людей покупать это, им это показалось бы сложным, и если бы вы добавили больше памяти, вам пришлось бы купить другую операционную систему. […] Intel […] поменяла местами байты для адресов памяти. Но они всегда были в одном и том же месте, поэтому вы могли переместить его на границе в 256 байт., точнее. Поэтому вы всегда можете переместить его, просто используя растровое изображение того, где находятся эти […] законы: безусловно, самое красноречивое объяснение динамического перемещения, которое я когда-либо слышал […] [7] [8] (33 страницы)
  • Либер, Экхард; фон Массенбах, Томас (1987). "CP / M 2 lernt dazu. Modulare Systemerweiterungen auch für das 'alte' CP / M". c't - journal für computertechnik (часть 1) (на немецком языке). Heise Verlag . 1987 (1): 124–135; Либер, Экхард; фон Массенбах, Томас (1987). "CP / M 2 lernt dazu. Modulare Systemerweiterungen auch für das 'alte' CP / M". c't - journal für computertechnik (часть 2) (на немецком языке). Heise Verlag . 1987 (2): 78–85; Гек, Алекс (09.10.2016). "RSM für CP / M 2.2" . Домашний компьютер DDR (на немецком языке). Архивировано 25 ноября 2016 года . Проверено 25 ноября 2016 .
  • Гузис, Чарльз «Чак» П. (2015-03-16). «Re: Программирование на языке ассемблера CP / M» . Винтажный компьютерный форум . Жанр: CP / M и MP / M. Архивировано 01 февраля 2020 года . Проверено 1 февраля 2020 . […] Вы когда-нибудь задумывались, как работает MOVCPM  [ pl ] ? Поскольку BDOS и CCP находятся в верхней памяти, над пользовательским приложением, адреса должны изменяться каждый раз при изменении размера системной памяти. Теперь это требует перестановки адресов в коде 8080 , поскольку относительная адресацияне является частью оборудования. Как это сделать, не реализовав полноценный перемещающий ассемблер и загрузчик? На самом деле это довольно умно, и MP / M даже использует эту схему для создания файлов, перемещаемых по страницам. Вы просто собираете исходную программу дважды, причем вторая точка отсчета сборки на 100H (256 байт) выше первой. Затем сравниваются два двоичных изображения, байт за байтом, и строится карта, где пары байтов различаются по значению ровно на 100H. Результатом является список мест, в которых необходимо изменить значение перемещения, если место программы в памяти должно быть перемещено. MP / M называет этот вид файла PRL (перемещаемая страница), но я не знаю, придумал ли CP / M 2.2 когда-либо для него название. […]
  • Гузис, Чарльз «Чак» П. (2015-07-29). "Re: Как работает MOVCPM.COM?" . Винтажный компьютерный форум . Жанр: CP / M и MP / M. Архивировано 01 февраля 2020 года . Проверено 1 февраля 2020 . […] MOVCPM  [ pl ] использует ранний тип формата PRL. В основном CP / M собирается дважды; второй раз - смещение в байтах 100H. Два двоичных файла сравниваются и создается растровое изображение . Установленный бит означает, что старший байтадреса подлежит корректировке. Байты адреса младшего разряда не затрагиваются; отсюда и "Файл перемещаемой страницы". Каждый байт в битовой карте соответствует 8 байтам в двоичных данных. […] Итак, все, что нужно переместить в MOVCPM, является частью изображения и его битовой карты перемещения. […]
  • Гузис, Чарльз «Чак» П. (2016-11-08). "Re: Безопасно ли использовать RST 28h в программах сборки CP / M?" . Винтажный компьютерный форум . Жанр: CP / M и MP / M. Архивировано 01 февраля 2020 года . Проверено 1 февраля 2020 . […] Я упомянул файлы PRL и то, как они изначально появились с MOVCPM  [ pl ] , но стали неотъемлемой частью MP / M и CP / M 3.0 . Но файлы PRL используют битовую картув котором каждый бит соответствует ячейке памяти; Один бит указывает, что смещение перемещения страницы должно быть добавлено в соответствующую ячейку памяти. Если у вас очень мало абсолютных ссылок на память (в отличие от относительных), вы можете использовать список указателей (2 байта на ссылку), а не растровое изображение. Это маловероятно для кода 8080, который не имеет относительных переходов, но может быть учтено для кода Z80 . Уловка, чтобы быстро это выяснить, состоит в том, чтобы собрать вашу программу дважды; второй сдвиг по времени на 100H, затем сравните два двоичных файла. Преимущество перемещения во время выполнения состоит в том, что вам не нужно нести штраф за код, который пытается обойти проблему перемещения - никаких «уловок»; просто напишите прямой код. […]
  • Рот, Ричард Л. (февраль 1978 г.) [1977]. «Переезд - это не просто перемещение программ» . Журнал доктора Добба по компьютерной гимнастике и ортодонтии . Риджфилд, Калифорния, США: Народная компьютерная компания . 3 (2): 14–20 (70–76). ISBN 0-8104-5490-4. №22. Архивировано 20 апреля 2019 года . Проверено 19 апреля 2019 .
  • Калингарт, Питер (1979) [1978-11-05]. «8.2.2 Перемещение погрузчика». Написано в Университете Северной Каролины в Чапел-Хилл . В Горовиц, Эллис (ред.). Ассемблеры, компиляторы и перевод программ . Серия «Компьютерное программное обеспечение» (1-е издание, 1-е изд.) Потомак, штат Мэриленд, США: Computer Science Press, Inc. стр.  237 -241. ISBN 0-914894-23-4. ISSN  0888-2088 . LCCN  78-21905 . Проверено 20 марта 2020 . (2 + xiv + 270 + 6 страниц)
  • Формат файла Microsoft OBJ . Microsoft , Служба поддержки продуктов. Примечание по применению SS0288. Архивировано 9 сентября 2017 года . Проверено 21 августа 2017 .
  • Таненбаум, Эндрю Стюарт ; Бос, Герберт (2015). Современные операционные системы (4-е изд.). ISBN Pearson Education Inc.  978-0-13359162-0.
  • Эллиотт, Джон К. (2012-06-05) [2000-01-02]. «Формат файла PRL» . Seasip.info . Архивировано 26 января 2020 года . Проверено 26 января 2020 . […] Файл PRL - это перемещаемый двоичный файл, используемый MP / M и CP / M Plus для различных модулей, кроме файлов .COM . Формат файла также используется для файлов FID на Amstrad PCW . Существует несколько форматов файлов, в которых используются версии PRL: SPR (системный PRL), RSP (резидентный системный процесс). LINK-80 также может создавать файлы OVL (наложения), которые имеют заголовок PRL, но не могут быть перемещены. Драйверы GSX находятся в формате PRL; так жеРезидентные системные расширения (.RSX). […] [9]
  • Эллиотт, Джон К. (2012-06-05) [2000-01-02]. «Формат Microsoft REL» . Seasip.info . Архивировано 26 января 2020 года . Проверено 26 января 2020 . […] Формат REL создается Microsoft M80 и RMAC Digital Research . […]
  • feilipu (2018-09-05) [2018-09-02]. «Поддержка PRL, исполняемый файл перемещаемой страницы для MP / M» . z88dk . Архивировано 01 февраля 2020 года . Проверено 26 января 2020 . [...] Из собранного Microsoft .rel файлов линкер должен сгенерировать формат .prl исполняемый файл для MP / M . Формат .PRL - это, по сути, файл .COM.с некоторой дополнительной информацией, позволяющей перемещать программу и ее данные на любую страницу. Как выглядит файл .PRL? Первые байты - это размер программы, за которым следует исходная точка программы по адресу 0x0100. После программы добавляется побайтовая маска, позволяющая системе MP / M знать, какие байты в программе необходимо изменить при перемещении программы. Как компоновщик делает это без разборки всего приложения? Заранее программа связывается для двух разных источников 0x0100 и 0x0200 из объектов .REL. Уловка компоновщика просто распознает, какие байты в двух версиях исполняемого файла различаются. Эти байты затем записываются в битовую маску, сохраняемую после исполняемого файла, и окончательная программа .PRL предназначена для запуска с 0x0100 плюс ее смещение страницы. Тот же трюк проделывается с .RSP и.Исполняемые файлы SPR, за исключением того, что оба этих формата не используют смещение и запускаются с 0x0000 плюс смещение их страницы. […]
  • Братья, Хардин (апрель 1983 г.). «Понимание перемещаемого кода» . 80 Micro . Следующий шаг. 1001001, Inc. (39): 38 , 40, 42, 45. ISSN  0744-7868 . Проверено 6 февраля 2020 . [10] [11]
  • Братья, Хардин (апрель 1985 г.). "Перемещаемые программы: Бродяги микрокомпьютеров" . 80 Micro . Следующий шаг. CW Communications / Peterborough, Inc. (63): 98 , 100, 102–103. ISSN  0744-7868 . Проверено 6 февраля 2020 . [12] [13]
  • Митчелл, Бриджер (июль – август 1988 г.). Карлсон, Искусство (ред.). «Z3PLUS & Relocation - Информация о ZCPR3PLUS и как написать самоперемещающийся код Z80» . Компьютерный журнал (TCJ) - Программирование, поддержка пользователей, приложения . Продвинутый CP / M. Columbia Falls, штат Монтана, США (33): 9 -15. ISSN  0748-9331 . ковчег: / 13960 / t36121780 . Проверено 9 февраля 2020 . [14] [15]
  • Сейдж, Джей (сентябрь – октябрь 1988 г.). Карлсон, Искусство (ред.). «Уголок ZCPR3 - Подробнее о перемещаемом коде, файлах PRL, программах ZCPR34 и Type-4» . Компьютерный журнал (TCJ) - Программирование, поддержка пользователей, приложения . Продвинутый CP / M. Columbia Falls, штат Монтана, США (34): 20 -25. ISSN  0748-9331 . ковчег: / 13960 / t0ks7pc39 . Проверено 9 февраля 2020 . [16] [17]
  • Ганссл, Джек (февраль 1992 г.). «Написание перемещаемого кода - некоторый встроенный код должен работать более чем по одному адресу» . Программирование встроенных систем . Группа Ganssle - Совершенствуя искусство создания встраиваемых систем / TGG. Архивировано 18 июля 2019 года . Проверено 20 февраля 2020 .