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

В компьютерном программировании самоперемещающаяся программа - это программа, которая перемещает свои собственные зависящие от адреса инструкции и данные при запуске и, следовательно, может быть загружена в память по любому адресу. [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.
  • Вывоз мусора
  • Самовоспроизведение
  • Самостоятельная ссылка
  • Куайн (вычисления)

Заметки [ править ]

  1. ^ Исключением из требования для заглушки является ситуация ,когда расширенная память преобразуется в постоянную верхнюю память диспетчером памяти через EMSUMB , и, таким образом, к ней эффективно обращаются как к верхней памяти , а не через EMS .
  2. ^ Есть два исключения из требования к заглушке для загрузки драйвера в HMA : заглушка не требуется, если верхняя память постоянно включена на машинах безлогики логики A20 , однако, поскольку это условие в целом не выполняется, общий DOS водители не могут воспользоваться этим преимуществом (если только они не проверит это условие заранее). В противном случае заглушка также не требуется в DR DOS 6.0 и выше, когда резидентные системные расширения (такие как SHARE и NLSFUNC ) перехватывают только мультиплексное прерывание INT 2Fh, потому что они могут затем использовать бэкдор-интерфейс для подключения к цепочке прерываний в пространстве ядра.чтобы обработчик A20 шлюза ядра обеспечивал функциональность заглушки. Тем не менее, драйвер должен выполнить самоперемещение, чтобы правильно работать в HMA.

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

  1. ^ Dhamdhere, Дананай М. (1999). Системное программирование и операционные системы . Нью-Дели: образование Таты МакГроу-Хилл . п. 232. ISBN. 0-07-463579-4. Архивировано 01 февраля 2020 года . Проверено 8 ноября 2011 . (658 стр.)
  2. ^ Dhamdhere, Дананай М. (2006). Операционные системы: концептуальный подход . Нью-Дели: образование Таты МакГроу-Хилл . п. 231. ISBN. 0-07-061194-7. Архивировано 20 февраля 2020 года . Проверено 20 февраля 2020 . (799 страниц)
  3. ^ Пол, Маттиас R .; Фринке, Аксель К. (1997-10-13) [1991], FreeKEYB - Расширенная клавиатура и драйвер консоли DOS (Руководство пользователя) (изд. 6.5) [1] (NB. FreeKEYB - это динамически настраиваемый драйвер на основе Unicode, поддерживающий большинство раскладок клавиатуры , кодовых страниц и кодов стран . Использование стандартного макроса ассемблера, а также фреймворк для автоматического анализа до и после обработки инструменты для создания метаданных зависимостей и преобразования кода, которые должны быть встроены в исполняемый файл вместе с двоичным кодом и самоуничтожающимся, расслабляющим и перемещаемым загрузчиком , драйвер поддерживает различные загрузки и установку как TSR или драйвер устройстваи реализует передовые технологии самостоятельного переселения ( в том числе в нормальную память DOS , UMBs , неиспользованную видеопамять , или сырую память , также используя префикс сегмента программы перегрузки и среда сегмент рекомбинация) и на уровень байт Гранулированного устранение код динамических мертвом на время загрузки , а также как самомодифицирующийся код и возможность реконфигурирования во время выполнения для минимизации занимаемой им памяти в зависимости от оборудования, операционной системы и конфигурации драйвера, а также от выбранного набора функций и локали.)
  4. ^ a b Пол, Маттиас Р .; Фринке, Аксель К. (16 января 2006 г. ), FreeKEYB - Расширенный международный драйвер клавиатуры и консоли DOS (Руководство пользователя) (7 (предварительное) изд.)
  5. ^ «Глава 10 Управление памятью» . Caldera DR-DOS 7.02 Руководство пользователя . Caldera, Inc. 1998 [1993, 1997]. Архивировано из оригинала на 2017-08-30 . Проверено 30 августа 2017 .
  6. ^ a b c Пол, Матиас Р. (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. Самостоятельная загрузка драйвера устройства немного сложнее, так как вам нужно оставить заголовок драйвера на месте и переместить только оставшуюся часть драйвера […]
  7. ^ a b c Пол, Матиас Р. (2002-02-02). "Treiber Dynamisch nachladen" [Динамическая загрузка драйверов] (на немецком языке). Группа новостейde.comp.os.msdos . Архивировано 9 сентября 2017 года . Проверено 2 июля 2017 .(NB. Дается обзор методов с высокой нагрузкой в ​​DOS, включая использование команд LOADHIGH и т. Д. И методы самоперемещения в UMB с использованием XMSUMB API. Также обсуждаются более сложные методы, необходимые для TSR для перемещения в HMA с использованием intra -сегмент смещения смещения .)
  8. ^ Boothe Management Systems (1972-11-01). «Пропускная способность - получаете ли вы все, чего заслуживаете? - ДОСРЕЛО» . Computerworld - еженедельник для компьютерного сообщества (реклама). VI (44). Сан-Франциско, Калифорния, США: Computerworld, Inc. стр. 9. Архивировано 06.02.2020 . Проверено 7 февраля 2020 . […] DOSRELO предоставляет метод самоперемещения проблемных программ DOS . DOSRELO обеспечивает возможность самоперемещения всех программ, независимо от языка, путем добавления логики точки входа в объектный код программы перед редактором связей.каталогизирует его в основной библиотеке изображений . […]
  9. ^ Дьюдни, Александр Киватин (март 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  [ pl ] , чтобы максимизировать TPA для запуска программ. Он также используется динамически CP / M отладчик Dynamic Debugging Tool (DDT) , чтобы переместить себя в более высокой памяти. Такой же подход был самостоятельно разработан Брюс Ван Натта из IMS Associates производить перемещаемый PL / M - код. в пункте пограничного перемещения другого вариант этого метода позже был использован динамическиHMA самостоятельно перемещения TSRs как KEYB , АКЦИЯ и 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 / Ми 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 .