stringtranslate.com

Самостоятельный переезд

В компьютерном программировании самоперемещающаяся программа — это программа, которая при запуске перемещает свои собственные зависящие от адреса инструкции и данные и, следовательно, может быть загружена в память по любому адресу. [1] [2] Во многих случаях самоперемещающийся код также является формой самомодифицирующегося кода .

Обзор

Самостоятельное перемещение аналогично процессу перемещения , используемому компоновщиком - загрузчиком при копировании программы из внешнего хранилища в основную память; разница в том, что перемещение выполняет сама загруженная программа, а не загрузчик операционной системы или оболочки .

Одна из форм самоперемещения происходит, когда программа копирует код своих инструкций из одной последовательности ячеек в другую последовательность ячеек в основной памяти одного компьютера, а затем передает управление процессору от инструкций, найденных в исходных ячейках памяти. инструкциям, найденным в местах назначения памяти. Таким образом, данные, с которыми работает алгоритм программы, представляют собой последовательность байтов, определяющих программу.

Статическое самоперемещение обычно происходит во время загрузки (после того, как операционная система загрузила программное обеспечение и передала ему управление, но еще до завершения его инициализации), иногда также при изменении конфигурации программы на более позднем этапе во время выполнения . [3] [4]

Примеры

Загрузчики

Например, самоперемещение часто используется на ранних стадиях начальной загрузки операционных систем в таких архитектурах, как IBM PC-совместимые , где загрузчики цепочки нижнего уровня (такие как главная загрузочная запись (MBR), загрузочная запись тома (VBR) и начальная загрузочная запись) этапы загрузки операционных систем, таких как DOS ), смещаются с места, чтобы загрузить следующий этап в память.

Расширения CP/M

В CP/M инструмент динамической отладки отладчика (DDT) динамически перемещался в верхнюю часть доступной памяти путем перемещения границ страницы , чтобы максимизировать временную программную область (TPA) для запуска программ. [5] [6]

В 1988 году альтернативный процессор командной строки ZCPR 3.4 для Z-System представил так называемые программы типа 4 , которые также можно было самостоятельно перемещать через встроенную заглушку. [7] [8] [9] [10] [11]

Драйверы для x86 DOS

В 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 и OS/360

IBM DOS/360 не имела возможности перемещать программы во время загрузки. Иногда поддерживалось несколько версий программы, каждая из которых была создана для разных адресов загрузки ( разделов ). Особый класс программ, называемый самоперемещающимися программами, был запрограммирован так, чтобы перемещаться после загрузки. [16] IBM OS/360 перемещала исполняемые программы при их загрузке в память. Требовалась только одна копия программы, но после загрузки программу нельзя было переместить (так называемый одноразовый позиционно-независимый код ).

Другие примеры

В качестве крайнего примера (многократного) самоперемещения, также называемого динамическим самоперемещением, можно создать компьютерную программу так, чтобы она не оставалась по фиксированному адресу в памяти даже во время выполнения, как, например, используется в тестах памяти червей . [17] [18] [19] [20] Apple Worm также является динамическим самоперемещающимся устройством. [21]

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

