В компьютерном программировании самоперемещающаяся программа — это программа, которая при запуске перемещает свои собственные зависящие от адреса инструкции и данные и, следовательно, может быть загружена в память по любому адресу. [1] [2] Во многих случаях самоперемещающийся код также является формой самомодифицирующегося кода .
Самостоятельное перемещение аналогично процессу перемещения , используемому компоновщиком - загрузчиком при копировании программы из внешнего хранилища в основную память; разница в том, что перемещение выполняет сама загруженная программа, а не загрузчик операционной системы или оболочки .
Одна из форм самоперемещения происходит, когда программа копирует код своих инструкций из одной последовательности ячеек в другую последовательность ячеек в основной памяти одного компьютера, а затем передает управление процессору от инструкций, найденных в исходных ячейках памяти. инструкциям, найденным в местах назначения памяти. Таким образом, данные, с которыми работает алгоритм программы, представляют собой последовательность байтов, определяющих программу.
Статическое самоперемещение обычно происходит во время загрузки (после того, как операционная система загрузила программное обеспечение и передала ему управление, но еще до завершения его инициализации), иногда также при изменении конфигурации программы на более позднем этапе во время выполнения . [3] [4]
Например, самоперемещение часто используется на ранних стадиях начальной загрузки операционных систем в таких архитектурах, как IBM PC-совместимые , где загрузчики цепочки нижнего уровня (такие как главная загрузочная запись (MBR), загрузочная запись тома (VBR) и начальная загрузочная запись) этапы загрузки операционных систем, таких как DOS ), смещаются с места, чтобы загрузить следующий этап в память.
В CP/M инструмент динамической отладки отладчика (DDT) динамически перемещался в верхнюю часть доступной памяти путем перемещения границ страницы , чтобы максимизировать временную программную область (TPA) для запуска программ. [5] [6]
В 1988 году альтернативный процессор командной строки ZCPR 3.4 для Z-System представил так называемые программы типа 4 , которые также можно было самостоятельно перемещать через встроенную заглушку. [7] [8] [9] [10] [11]
В DOS самоперемещение иногда также используется более продвинутыми драйверами и резидентными системными расширениями (RSX) или резидентными программами завершения и пребывания (TSR), которые загружают себя «высоко» в верхнюю память более эффективно, чем это возможно для внешних «высоких» модулей. "-загрузчики (такие как LOADHIGH / HILOAD , INSTALLHIGH / HIINSTALL или DEVICEHIGH / HIDEVICE и т. д. [12] начиная с DOS 5) для того, чтобы максимально увеличить объем памяти, доступной для приложений. Это связано с тем, что операционная система не знает внутренней работы загружаемого драйвера и поэтому должна загружать его в свободную область памяти, достаточно большую, чтобы хранить весь драйвер в виде блока, включая его код инициализации, даже если бы он был освобожден после инициализации. Для TSR операционная система также должна выделить префикс программного сегмента (PSP) и сегмент среды . [13] Это может привести к тому, что драйвер не будет загружен в наиболее подходящую свободную область памяти или даже вообще не позволит ему загрузиться на высоком уровне. В отличие от этого, самоперемещающийся драйвер можно загрузить куда угодно (в том числе в обычную память ), а затем переместить только его (обычно гораздо меньшую) резидентную часть в подходящую свободную область памяти в верхней памяти. Кроме того, расширенные самоперемещающиеся TSR (даже если они уже загружены в верхнюю память операционной системой) могут перемещаться по большей части своего собственного сегмента PSP и буфера командной строки и освобождать свой сегмент среды, чтобы еще больше уменьшить занимаемый в результате объем памяти и избежать фрагментация . [14] Некоторые самоперемещающиеся TSR также могут динамически менять свою «природу» и превращаться в драйверы устройств, даже если они изначально загружены как TSR, тем самым обычно также освобождая некоторую память. [4] Наконец, внешнему загрузчику технически невозможно переместить драйверы в расширенную память (EMS), область верхней памяти (HMA) или расширенную память (через DPMS или CLOAKING ), поскольку эти методы требуют небольших заглушек , специфичных для драйвера, для оставаться в обычной или верхней памяти, чтобы координировать доступ к целевой области перемещения, [15] [nb 1] [nb 2] , а в случае драйверов устройств также потому, что заголовок драйвера всегда должен оставаться в первом мегабайте. [15] [13]Чтобы добиться этого, драйверы должны быть специально разработаны для поддержки самостоятельного перемещения в эти области. [15]
Некоторые расширенные драйверы DOS также содержат как драйвер устройства (который загружается операционной системой по смещению +0000h), так и TSR (загружается по смещению +0100h), разделяющие общую часть кода внутри в виде толстого двоичного файла . [13] Если общий код не спроектирован так, чтобы быть независимым от позиции , он требует некоторой формы исправления внутреннего адреса, аналогичной тому, что в противном случае уже было бы выполнено перемещающимся загрузчиком ; это похоже на этап исправления самостоятельного перемещения, но код уже загружается в целевое место загрузчиком операционной системы (а не самим драйвером).
IBM DOS/360 не имела возможности перемещать программы во время загрузки. Иногда поддерживалось несколько версий программы, каждая из которых была создана для разных адресов загрузки ( разделов ). Особый класс программ, называемый самоперемещающимися программами, был запрограммирован так, чтобы перемещаться после загрузки. [16] IBM OS/360 перемещала исполняемые программы при их загрузке в память. Требовалась только одна копия программы, но после загрузки программу нельзя было переместить (так называемый одноразовый позиционно-независимый код ).
В качестве крайнего примера (многократного) самоперемещения, также называемого динамическим самоперемещением, можно создать компьютерную программу так, чтобы она не оставалась по фиксированному адресу в памяти даже во время выполнения, как, например, используется в тестах памяти червей . [17] [18] [19] [20] Apple Worm также является динамическим самоперемещающимся устройством. [21]
[…] Законы: […] «
динамическое перемещение
» ОС. Можете ли вы рассказать нам, что это такое и почему это важно? […]
Юбэнкс
: […] то, что сделал
Гэри
[…] было […] ошеломляющим. […] Я помню тот день, когда в
школе
он прибежал в лабораторию и сказал: «Я придумал, как
переехать»
. Он воспользовался тем фактом, что единственным байтом всегда был
байт старшего порядка
. И поэтому он создал
растровое изображение
. […] не имело значения, сколько памяти было у компьютера, операционную систему всегда можно было переместить в верхнюю память. Следовательно, вы можете коммерциализировать это […] на машинах с разным объемом памяти. […] нельзя продавать 64K
CP/M
и 47K CP/M. Было бы просто смешно проводить жесткую компиляцию адресов. Итак, Гэри понял это однажды ночью, вероятно, посреди ночи, думая о чем-то кодировании, и это действительно сделало CP/M возможным коммерциализировать. Я действительно думаю, что без этого переезда это была бы очень сложная проблема. Им показалось бы сложным заставить людей покупать его, и если бы вы добавили больше памяти, вам пришлось бы покупать другую операционную систему. […]
Intel
[…] поменяла
местами байты
, верно, для адресов памяти. Но они всегда находились в одном и том же месте, поэтому можно было переместить его на
границу в 256 байт
, если быть точным. Таким образом, вы всегда можете переместить его, используя лишь растровое изображение того, где эти […] Законы: Конечно, это самое красноречивое объяснение динамического перемещения, которое я когда-либо получал […][5][6] (33 страницы)
[…] Добавьте в драйвер заголовок драйвера устройства 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. Самостоятельная загрузка драйвера устройства немного сложнее, так как вам придется оставить заголовок драйвера там, где он есть, и переместить только оставшуюся часть драйвера […]
[…] По крайней мере,
MS-DOS 6.0
+
GRAFTABL
перемещается по частям своего сегмента
PSP
(смещение +60h и выше), чтобы минимизировать свой резидентный размер. […](Обратите внимание: версия GRAFTABL 2.00+, выпущенная после DR-DOS 7.03, также поддерживает динамическое самостоятельное перемещение.)
[…] DOSRELO предоставляет метод
самостоятельного перемещения проблемных программ
DOS
. DOSRELO обеспечивает возможность самостоятельного перемещения для всех программ, независимо от языка, путем добавления логики точки входа в
объектный код
программы до того, как
редактор связей
каталогизирует ее в
базовой библиотеке изображений
. […]
[…] Помимо получения инструкции,
Z80
использует половину цикла для
обновления
динамического
ОЗУ
. […] поскольку Z80 должен тратить половину каждого цикла
выборки инструкций
на выполнение других задач, у него не так много времени для выборки
байта инструкции
, как для байта данных. Если одна из
микросхем ОЗУ
в той области памяти, к которой осуществляется доступ, работает немного медленно, Z80 может получить неверную битовую комбинацию при получении инструкции, но получить правильную при чтении данных. […] встроенный тест памяти не выявляет проблемы такого типа […] это строго тест чтения/записи данных. Во время теста все инструкции извлекаются из
ПЗУ
, а не из ОЗУ […], в результате чего
H89
проходит тест памяти, но все еще работает хаотично в некоторых программах. […] Это программа, которая проверяет память, перемещаясь по ОЗУ. При этом ЦП печатает текущий адрес программы на
ЭЛТ
, а затем извлекает инструкцию по этому адресу. Если микросхемы ОЗУ по этому адресу в порядке, ЦП перемещает тестовую программу в следующую ячейку памяти, печатает новый адрес и повторяет процедуру. Но если одна из микросхем ОЗУ достаточно медленная, чтобы возвращать неверную битовую комбинацию, ЦП неправильно интерпретирует инструкцию и ведет себя непредсказуемо. Однако вполне вероятно, что дисплей заблокируется, показывая адрес неисправной микросхемы. Это сужает проблему до восьми микросхем, что является улучшением по сравнению с необходимостью проверять целых 32. […] Программа […] выполнит проверку на наличие
червей
, отправив инструкцию RST 7 (RESTART 7) из нижнего конца памяти. до последнего рабочего адреса. Остальная часть программы остается неподвижной и занимается отображением текущего местоположения команды RST 7 и ее
перемещением
. Кстати, программа называется тестом на червяков, потому что по мере продвижения инструкции RST 7 по памяти она оставляет после себя
скользкий след
NOP
(
НЕТ ОПЕРАЦИИ). […]