Самостоятельное перемещение - Self-relocation
В компьютерном программировании самовосстанавливающийся программа - это программа, которая перемещает его собственные адресно-зависимые инструкции и данные при запуске, и поэтому он может быть загружен в память по любому адресу.[1][2] Во многих случаях самоперемещающийся код также является формой самомодифицирующийся код.
Обзор
Самостоятельное перемещение аналогично переезд процесс, используемый компоновщик -грузчик при копировании программы из внешнего хранилища в основную память; разница в том, что это сама загруженная программа, а не загрузчик в Операционная система или же ракушка который выполняет перемещение.
Одна из форм самоперемещения происходит, когда программа копирует код своих инструкций из одной последовательности ячеек в другую последовательность ячеек в основной памяти одного компьютера, а затем передает управление процессором из инструкций, найденных в исходных ячейках памяти. к инструкциям, найденным в целевых ячейках памяти. Таким образом, данные, обрабатываемые алгоритмом программы, представляют собой последовательность байтов, которые определяют программу.
Самостоятельное перемещение обычно происходит в время загрузки (после того, как операционная система загрузила программное обеспечение и передала ей управление, но еще до завершения инициализации), иногда также при изменении конфигурации программы на более позднем этапе во время время выполнения.[3][4]
Примеры
Загрузчики
Например, самоперемещение часто используется на ранних этапах начальной загрузки операционных систем на таких архитектурах, как Совместимость с IBM PC, где цепь нижнего уровня загрузчики (словно Главная загрузочная запись (MBR), Объем загрузочной записи (VBR) и начальные этапы загрузки операционных систем, таких как ДОС ) сдвигаются с места, чтобы загрузить в память следующий этап.
драйверы x86 DOS
Под ДОС, самоперемещение иногда также используется более продвинутыми водители и RSX /TSR загружая себя "высоко" в верхняя память более эффективно, чем возможно для внешних "высоких" загрузчиков (например, НАГРУЗКА ВЫСОКАЯ /HILOAD, УСТАНОВИТЬ /УСТАНОВИТЬ или же DEVICEHIGH /HIDEVICE и Т. Д.[5] начиная с DOS 5), чтобы максимально увеличить объем памяти, доступной для приложений. Это связано с тем, что операционная система не знает внутренней работы загружаемого драйвера и, следовательно, должна загрузить его в свободную область памяти, достаточно большую, чтобы содержать весь драйвер как блок, включая его код инициализации, даже если это будет освобождено после инициализации. Для TSR операционная система также должна выделить Префикс сегмента программы (PSP) и сегмент окружающей среды.[6] Это может привести к тому, что драйвер не будет загружен в наиболее подходящую свободную область памяти или даже помешает его полной загрузке. В отличие от этого, самоперемещающийся драйвер можно загрузить где угодно (в том числе в обычная память ), а затем переместите только свою (обычно гораздо меньшую) резидентную часть в подходящую область свободной памяти в верхней памяти. Кроме того, расширенные самоперемещающиеся TSR (даже если они уже загружены операционной системой в верхнюю память) могут перемещаться по большей части своего собственного сегмента PSP и буфера командной строки и освобождать свой сегмент среды, чтобы еще больше уменьшить объем памяти и избежать фрагментация. Некоторые самоперемещающиеся TSR могут также динамически изменять свою «природу» и преобразовываться в драйверы устройств, даже если они изначально загружены как TSR, тем самым обычно также освобождая некоторую память.[4] Наконец, для внешнего загрузчика технически невозможно переместить драйверы в расширенная память (EMS), область высокой памяти (HMA) или расширенная память (через DPMS или же ЗАКРЫТИЕ ), потому что эти методы требуют небольших специфичных для драйвера заглушки оставаться в обычной или верхней памяти, чтобы координировать доступ к целевой области перемещения,[7][nb 1][nb 2] а в случае драйверов устройств также потому, что заголовок драйвера всегда должен оставаться в первом мегабайте.[7][6] Для этого драйверы должны быть специально разработаны для поддержки самостоятельного перемещения в эти области.[7]
Некоторые расширенные драйверы DOS также содержат как драйвер устройства (который будет загружен операционной системой со смещением + 0000h), так и TSR (загруженный со смещением + 0100h), совместно использующие общую часть кода внутри как толстый двоичный файл.[6] Если общий код не предназначен для независимый от позиции, это требует некоторой формы исправления внутреннего адреса, аналогичной той, которая в противном случае была бы выполнена перемещение погрузчика уже; это похоже на этап исправления самоперемещения, но с кодом, уже загруженным в целевое местоположение загрузчиком операционной системы (а не самим драйвером).
Программы IBM DOS / 360 и OS / 360
IBM DOS / 360 не было возможности перемещать программы во время загрузки. Иногда поддерживалось несколько версий программы, каждая из которых создавалась для разных адресов загрузки. Особый класс программ, называемых самоперемещающимися программами, был написан так, чтобы перемещаться после загрузки.[8] IBM OS / 360 перемещали исполняемые программы, когда они были загружены в память. Требовалась только одна копия программы, но после загрузки программу нельзя было переместить (так называемый одноразовый позиционно-независимый код ).
Другие примеры
В качестве крайнего примера (многократного) самоперемещения можно создать компьютерную программу так, чтобы она не оставалась по фиксированному адресу в памяти, даже когда она выполняется. В Яблочный червь[9] это динамический самоперемещающийся.
Смотрите также
- Динамическое устранение мертвого кода
- RPLOADER - API DR-DOS для помощи удаленному / сетевому загрузочному коду в перемещении во время загрузки DOS
- Вывоз мусора
- Самовоспроизведение
- Самостоятельная ссылка
- Куайн (вычисления)
Примечания
- ^ Исключением из требования для заглушки являются случаи, когда расширенная память превращается в постоянная верхняя память менеджером памяти через EMSUMB, поэтому к нему можно получить доступ как верхняя память, а не через EMS.
- ^ Есть два исключения из требования к заглушке для загрузки драйвера в HMA: Заглушка не нужна, когда высокая память постоянно включен на машинах без ворота A20 логика, однако, поскольку это условие в целом не соблюдается, универсальные драйверы DOS не могут воспользоваться им (если только они не проверит это условие заранее). В противном случае заглушка также не нужна под DR DOS 6.0 и выше, если резидентные системные расширения (например, ПОДЕЛИТЬСЯ и NLSFUNC ) перехватывают только мультиплексное прерывание INT 2Fh, потому что затем они могут использовать бэкдорный интерфейс для подключения к цепочке прерываний в пространство ядра так что обработчик A20 ворот ядра обеспечит функциональность заглушки. Тем не менее, драйвер должен выполнить самоперемещение, чтобы правильно работать в HMA.
Рекомендации
- ^ Дхамдхере, Дхананджай М. (1999). Системное программирование и операционные системы. Нью-Дели: Тата МакГроу-Хилл Образование. п. 232. ISBN 0-07-463579-4. ISBN 978-0-07-463579-7. В архиве с оригинала на 2020-02-01. Получено 2011-11-08. (658 стр.)
- ^ Дхамдхере, Дхананджай М. (2006). Операционные системы: концептуальный подход. Нью-Дели: Тата МакГроу-Хилл Образование. п. 231. ISBN 0-07-061194-7. ISBN 978-0-07-061194-8. В архиве с оригинала на 2020-02-20. Получено 2020-02-20. (799 страниц)
- ^ Пол, Маттиас Р .; Фринке, Аксель К. (1997-10-13) [1991], FreeKEYB - усовершенствованный драйвер клавиатуры и консоли DOS (Руководство пользователя) (6.5 изд.) [1] (NB. FreeKEYB - это Unicode -на основе динамически настраиваемого драйвера, поддерживающего большинство раскладки клавиатуры, кодовые страницы, и коды стран. Использование готового макроассемблер а также набор инструментов автоматического анализа до и после обработки для создания зависимостей и преобразование кода метаданные быть встроенным в запускаемый файл рядом с бинарный код и самоотбрасывание, расслабляющий и перемещение погрузчика, драйвер поддерживает загрузку по-разному и установку как TSR или же драйвер устройства и он реализует передовые методы самоперемещения (в том числе в обычные Память DOS, UMB, неиспользованный видеопамять, или необработанная память, также использующая префикс сегмента программы перегрузка и сегмент окружающей среды рекомбинация) и на уровне байтов динамическое устранение мертвого кода в время загрузки а также самомодифицирующийся код и реконфигурируемость на время выполнения чтобы свести к минимуму объем используемой памяти в зависимости от оборудования, операционной системы и конфигурации драйверов, а также от выбранного набора функций и локали.)
- ^ а б Пол, Маттиас Р .; Фринке, Аксель К. (16 января 2006 г.), FreeKEYB - расширенный международный драйвер клавиатуры и консоли DOS (Руководство пользователя) (7 (предварительное) изд.)
- ^ «Глава 10 Управление памятью». Caldera DR-DOS 7.02 Руководство пользователя. Caldera, Inc. 1998 [1993, 1997]. Архивировано из оригинал на 2017-08-30. Получено 2017-08-30.
- ^ а б c Пол, Маттиас Р. (2002-04-06). "Re: [fd-dev] ОБЪЯВЛЕНИЕ: CuteMouse 2.0 alpha 1". freedos-dev. В архиве из оригинала 07.02.2020. Получено 2020-02-07.
[…] Добавьте в драйвер заголовок драйвера устройства SYS, чтобы CTMOUSE мог быть оба в одном, нормальный TSR и драйвер устройства - аналогичный нашему расширенному драйверу клавиатуры FreeKEYB. […] В этом нет необходимости DR DOS потому что УСТАНОВИТЬ = поддерживается, поскольку DR DOS 3.41+ и DR DOS сохраняет порядок [D] CONFIG.SYS директивы […], но это […] улучшит […] гибкость MS-DOS /ПК DOS системы, которые […] всегда выполняют УСТРОЙСТВО = директивы перед любыми операторами INSTALL =, независимо от их порядка в файле. […] Программное обеспечение может потребовать, чтобы драйвер мыши присутствовал в качестве драйвера устройства, поскольку драйверы мыши всегда были драйверами устройств в прежние времена. У этих драйверов мыши были определенные имена драйверов устройств в зависимости от того, какой протокол они использовали ("ПК $ МЫШЬ " за Режим мышиных систем например), и некоторое программное обеспечение может искать эти драйверы, чтобы определить, какой тип мыши будет использоваться. […] Еще одним преимуществом было бы то, что драйверы устройств обычно потребляют меньше памяти (нет среда, нет PSP ) […] По сути, это хитрый заголовок файла, другой код для синтаксического анализа командной строки, другая точка входа и строка выхода и некоторая магия сегментов для преодоления разницы ORG 0 / ORG 100h. Самостоятельная загрузка драйвера устройства немного сложнее, поскольку вы должны оставить заголовок драйвера на месте и переместить только оставшуюся часть драйвера […]
- ^ а б c Пол, Матиас Р. (2002-02-02). "Treiber Dynamisch nachladen" [Загрузка драйверов динамически] (на немецком языке). Группа новостей: de.comp.os.msdos. В архиве из оригинала на 09.09.2017. Получено 2017-07-02. (NB. Дается обзор методов с высокой загрузкой в DOS, включая использование НАГРУЗКА ВЫСОКАЯ другие команды и методы самоперемещения в UMB используя XMSUMB API. Также обсуждается более сложные методы необходимо для TSR, чтобы переехать в HMA использование перемещение смещения внутри сегмента.)
- ^ Системы управления Бутом (1972-11-01). «Пропускная способность - получаете ли вы все, чего заслуживаете? - ДОСРЕЛО». Computerworld - Newsweekly для компьютерного сообщества (рекламное объявление). VI (44). Сан-Франциско, Калифорния, США: Computerworld, Inc. п. 9. В архиве из оригинала от 06.02.2020. Получено 2020-02-07.
[…] DOSRELO предлагает метод изготовления ДОС Самостоятельное перемещение проблемных программ. DOSRELO обеспечивает возможность самоперемещения всех программ, независимо от языка, путем добавления логики точки входа в объектный код программы до Редактор связей каталогизирует это на Базовая библиотека изображений. […]
- ^ Дьюдни, Александр Киватин (Март 1985 г.). "Computer Recreations - основной боевой бестиарий вирусов, червей и других угроз компьютерной памяти". Scientific American. 285: 38–39. В архиве из оригинала на 2017-07-04. Получено 2017-07-04.
дальнейшее чтение
- Килдалл, Гэри Арлен (Февраль 1978 г.). «Простая техника статического перемещения абсолютного машинного кода». Журнал доктора Добба по компьютерной гимнастике и ортодонтии. Народная компьютерная компания. 3 (2): 10–13 (66–69). ISBN 0-8104-5490-4. #22. В архиве из оригинала на 09.09.2017. Получено 2017-08-19. [2] [3] [4] (Этот метод изменения размера, названный перемещение границы страницы, может применяться статически к CP / M-80 образ диска с использованием MOVCPM чтобы максимизировать TPA для запуска программ. Он также динамически использовался отладчиком CP / M Инструмент динамической отладки (ДДТ), чтобы переместиться в верхнюю память. Тот же подход был независимо разработан Брюс Ван Натта из IMS Associates производить перемещаемые PL / M код. В качестве перемещение границы абзаца другой вариант этого метода позже использовался динамически HMA самовосстанавливающийся TSR подобно KEYB, ПОДЕЛИТЬСЯ, и NLSFUNC под DR DOS 6.0 и выше. Намного более сложный и гранулированный на уровне байтов Метод офсетного перемещения, основанный на похожем подходе, был независимо разработан и реализован Маттиасом Р. Полом и Акселем К. Фринке для своих динамическое устранение мертвого кода чтобы динамически минимизировать след резидентных драйверов и резидентных драйверов (таких как FreeKEYB) во время выполнения.)
- Хайтт, Роберт; Юбэнкс, Гордон; Роландер, Томас «Том» Алан; Законы, Дэвид; Michel, Howard E .; Халла, Брайан; Уортон, Джон Харрисон; Берг, Брайан; Су, Вейлиан; Килдалл, Скотт; Кампе, Билл (25 апреля 2014 г.). Законы, Дэвид (ред.). «Наследие Гэри Килдалла: посвящение CP / M IEEE» (PDF) (транскрипция видео). Пасифик Гроув, Калифорния, США: Музей истории компьютеров. Номер ссылки CHM: X7170.2014. В архиве (PDF) из оригинала 27.12.2014. Получено 2020-01-19.
[…] Законы: […] "динамическое перемещение "ОС. Можете ли вы рассказать нам, что это такое и почему это было важно? […] Юбэнкс: […] Какие Гэри действительно […] было […] ошеломляющим. […] Я помню день в школа он прыгнул в лабораторию и сказал: «Я понял, как переехать. Он воспользовался тем фактом, что единственным байтом всегда был старший байт. И поэтому он создал битовая карта. […] Неважно, сколько памяти было у компьютера, операционная система всегда могла быть перемещена в верхнюю память. Следовательно, вы можете коммерциализировать это […] на машинах с разным объемом памяти. […] Вы не могли продать 64K CP / M и 47K CP / M. Было бы просто смешно иметь жесткую компиляцию адресов. Итак, Гэри понял это однажды ночью, вероятно, посреди ночи, думая о каком-то кодировании, и это действительно сделало возможным коммерциализацию CP / M. Я действительно думаю, что без этого переезда это было бы очень сложной проблемой. Чтобы заставить людей покупать это, им это показалось бы сложным, и если бы вы добавили больше памяти, вам пришлось бы купить другую операционную систему. […] Intel […] имел байты перевернуты Правильно, для адресов памяти. Но они всегда были на одном и том же месте, поэтому вы могли переместить его на 256 байт границы, точнее. Поэтому вы всегда можете переместить его, просто используя растровое изображение того, где находятся эти […] законы: безусловно, самое красноречивое объяснение, которое я когда-либо слышал о динамическом перемещении […]
[5][6] (33 страницы) - Митчелл, Бриджер (июль – август 1988 г.). Карлсон, Искусство (ред.). «Z3PLUS & Relocation - Информация о ZCPR3PLUS и как написать самовмещающийся код Z80». Компьютерный журнал (TCJ) - Программирование, поддержка пользователей, приложения. Продвинутый CP / M. Колумбийский водопад, Монтана, США (33): 9–15. ISSN 0748-9331. ковчег: / 13960 / t36121780. Получено 2020-02-09. [7][8]
- Сейдж, Джей (сентябрь – октябрь 1988 г.). Карлсон, Искусство (ред.). "ZCPR3 Corner - Подробнее о перемещаемом коде, файлах PRL, ZCPR34 и программах Type-4". Компьютерный журнал (TCJ) - Программирование, поддержка пользователей, приложения. Продвинутый CP / M. Коламбия-Фоллс, Монтана, США (34): 20–25. ISSN 0748-9331. ковчег: / 13960 / t0ks7pc39. Получено 2020-02-09. [9][10]
- Харрелл III, Джон Б. (октябрь 1983 г.). «ДОСПЛЮС 3.5». 80 микро. Рассмотрение. 1001001, Inc. (45): 160, 162, 164–168, 170. ISSN 0744-7868. ковчег: / 13960 / t8z906r42. Получено 2020-02-06. [11][12]
- Смит, Ли; Хейнс, Лайонел (1989-02-02) [1987-08-14]. Формат изображения приложения ОС RISC (ранее формат изображения Arthur) (Технический меморандум) (1.00 ред.). Кембридж, Великобритания: Acorn Computers Limited, Группа языков программирования. PLG-AIF. В архиве из оригинала на 30.08.2017. Получено 2017-08-30.
- Свойства формата изображения ARM. 1993. В архиве из оригинала 31.08.2017. Получено 2017-08-31.
- Гек, Алекс (14.08.2016). "Nachladbare Treiber unter CP / M - PRL2COM". Домашний компьютер DDR (на немецком). В архиве из оригинала от 21.02.2020. Получено 2020-02-21; Pohlers, Volker (2017-04-24) [2012-02-20, 2009, 2002, 1988-07-26, 1987-10-11]. «PRL2COM». Домашний компьютер DDR (на немецком). В архиве из оригинала от 21.02.2020. Получено 2020-02-21.