В компьютерном программировании самоперемещающаяся программа - это программа, которая перемещает свои собственные зависящие от адреса инструкции и данные при запуске и, следовательно, может быть загружена в память по любому адресу. [1] [2] Во многих случаях самоперемещающийся код также является формой самомодифицирующегося кода .
Обзор
Самоперемещение аналогично процессу перемещения, используемому компоновщиком - загрузчиком, когда программа копируется из внешнего хранилища в основную память; разница в том, что перемещение выполняется не загрузчиком операционной системы или оболочки , а самой загруженной программой .
Одна из форм самоперемещения происходит, когда программа копирует код своих инструкций из одной последовательности ячеек в другую последовательность ячеек в основной памяти одного компьютера, а затем передает управление процессором из инструкций, найденных в исходных ячейках памяти. к инструкциям, найденным в целевых ячейках памяти. Таким образом, данные, обрабатываемые алгоритмом программы, представляют собой последовательность байтов, которые определяют программу.
Самоперемещение обычно происходит во время загрузки (после того, как операционная система загрузила программное обеспечение и передала ей управление, но еще до завершения инициализации), иногда также при изменении конфигурации программы на более позднем этапе во время выполнения . [3] [4]
Примеры
Загрузчики
Например, самоперемещение часто используется на ранних этапах начальной загрузки операционных систем на таких архитектурах, как совместимые с IBM PC , где загрузчики цепочки нижнего уровня (такие как основная загрузочная запись (MBR), загрузочная запись тома (VBR) и начальная загрузочная запись ) этапы загрузки операционных систем, таких как DOS ) перемещаются с места, чтобы загрузить следующий этап в память.
драйверы x86 DOS
Под DOS самоперемещение иногда также используется более продвинутыми драйверами и RSX / TSR, загружающими себя "высоко" в верхнюю память более эффективно, чем это возможно для внешних "высоких" загрузчиков (таких как LOADHIGH / HILOAD , INSTALLHIGH / HIINSTALL или DEVICEHIGH / HIDEVICE и т. Д. [5], начиная с DOS 5), чтобы максимально увеличить объем памяти, доступной для приложений. Это связано с тем, что операционная система не знает о внутренней работе загружаемого драйвера и, следовательно, должна загрузить его в свободную область памяти, достаточно большую, чтобы содержать весь драйвер как блок, включая его код инициализации, даже если это будет освобождено после инициализации. Для TSR операционная система также должна выделить префикс сегмента программы (PSP) и сегмент среды . [6] Это может привести к тому, что драйвер не будет загружен в наиболее подходящую свободную область памяти или даже предотвратить его загрузку на высоком уровне. В отличие от этого, самоперемещающийся драйвер можно загрузить где угодно (в том числе в обычную память ), а затем переместить только свою (обычно гораздо меньшую) резидентную часть в подходящую свободную область памяти в верхней памяти. Кроме того, расширенные самоперемещающиеся TSR (даже если они уже загружены операционной системой в верхнюю память) могут перемещаться по большей части своего собственного сегмента PSP и буфера командной строки и освобождать свой сегмент среды, чтобы еще больше уменьшить объем памяти и избежать фрагментация . Некоторые самоперемещающиеся TSR могут также динамически изменять свою «природу» и преобразовываться в драйверы устройств, даже если они изначально загружены как TSR, тем самым обычно также освобождая некоторую память. [4] Наконец, для внешнего загрузчика технически невозможно переместить драйверы в расширенную память (EMS), область верхней памяти (HMA) или расширенную память (через DPMS или CLOAKING ), потому что для этих методов требуются небольшие заглушки для конкретных драйверов. остаются в обычной или верхней памяти для координации доступа к целевой области перемещения [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 перемещала исполняемые программы при загрузке в память. Требовалась только одна копия программы, но после загрузки программу нельзя было переместить (так называемый одноразовый позиционно-независимый код ).
Другие примеры
В качестве крайнего примера (многократного) самоперемещения можно построить компьютерную программу так, чтобы она не оставалась по фиксированному адресу в памяти, даже когда она выполняется. Компании Apple Worm [9] представляет собой динамичную себя средства перемещения.
Смотрите также
- Динамическое устранение мертвого кода
- RPLOADER - DR-DOS API, помогающий удаленному / сетевому загрузочному коду перемещаться во время загрузки DOS.
- Вывоз мусора
- Самовоспроизведение
- Самостоятельная ссылка
- Куайн (вычисления)
Заметки
- ^ Исключением из требования для заглушки является ситуация ,когда расширенная память преобразуется в постоянную верхнюю память диспетчером памяти через EMSUMB , и, таким образом, к ней эффективно обращаются как к верхней памяти , а не через EMS .
- ^ Есть два исключения из требования заглушки для загрузки драйвера в HMA : заглушка не требуется, если верхняя память постоянно включена на машинах безлогики логики A20 , однако, поскольку это условие в целом не выполняется, общий DOS водители не могут воспользоваться этим преимуществом (если только они не проверит это условие заранее). В противном случае заглушка также не нужна в DR DOS 6.0 и выше, когда резидентные системные расширения (такие как SHARE и NLSFUNC ) перехватывают только мультиплексное прерывание INT 2Fh, потому что они могут затем использовать бэкдорный интерфейс для подключения к цепочке прерываний в пространстве ядра. чтобы обработчик A20 шлюза ядра обеспечивал функциональность заглушки. Тем не менее, драйвер должен выполнить самоперемещение, чтобы правильно работать в HMA.
Рекомендации
- ^ Dhamdhere, Дананай М. (1999). Системное программирование и операционные системы . Нью-Дели: образование Таты МакГроу-Хилл . п. 232. ISBN. 0-07-463579-4. Архивировано 01 февраля 2020 года . Проверено 8 ноября 2011 . (658 стр.)
- ^ Дхамдхере, Дхананджай М. (2006). Операционные системы: концептуальный подход . Нью-Дели: образование Таты МакГроу-Хилл . п. 231. ISBN. 0-07-061194-7. Архивировано 20 февраля 2020 года . Проверено 20 февраля 2020 . (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 . Проверено 30 августа 2017 .
- ^ а б в Пол, Матиас Р. (2002-04-06). «Re: [fd-dev] ОБЪЯВЛЕНИЕ: CuteMouse 2.0 alpha 1» . freedos-dev . Архивировано 07 февраля 2020 года . Проверено 7 февраля 2020 .
[…] Добавьте к драйверу заголовок драйвера устройства SYS, чтобы CTMOUSE мог быть одновременно в одном , обычным TSR и драйвером устройства - аналогично нашему расширенному драйверу клавиатуры FreeKEYB. […] В DR DOS в этом нет необходимости, потому что INSTALL = поддерживается, поскольку DR DOS 3.41+ и DR DOS сохраняет порядок директив [ d] config.sys […], но это […] улучшит […] гибкость в системах MS-DOS / PC DOS , которые […] всегда выполняют директивы device = перед любыми операторами INSTALL =, независимо от их порядка в файле. […] Программное обеспечение может потребовать, чтобы драйвер мыши присутствовал в качестве драйвера устройства, поскольку драйверы мыши всегда были драйверами устройств в прежние времена. У этих драйверов мыши есть определенные имена драйверов устройств в зависимости от того, какой протокол они использовали (например, « PC $ MOUSE » для режима мыши ), и некоторое программное обеспечение может искать эти драйверы, чтобы определить правильный тип используемой мыши. . […] Еще одним преимуществом было бы то, что драйверы устройств обычно потребляют меньше памяти (без среды , без PSP ) […] По сути, это сложный заголовок файла, другой код для синтаксического анализа командной строки, другая точка входа и строка выхода, а также некоторые магия сегмента, чтобы преодолеть разницу ORG 0 / ORG 100h. Самостоятельная загрузка драйвера устройства немного сложнее, так как вам нужно оставить заголовок драйвера на месте и переместить только оставшуюся часть драйвера […]
- ^ а б в Пол, Матиас Р. (2002-02-02). "Treiber Dynamisch nachladen" [Динамическая загрузка драйверов] (на немецком языке). Группа новостей : de.comp.os.msdos . Архивировано 9 сентября 2017 года . Проверено 2 июля 2017 .(NB. Дается обзор методов с высокой нагрузкой в DOS, включая использование команд LOADHIGH и т. Д. И методы самоперемещения в UMB с использованием XMSUMB API. Также обсуждаются более сложные методы, необходимые для TSR для перемещения в HMA с использованием intra -сегмент смещения смещения .)
- ^ Boothe Management Systems (1972-11-01). «Пропускная способность - получаете ли вы все, чего заслуживаете? - ДОСРЕЛО» . Computerworld - еженедельник для компьютерного сообщества (реклама). VI (44). Сан-Франциско, Калифорния, США: Computerworld, Inc. стр. 9. Архивировано 06.02.2020 . Проверено 7 февраля 2020 .
[…] DOSRELO предоставляет метод самоперемещения проблемных программ DOS . DOSRELO обеспечивает возможность самоперемещения для всех программ, независимо от языка, путем добавления логики точки входа в объектный код программы до того, как редактор связей внесет ее в каталог в основной библиотеке изображений . […]
- ^ Дьюдни, Александр Киватин (март 1985). «Компьютерные развлечения - основной боевой бестиарий вирусов, червей и других угроз компьютерной памяти» . Scientific American . 285 : 38–39. Архивировано 4 июля 2017 года . Проверено 4 июля 2017 .
дальнейшее чтение
- Килдалл, Гэри Арлен (февраль 1978 г.). «Простая техника статического перемещения абсолютного машинного кода» . Журнал доктора Добба по компьютерной гимнастике и ортодонтии . Народная компьютерная компания . 3 (2): 10–13 (66–69). ISBN 0-8104-5490-4. №22. Архивировано 9 сентября 2017 года . Проверено 19 августа 2017 . [2] [3] [4] (Этот метод «изменения размера», называемый перемещением границы страницы , может быть применен статически к образу диска CP / M-80 с помощью MOVCPM , чтобы максимизировать TPA для запуска программ. Он также используется динамически CP / M отладчик Dynamic Debugging Tool (DDT) , чтобы переместить себя в более высокой памяти. Такой же подход был самостоятельно разработан Брюс Ван Натта из IMS Associates производить перемещаемый PL / M - код. в пункте пограничного перемещения другого Вариант этого метода позже использовался динамически перемещающимися самоперемещающимися TSR HMA, такими как KEYB , SHARE и NLSFUNC под DR DOS 6.0 и более поздних версий . Гораздо более сложный метод перемещения гранулярного смещения на уровне байтов, основанный на подобном подходе, был независимо разработан и реализованы Маттиасом Р. Полом и Акселем К. Фринке для их динамического удаления мертвого кода, чтобы динамически минимизировать след резидентных драйверов и резидентных драйверов (таких как 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-байтовую границу . Поэтому вы всегда можете переместить его, просто используя растровое изображение того, где находятся эти […] законы: безусловно, самое красноречивое объяснение, которое я когда-либо слышал о динамическом перемещении […]
[5] [6] (33 страницы) - Митчелл, Бриджер (июль – август 1988 г.). Карлсон, Искусство (ред.). «Z3PLUS & Relocation - Информация о ZCPR3PLUS и как написать самоперемещающийся код Z80» . Компьютерный журнал (TCJ) - Программирование, поддержка пользователей, приложения . Продвинутый CP / M. Колумбия-Фолс, Монтана, США (33): 9–15. ISSN 0748-9331 . ковчег: / 13960 / t36121780 . Проверено 9 февраля 2020 . [7] [8]
- Сейдж, Джей (сентябрь – октябрь 1988 г.). Карлсон, Искусство (ред.). «Уголок ZCPR3 - Подробнее о перемещаемом коде, файлах PRL, программах ZCPR34 и Type-4» . Компьютерный журнал (TCJ) - Программирование, поддержка пользователей, приложения . Продвинутый CP / M. Колумбия-Фолс, Монтана, США (34): 20–25. ISSN 0748-9331 . ковчег: / 13960 / t0ks7pc39 . Проверено 9 февраля 2020 . [9] [10]
- Харрелл III, Джон Б. (октябрь 1983 г.). «ДОСПЛЮС 3.5» . 80 Micro . Рассмотрение. 1001001, Inc. (45): 160, 162, 164–168, 170. ISSN 0744-7868 . ark: / 13960 / t8z906r42 . Проверено 6 февраля 2020 . [11] [12]
- Смит, Ли; Хейнс, Лайонел (1989-02-02) [1987-08-14]. RISC OS Application Image Format (ранее Arthur Image Format) (Технический меморандум) (1.00 ред.). Кембридж, Великобритания: Acorn Computers Limited , группа языков программирования. PLG-AIF. Архивировано 30 августа 2017 года . Проверено 30 августа 2017 .
- Свойства формата изображения ARM . 1993. Архивировано 31 августа 2017 года . Проверено 31 августа 2017 .
- Гек, Алекс (14.08.2016). "Nachladbare Treiber unter CP / M - PRL2COM" . Домашний компьютер DDR (на немецком языке). Архивировано 21 февраля 2020 года . Проверено 21 февраля 2020 ;Pohlers, Volker (2017-04-24) [2012-02-20, 2009, 2002, 1988-07-26, 1987-10-11]. «PRL2COM» . Домашний компьютер DDR (на немецком языке). Архивировано 21 февраля 2020 года . Проверено 21 февраля 2020 .