Примечания

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

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

  1. ^ Дхамдере, Дхананджай М. (1999). Системное программирование и операционные системы. Образование. Нью-Дели, Индия: Тата МакГроу-Хилл . п. 232. ИСБН 0-07-463579-4. ISBN 978-0-07-463579-7 . Архивировано из оригинала 01 февраля 2020 г. Проверено 8 ноября 2011 г. (658 страниц)
  2. ^ Дхамдере, Дхананджай М. (2006). Операционные системы: концептуальный подход. Образование. Нью-Дели, Индия: Тата МакГроу-Хилл . п. 231. ИСБН 0-07-061194-7. ISBN 978-0-07-061194-8 . Архивировано из оригинала 20 февраля 2020 г. Проверено 20 февраля 2020 г. (799 страниц)
  3. ^ Пол, Матиас Р.; Фринк, Аксель К. (13 октября 1997 г.) [1991], FreeKEYB - Расширенная клавиатура и драйвер консоли для DOS (Руководство пользователя) (изд. 6.5)[1] (Примечание. FreeKEYB — это динамически настраиваемый драйвер на основе Unicode , поддерживающий большинство раскладок клавиатуры , кодовых страниц и кодов стран . Использует готовый ассемблер макросов , а также структуру автоматического анализа предварительной и последующей обработки. инструменты для генерации зависимостей и метаданных морфинга кода , которые должны быть встроены в исполняемый файл вместе с двоичным кодом , а также самоудаляющийся, расслабляющий и перемещающийся загрузчик . Драйвер поддерживает различную загрузку и установку как TSR или драйвер устройства , а также реализует расширенные возможности методы самоперемещения (в том числе в обычную память DOS , UMB , неиспользуемую видеопамять или необработанную память, также использующие перегрузку префикса программного сегмента и рекомбинацию сегментов среды ) и гранулярное динамическое устранение мертвого кода на уровне байтов во время загрузки , а также самомодификацию. код и возможность реконфигурации во время выполнения , чтобы минимизировать использование памяти в зависимости от оборудования, операционной системы и конфигурации драйверов, а также выбранного набора функций и языкового стандарта.)
  4. ^ аб Пол, Матиас Р.; Фринке, Аксель К. (16 января 2006 г.), FreeKEYB - Расширенный международный драйвер клавиатуры и консоли для DOS (Руководство пользователя) (7 (предварительное) изд.)
  5. ^ Килдалл, Гэри Арлен (февраль 1978 г.) [1976]. «Простой метод статического перемещения абсолютного машинного кода». Журнал доктора Добба по компьютерной гимнастике и ортодонтии . Народная компьютерная компания . 3 (2): 10–13 (66–69). ISBN 0-8104-5490-4. #22 ковчег:/13960/t8hf1g21p . Проверено 19 августа 2017 г.[2][3][4]. Первоначально представлено: Килдалл, Гэри Арлен (1977) [22–24 ноября 1976 г.]. «Простой метод статического перемещения абсолютного машинного кода». Написано в Военно-морской аспирантуре , Монтерей, Калифорния, США. В Титусе, Гарольд А. (ред.). Протокол конференции: Десятая ежегодная конференция Asilomar по схемам, системам и компьютерам: доклады представлены 22–24 ноября 1976 г. Отель Asilomar и конференц-зал, Пасифик-Гроув, Калифорния, США: Western Periodicals Company. стр. 420–424. ISSN  1058-6393 . Проверено 6 декабря 2021 г.(609 страниц). (Этот метод «изменения размера», называемый перемещением границ страницы , можно было применить статически к образу диска CP/M-80 с помощью MOVCPM  [pl] для максимизации TPA для запуска программ. Он также использовался динамически CP/ Инструмент динамической отладки отладчика M (DDT) для перемещения в верхнюю память. Тот же подход был независимо разработан Брюсом Х. Ван Наттой из IMS Associates для создания перемещаемого кода PL/M . В качестве перемещения границ абзаца позже был использован другой вариант этого метода. путем динамического самоперемещения HMA TSR, таких как KEYB , SHARE и NLSFUNC , в DR DOS 6.0 и выше. Гораздо более сложный метод гранулированного перемещения смещения на уровне байтов, основанный на несколько похожем подходе, был независимо задуман и реализован Маттиасом Р. Полом и Акселю К. Фринке за динамическое устранение мертвого кода для динамического минимизации нагрузки на время выполнения резидентных драйверов и TSR (таких как FreeKEYB).)
  6. ^ Хьюитт, Роберт; Юбэнкс, Гордон ; Роландер, Томас «Том» Алан ; Лоус, Дэвид; Мишель, Ховард Э.; Халла, Брайан; Уортон, Джон Харрисон ; Берг, Брайан; Су, Вейлянь; Килдалл, Скотт ; Кампе, Билл (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 страницы)
  7. ^ Сейдж, Джей (май – июнь 1988 г.). Карлсон, Арт (ред.). «ZCPR 3.4 — Программы типа 4». Компьютерный журнал (TCJ) — Программирование, поддержка пользователей, приложения . ЗЦПР3 Уголок. Колумбия-Фолс, Монтана, США (32): 10–17. ISSN  0748-9331. ковчег:/13960/t1wd4v943 . Проверено 29 ноября 2021 г.[7][8]
  8. ^ Митчелл, Бриджер (июль – август 1988 г.). Карлсон, Арт (ред.). «Z3PLUS и перемещение — информация о ZCPR3PLUS и о том, как написать самоперемещающийся код Z80». Компьютерный журнал (TCJ) — Программирование, поддержка пользователей, приложения . Продвинутый CP/M. Колумбия-Фолс, Монтана, США (33): 9–15. ISSN  0748-9331. ковчег:/13960/t36121780 . Проверено 9 февраля 2020 г.[9][10]
  9. ^ Сейдж, Джей (сентябрь – октябрь 1988 г.). Карлсон, Арт (ред.). «Подробнее о перемещаемом коде, файлах PRL, ZCPR34 и программах типа 4». Компьютерный журнал (TCJ) — Программирование, поддержка пользователей, приложения . ЗЦПР3 Уголок. Колумбия-Фолс, Монтана, США (34): 20–25. ISSN  0748-9331. ковчег:/13960/t0ks7pc39 . Проверено 9 февраля 2020 г.[11][12][13]
  10. ^ Сейдж, Джей (январь – февраль 1992 г.). Карлсон, Арт; МакИвен, Крис (ред.). «Десять лет ЗКПР». Компьютерный журнал (TCJ) — Программирование, поддержка пользователей, приложения . Уголок Z-системы. С. Плейнфилд, Нью-Джерси, США: Socrates Press (54): 3–7. ISSN  0748-9331. ковчег:/13960/t89g6n689 . Проверено 29 ноября 2021 г.[14][15][16]
  11. ^ Сейдж, Джей (май – июнь 1992 г.) [март – июнь 1992 г.]. Карлсон, Арт; МакИвен, Крис (ред.). «Программы типа 3 и типа 4». Компьютерный журнал (TCJ) — Программирование, поддержка пользователей, приложения . Уголок Z-System - Некоторые новые применения программ типа 4. С. Плейнфилд, Нью-Джерси, США: Socrates Press (55): 13–19. ISSN  0748-9331. ковчег:/13960/t4dn54d22 . Проверено 29 ноября 2021 г.[17][18]
  12. ^ «Глава 10 Управление памятью». Руководство пользователя Caldera DR-DOS 7.02 . Caldera, Inc., 1998 г. [1993, 1997]. Архивировано из оригинала 30 августа 2017 г. Проверено 30 августа 2017 г.
  13. ^ abc Пол, Матиас Р. (6 апреля 2002 г.). «Re: [fd-dev] АНОНС: CuteMouse 2.0 альфа 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. Самостоятельная загрузка драйвера устройства немного сложнее, так как вам придется оставить заголовок драйвера там, где он есть, и переместить только оставшуюся часть драйвера […]
  14. ^ Пол, Матиас Р. (18 августа 2001 г.). «Re: [fd-dev] О GRAFTABL и DISPLAY.SYS (было: Изменение кодовых страниц в FreeDOS)». freedos-dev . Архивировано из оригинала 4 сентября 2017 г. Проверено 4 сентября 2017 г. […] По крайней мере, MS-DOS 6.0 + GRAFTABL перемещается по частям своего сегмента PSP (смещение +60h и выше), чтобы минимизировать свой резидентный размер. […](Обратите внимание: версия GRAFTABL 2.00+, выпущенная после DR-DOS 7.03, также поддерживает динамическое самостоятельное перемещение.)
  15. ^ абв Пол, Матиас Р. (2 февраля 2002 г.). «Treiber dynamisch nachladen» [Динамическая загрузка драйверов] (на немецком языке). Группа новостей : de.comp.os.msdos. Архивировано из оригинала 9 сентября 2017 г. Проверено 2 июля 2017 г.(Примечание. Дается обзор методов высокой нагрузки в DOS, включая использование команд LOADHIGH и т. д., а также методов самостоятельного перемещения в UMB с использованием API XMSUMB . Также обсуждаются более сложные методы, необходимые TSR для перемещения в HMA с использованием внутреннего -перемещение смещения сегмента .)
  16. ^ Системы управления Boothe (1972-11-01). «Пропускная способность. Получаете ли вы все, что заслуживаете? - ДОСРЕЛО». Computerworld — еженедельник новостей для компьютерного сообщества (реклама). Том. ВИ, нет. 44. Сан-Франциско, Калифорния, США: Computerworld, Inc. с. 9. Архивировано из оригинала 06 февраля 2020 г. Проверено 7 февраля 2020 г. […] DOSRELO предоставляет метод самостоятельного перемещения проблемных программ DOS . DOSRELO обеспечивает возможность самостоятельного перемещения для всех программ, независимо от языка, путем добавления логики точки входа в объектный код программы до того, как редактор связей каталогизирует ее в базовой библиотеке изображений . […]
  17. ^ Тест памяти червя (PDF) . Векторная графика . 21 октября 2015 г. Архивировано (PDF) из оригинала 15 мая 2019 г. Проверено 13 декабря 2021 г.(3 страницы) (Примечание. Из руководства по эксплуатации Vector Graphic 3. )
  18. ^ Уилкинсон, Уильям «Билл» Альберт (2003) [1996, 1984]. «Червь H89: тестирование памяти H89». Страница компании Билла Уилкинсона Heath . Архивировано из оригинала 13 декабря 2021 г. Проверено 13 декабря 2021 г. […] Помимо получения инструкции, Z80 использует половину цикла для обновления динамического ОЗУ . […] поскольку Z80 должен тратить половину каждого цикла выборки инструкций на выполнение других задач, у него не так много времени для выборки байта инструкции , как для байта данных. Если одна из микросхем ОЗУ в той области памяти, к которой осуществляется доступ, работает немного медленно, Z80 может получить неверную битовую комбинацию при получении инструкции, но получить правильную при чтении данных. […] встроенный тест памяти не выявляет проблемы такого типа […] это строго тест чтения/записи данных. Во время теста все инструкции извлекаются из ПЗУ , а не из ОЗУ […], в результате чего H89 проходит тест памяти, но все еще работает хаотично в некоторых программах. […] Это программа, которая проверяет память, перемещаясь по ОЗУ. При этом ЦП печатает текущий адрес программы на ЭЛТ , а затем извлекает инструкцию по этому адресу. Если микросхемы ОЗУ по этому адресу в порядке, ЦП перемещает тестовую программу в следующую ячейку памяти, печатает новый адрес и повторяет процедуру. Но если одна из микросхем ОЗУ достаточно медленная, чтобы возвращать неверную битовую комбинацию, ЦП неправильно интерпретирует инструкцию и ведет себя непредсказуемо. Однако вполне вероятно, что дисплей заблокируется, показывая адрес неисправной микросхемы. Это сужает проблему до восьми микросхем, что является улучшением по сравнению с необходимостью проверять целых 32. […] Программа […] выполнит проверку на наличие червей , отправив инструкцию RST 7 (RESTART 7) из нижнего конца памяти. до последнего рабочего адреса. Остальная часть программы остается неподвижной и занимается отображением текущего местоположения команды RST 7 и ее перемещением . Кстати, программа называется тестом на червяков, потому что по мере продвижения инструкции RST 7 по памяти она оставляет после себя скользкий след NOP ( НЕТ ОПЕРАЦИИ). […]
  19. ^ Штайнман, Ян В. (1 сентября 1986 г.). Написано в Вест-Линне, штат Орегон, США. «Тест памяти червя». Право на собрания (TRTA). Журнал доктора Добба о программных инструментах для профессионального программиста . Редвуд-Сити, Калифорния, США: M&T Publishing, Inc./The People 's Computer Company . 11 (9): 114–115 (662–663). ISSN  1044-789X. № 119. ковчег:/13960/t74v34p9p КОДЕН  DDJOEB . Проверено 13 декабря 2021 г.[19] (2 страницы)
  20. ^ Штайнман, Ян В. (1986). «III. 68000 полезных процедур и методов, 16. Тест на память червя» (PDF) . Написано в Вест-Линне, штат Орегон, США. Справочник доктора Добба по программированию 68000 . Нью-Йорк, США: Brady Book / Prentice Hall Press / Simon & Schuster, Inc., стр. 341–350. ISBN 0-13-216649-6. LCCN  86-25308. Архивировано (PDF) из оригинала 13 декабря 2021 г. Проверено 13 декабря 2021 г.(1+5+10+1 стр.)
  21. ^ Дьюдни, Александр Киватин (март 1985 г.). «Компьютерные развлечения - бестиарий вирусов, червей и других угроз компьютерной памяти». Научный американец . 285 : 38–39. Архивировано из оригинала 4 июля 2017 г. Проверено 4 июля 2017 г.

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