Самостоятельное перемещение - 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] это динамический самоперемещающийся.

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

Примечания

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

Рекомендации

  1. ^ Дхамдхере, Дхананджай М. (1999). Системное программирование и операционные системы. Нью-Дели: Тата МакГроу-Хилл Образование. п. 232. ISBN  0-07-463579-4. ISBN  978-0-07-463579-7. В архиве с оригинала на 2020-02-01. Получено 2011-11-08. (658 стр.)
  2. ^ Дхамдхере, Дхананджай М. (2006). Операционные системы: концептуальный подход. Нью-Дели: Тата МакГроу-Хилл Образование. п. 231. ISBN  0-07-061194-7. ISBN  978-0-07-061194-8. В архиве с оригинала на 2020-02-20. Получено 2020-02-20. (799 страниц)
  3. ^ Пол, Маттиас Р .; Фринке, Аксель К. (1997-10-13) [1991], FreeKEYB - усовершенствованный драйвер клавиатуры и консоли DOS (Руководство пользователя) (6.5 изд.) [1] (NB. FreeKEYB - это Unicode -на основе динамически настраиваемого драйвера, поддерживающего большинство раскладки клавиатуры, кодовые страницы, и коды стран. Использование готового макроассемблер а также набор инструментов автоматического анализа до и после обработки для создания зависимостей и преобразование кода метаданные быть встроенным в запускаемый файл рядом с бинарный код и самоотбрасывание, расслабляющий и перемещение погрузчика, драйвер поддерживает загрузку по-разному и установку как TSR или же драйвер устройства и он реализует передовые методы самоперемещения (в том числе в обычные Память DOS, UMB, неиспользованный видеопамять, или необработанная память, также использующая префикс сегмента программы перегрузка и сегмент окружающей среды рекомбинация) и на уровне байтов динамическое устранение мертвого кода в время загрузки а также самомодифицирующийся код и реконфигурируемость на время выполнения чтобы свести к минимуму объем используемой памяти в зависимости от оборудования, операционной системы и конфигурации драйверов, а также от выбранного набора функций и локали.)
  4. ^ а б Пол, Маттиас Р .; Фринке, Аксель К. (16 января 2006 г.), FreeKEYB - расширенный международный драйвер клавиатуры и консоли DOS (Руководство пользователя) (7 (предварительное) изд.)
  5. ^ «Глава 10 Управление памятью». Caldera DR-DOS 7.02 Руководство пользователя. Caldera, Inc. 1998 [1993, 1997]. Архивировано из оригинал на 2017-08-30. Получено 2017-08-30.
  6. ^ а б 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. Самостоятельная загрузка драйвера устройства немного сложнее, поскольку вы должны оставить заголовок драйвера на месте и переместить только оставшуюся часть драйвера […]
  7. ^ а б c Пол, Матиас Р. (2002-02-02). "Treiber Dynamisch nachladen" [Загрузка драйверов динамически] (на немецком языке). Группа новостейde.comp.os.msdos. В архиве из оригинала на 09.09.2017. Получено 2017-07-02. (NB. Дается обзор методов с высокой загрузкой в ​​DOS, включая использование НАГРУЗКА ВЫСОКАЯ другие команды и методы самоперемещения в UMB используя XMSUMB API. Также обсуждается более сложные методы необходимо для TSR, чтобы переехать в HMA использование перемещение смещения внутри сегмента.)
  8. ^ Системы управления Бутом (1972-11-01). «Пропускная способность - получаете ли вы все, чего заслуживаете? - ДОСРЕЛО». Computerworld - Newsweekly для компьютерного сообщества (рекламное объявление). VI (44). Сан-Франциско, Калифорния, США: Computerworld, Inc. п. 9. В архиве из оригинала от 06.02.2020. Получено 2020-02-07. […] DOSRELO предлагает метод изготовления ДОС Самостоятельное перемещение проблемных программ. DOSRELO обеспечивает возможность самоперемещения всех программ, независимо от языка, путем добавления логики точки входа в объектный код программы до Редактор связей каталогизирует это на Базовая библиотека изображений. […]
  9. ^ Дьюдни, Александр Киватин (Март 1985 г.). "Computer Recreations - основной боевой бестиарий вирусов, червей и других угроз компьютерной памяти". Scientific American. 285: 38–39. В архиве из оригинала на 2017-07-04. Получено 2017-07-04.

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