stringtranslate.com

Самостоятельное переселение

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

Обзор

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

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

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

Примеры

Загрузчики

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

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

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

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

x86 драйверы DOS

В DOS самоперемещение иногда также используется более продвинутыми драйверами и резидентными системными расширениями (RSX) или программами terminate-and-stay-resident (TSR), загружающими себя "высоко" в верхнюю память более эффективно, чем это возможно для внешних "высоких"-загрузчиков (таких как LOADHIGH / HILOAD , INSTALLHIGH / HIINSTALL или DEVICEHIGH / HIDEVICE и т. д. [12] начиная с DOS 5), чтобы максимизировать память, доступную для приложений. Это связано с тем, что операционная система не имеет знаний о внутренней работе драйвера, который нужно загрузить, и поэтому должна загрузить его в свободную область памяти, достаточно большую, чтобы вместить весь драйвер как блок, включая его код инициализации, даже если он будет освобожден после инициализации. Для TSR операционная система также должна выделить префикс сегмента программы (PSP) и сегмент окружения . [13] Это может привести к тому, что драйвер не будет загружен в наиболее подходящую свободную область памяти или даже вообще не позволит ему загрузиться высоко. В отличие от этого, самоперемещающийся драйвер может быть загружен в любое место (включая обычную память ), а затем переместить только его (обычно гораздо меньшую) резидентную часть в подходящую свободную область памяти в верхней памяти. Кроме того, усовершенствованные самоперемещающиеся TSR (даже если они уже загружены в верхнюю память операционной системой) могут перемещаться по большей части своего собственного сегмента PSP и буфера командной строки и освобождать свой сегмент среды, чтобы еще больше уменьшить результирующий след памяти и избежать фрагментации . [14] Некоторые самоперемещающиеся TSR также могут динамически изменять свою «природу» и трансформироваться в драйверы устройств, даже если изначально были загружены как TSR, тем самым обычно также освобождая некоторую память. [4] Наконец, технически невозможно, чтобы внешний загрузчик переместил драйверы в расширенную память (EMS), верхнюю область памяти (HMA) или расширенную память (через DPMS или CLOAKING ), поскольку эти методы требуют, чтобы небольшие специфичные для драйвера заглушки оставались в обычной или верхней памяти для координации доступа к целевой области перемещения, [15] [примечание 1] [примечание 2] а в случае драйверов устройств еще и потому, что заголовок драйвера всегда должен оставаться в первом мегабайте. [15] [13]Чтобы достичь этого, драйверы должны быть специально спроектированы для поддержки самостоятельного перемещения в эти районы. [15]

Некоторые расширенные драйверы DOS также содержат как драйвер устройства (который будет загружен по смещению +0000h операционной системой), так и TSR (загружаемый по смещению +0100h), разделяющие общую часть кода внутри как fat binary . [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 : заглушка не нужна, когда верхняя память постоянно включена на машинах без логики gate A20 , однако, поскольку это условие не выполняется в общем случае, общие драйверы DOS не могут воспользоваться им (если только они явно не проверят это условие заранее). В противном случае заглушка также не нужна в DR DOS 6.0 и выше, когда резидентные системные расширения (такие как SHARE и NLSFUNC ) перехватывают только мультиплексное прерывание INT 2Fh, потому что затем они могут использовать интерфейс бэкдора для перехвата в цепочке прерываний в пространстве ядра , так что обработчик gate A20 ядра предоставит функциональность заглушки. [a] Тем не менее, драйвер должен выполнить самоперемещение, чтобы правильно функционировать в HMA.

Ссылки

  1. ^ Дхамдере, Дхананджай М. (1999). Системное программирование и операционные системы. Образование. Нью-Дели, Индия: Тата МакГроу-Хилл . п. 232. ИСБН 0-07-463579-4. ISBN 978-0-07-463579-7 . Архивировано из оригинала 2020-02-01 . Получено 2011-11-08(658 страниц)
  2. ^ Дхамдере, Дхананджай М. (2006). Операционные системы: концептуальный подход. Образование. Нью-Дели, Индия: Тата МакГроу-Хилл . п. 231. ИСБН 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] (Примечание. FreeKEYB — это динамически настраиваемый драйвер на основе Unicode , поддерживающий большинство раскладок клавиатуры , кодовых страниц и кодов стран . Используя готовый макроассемблер , а также структуру инструментов анализа автоматической предварительной и последующей обработки для генерации метаданных о зависимости и морфинге кода, которые будут внедрены в исполняемый файл вместе с двоичным кодом и самоотбрасывающимся, восстанавливающим и перемещающимся загрузчиком , драйвер поддерживает различную загрузку и установку себя как TSR или драйвера устройства , а также реализует передовые методы самоперемещения (в том числе в обычную память DOS , UMB , неиспользуемую видеопамять или необработанную память, также используя перегрузку префикса сегмента программы и рекомбинацию сегмента среды ) и гранулярное динамическое устранение мертвого кода на уровне байтов во время загрузки, а также самомодифицирующийся код и перенастраиваемость во время выполнения для минимизации занимаемой памяти в зависимости от оборудования, операционной системы и конфигурации драйвера, а также выбранного набора функций и локали.)
  4. ^ ab Paul, Matthias R.; Frinke, Axel C. (2006-01-16), FreeKEYB - Advanced international DOS keyboard and console driver (Руководство пользователя) (7 (предварительное) изд.)
  5. ^ Kildall, Gary Arlen (февраль 1978) [1976]. "Простая техника статического перемещения абсолютного машинного кода". Журнал компьютерной гимнастики и ортодонтии доктора Добба . 3 (2). People's Computer Company : 10–13 (66–69). ISBN 0-8104-5490-4. #22 ark:/13960/t8hf1g21p . Получено 2017-08-19 .[2][3][4]. Первоначально представлено в: Kildall, Gary Arlen (1977) [22–24 ноября 1976 г.]. «Простая техника статического перемещения абсолютного машинного кода». Написано в Военно-морской аспирантуре , Монтерей, Калифорния, США. В Titus, Harold A. (ред.). Отчет о конференции: Десятая ежегодная Асиломарская конференция по схемам, системам и компьютерам: доклады, представленные 22–24 ноября 1976 г. Asilomar Hotel and Conference Grounds, Pacific Grove, Калифорния, США: Western Periodicals Company. стр. 420–424. ISSN  1058-6393 . Получено 06.12.2021 .(609 страниц). (Этот метод «изменения размера», названный перемещением границы страницы , можно было статически применить к образу диска CP/M-80 с помощью MOVCPM  [pl] для максимизации TPA для запуска программ. Он также использовался динамически отладчиком CP/M Dynamic Debugging Tool (DDT) для перемещения себя в более высокую память. Тот же подход был независимо разработан Брюсом Х. Ван Наттой из IMS Associates для создания перемещаемого кода PL/M . В качестве перемещения границы абзаца другой вариант этого метода позже использовался динамически самоперемещающимися резидентными программами HMA , такими как KEYB , SHARE и NLSFUNC в DR DOS 6.0 и выше. Гораздо более сложный и гранулярный на уровне байтов метод перемещения смещения, основанный на несколько похожем подходе, был независимо задуман и реализован Маттиасом Р. Полом и Акселем К. Фринк для их динамического устранения мертвого кода с целью динамической минимизации следа времени выполнения резидентных драйверов и резидентных программ (таких как FreeKEYB).)
  6. ^ Хьюитт, Роберт; Юбэнкс, Гордон ; Роландер, Томас «Том» Алан ; Лоус, Дэвид; Мишель, Говард Э.; Халла, Брайан; Уортон, Джон Харрисон ; Берг, Брайан; Су, Вейлиан; Килдалл, Скотт ; Кампе, Билл (25.04.2014). Лоус, Дэвид (ред.). «Наследие Гэри Килдалла: посвящение CP/M IEEE Milestone» (PDF) (видеотранскрипция). Пасифик-Гроув, Калифорния, США: Музей компьютерной истории . Номер ссылки CHM: X7170.2014. Архивировано (PDF) из оригинала 27.12.2014 . Получено 19.01.2020 . […] Лоус: […] « динамическое перемещение » ОС. Можете ли вы рассказать нам, что это такое и почему это было важно? […] Юбэнкс : […] то, что сделал Гэри […], было […] ошеломляющим. […] Я помню тот день в школе, когда он вбежал в лабораторию и сказал: «Я придумал, как переместить ». Он воспользовался тем фактом, что единственным байтом всегда будет байт старшего порядка . И поэтому он создал битовую карту . […] неважно, сколько памяти у компьютера, операционную систему всегда можно переместить в старшую память. Поэтому вы могли бы коммерциализировать это […] на машинах с разным объемом памяти. […] вы не могли бы продавать 64K CP/M и 47K CP/M. Было бы просто смешно иметь жесткую компиляцию в адресах. Так что Гэри понял это однажды ночью, вероятно, посреди ночи, думая о чем-то кодирующем, и это действительно сделало CP/M возможным для коммерциализации. Я действительно думаю, что без этого перемещения это была бы очень сложная проблема. Чтобы заставить людей купить его, это покажется им сложным, и если вы добавите больше памяти, вам придется пойти и получить другую операционную систему. […] Intel […] перевернула байты , верно, для адресов памяти. Но они всегда были в одном и том же месте, поэтому вы могли переместить его на границу 256 байт , если быть точным. Поэтому вы всегда могли переместить его с помощью всего лишь битовой карты того, где эти […] Законы: Безусловно, самое красноречивое объяснение, которое я когда-либо получал о динамическом перемещении […][5][6] (33 страницы)
  7. ^ Sage, Jay (май–июнь 1988 г.). Carlson, Art (ред.). "ZCPR 3.4 - Программы типа 4". The Computer Journal (TCJ) - Программирование, Поддержка пользователей, Приложения . ZCPR3 Corner (32). Columbia Falls, Montana, USA: 10–17. ISSN  0748-9331. ark:/13960/t1wd4v943 . Получено 29.11.2021 .[7][8]
  8. ^ Митчелл, Бриджер (июль–август 1988 г.). Карлсон, Арт (ред.). «Z3PLUS и перемещение — информация о ZCPR3PLUS и как писать самоперемещающийся код Z80». The Computer Journal (TCJ) — программирование, поддержка пользователей, приложения . Advanced CP/M (33). Columbia Falls, Montana, USA: 9–15. ISSN  0748-9331. ark:/13960/t36121780 . Получено 09.02.2020 .[9][10]
  9. ^ Sage, Jay (сентябрь–октябрь 1988 г.). Carlson, Art (ред.). «More on relocatable code, PRL files, ZCPR34, and Type-4 programs». The Computer Journal (TCJ) - Programming, User Support, Applications . ZCPR3 Corner (34). Columbia Falls, Montana, USA: 20–25. ISSN  0748-9331. ark:/13960/t0ks7pc39 . Получено 2020-02-09 .[11][12][13]
  10. ^ Sage, Jay (январь–февраль 1992 г.). Carlson, Art; McEwen, Chris (ред.). «Десять лет ZCPR». The Computer Journal (TCJ) — Программирование, Поддержка пользователей, Приложения . Z-System Corner (54). S. Plainfield, New Jersey, USA: Socrates Press: 3–7. ISSN  0748-9331. ark:/13960/t89g6n689 . Получено 29 ноября 2021 г.[14][15][16]
  11. ^ Sage, Jay (май–июнь 1992) [март–июнь 1992]. Carlson, Art; McEwen, Chris (ред.). "Программы Type-3 и Type-4". The Computer Journal (TCJ) - Программирование, Поддержка пользователей, Приложения . Z-System Corner - Некоторые новые приложения программ Type-4 (55). S. Plainfield, New Jersey, USA: Socrates Press: 13–19. ISSN  0748-9331. ark:/13960/t4dn54d22 . Получено 29.11.2021 .[17][18]
  12. ^ "Глава 10 Управление памятью". Руководство пользователя Caldera DR-DOS 7.02 . Caldera, Inc. 1998 [1993, 1997]. Архивировано из оригинала 2017-08-30 . Получено 2017-08-30 .
  13. ^ abc Paul, Matthias R. (2002-04-06). "Re: [fd-dev] ОБЪЯВЛЕНИЕ: CuteMouse 2.0 alpha 1". freedos-dev . Архивировано из оригинала 2020-02-07 . Получено 2020-02-07 . […] Добавьте заголовок драйвера устройства 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.08.2001). "Re: [fd-dev] On GRAFTABL and DISPLAY.SYS (Was: Changing codepages in FreeDOS)". freedos-dev . Архивировано из оригинала 04.09.2017 . Получено 04.09.2017 . […] По крайней мере, MS-DOS 6.0 + GRAFTABL перемещается по частям своего сегмента PSP (смещение +60h и выше), чтобы минимизировать свой резидентный размер. […](Примечание. GRAFTABL 2.00+ после DR-DOS 7.03 также поддерживает динамическое самоперемещение.)
  15. ^ абв Paul, Matthias R. (2002-02-02). "Treiber dynamisch nachladen" [Динамическая загрузка драйверов] (на немецком языке). Группа новостей : de.comp.os.msdos. Архивировано из оригинала 2017-09-09 . Получено 2017-07-02 .(Примечание. Дает обзор методов высокой загрузки в DOS, включая использование команд LOADHIGH и т. д., а также методов самоперемещения в UMB с использованием API XMSUMB . Также обсуждаются более сложные методы, необходимые для TSR для перемещения в HMA с использованием перемещения смещения внутри сегмента .)
  16. ^ Boothe Management Systems (1972-11-01). "Пропускная способность - получаете ли вы все, что заслуживаете? - DOSRELO". Computerworld - Newsweekly For The Computer Community (реклама). Том VI, № 44. Сан-Франциско, Калифорния, США: Computerworld, Inc. стр. 9. Архивировано из оригинала 2020-02-06 . Получено 2020-02-07 . […] DOSRELO предоставляет метод, позволяющий сделать проблемные программы DOS самоперемещающимися. DOSRELO реализует возможность самоперемещения для всех программ, независимо от языка, путем добавления логики точки входа в объектный код программы до того, как редактор связей каталогизирует ее в Core Image Library . […]
  17. ^ Тест на память червя (PDF) . Векторная графика . 2015-10-21. Архивировано (PDF) из оригинала 2019-05-15 . Получено 2021-12-13 .(3 страницы) (Примечание. Из руководства по эксплуатации Vector Graphic 3. )
  18. ^ Уилкинсон, Уильям «Билл» Альберт (2003) [1996, 1984]. «Червь H89: тестирование памяти H89». Страница компании Билла Уилкинсона Heath Company . Архивировано из оригинала 13.12.2021 . Получено 13.12.2021 . […] Помимо извлечения инструкции, Z80 использует половину цикла для обновления динамической оперативной памяти . […] поскольку Z80 должен тратить половину каждого цикла извлечения инструкции на выполнение других задач, у него не так много времени для извлечения байта инструкции , как для байта данных. Если одна из микросхем ОЗУ в месте доступа к памяти немного медленная, Z80 может получить неправильную комбинацию битов при извлечении инструкции, но получить правильную при считывании данных. […] встроенный тест памяти не выявит этот тип проблем […] это строго тест чтения/записи данных. Во время теста все выборки инструкций производятся из ПЗУ , а не из ОЗУ […] в результате чего H89 проходит тест памяти, но все еще работает нестабильно в некоторых программах. […] Это программа, которая тестирует память, перемещаясь через ОЗУ. При этом ЦП печатает текущий адрес программы на ЭЛТ , а затем извлекает инструкцию по этому адресу. Если микросхемы ОЗУ в порядке по этому адресу, ЦП перемещает тестовую программу в следующую ячейку памяти, печатает новый адрес и повторяет процедуру. Но если одна из микросхем ОЗУ достаточно медленная, чтобы вернуть неправильную комбинацию битов, ЦП неправильно истолкует инструкцию и будет вести себя непредсказуемо. Однако вполне вероятно, что дисплей зависнет, отображая адрес неисправной микросхемы. Это сужает проблему до восьми микросхем, что является улучшением по сравнению с проверкой целых 32. […] Программа […] выполнит тест на червя , передав инструкцию RST 7 (RESTART 7) из нижнего конца памяти до последнего рабочего адреса. Остальная часть программы остается неподвижной и обрабатывает отображение текущего местоположения команды RST 7 и ее перемещение . Кстати, программа называется тестом на червя, потому что, когда инструкция RST 7 перемещается вверх по памяти, она оставляет за собой липкий след из NOP (NO OPERATION). […]
  19. ^ Steinman, Jan W. (1986-09-01). Написано в West Linn, Oregon, USA. «The Worm Memory Test». The Right to Assemble (TRTA). Журнал программного обеспечения Dr. Dobb's Journal of Software Tools for the Professional Programmer . 11 (9). Redwood City, California, USA: M&T Publishing, Inc. / The People's Computer Company : 114–115 (662–663). ISSN  1044-789X. #119. ark:/13960/t74v34p9p CODEN  DDJOEB . Получено 13 декабря 2021 г.[19] (2 страницы)
  20. ^ Steinman, Jan W. (1986). "III. Полезные процедуры и методы 68000, 16. Тест памяти червя" (PDF) . Написано в West Linn, Oregon, USA. Dr. Dobb's Toolbook of 68000 Programming . New York, USA: Brady Book / Prentice Hall Press / Simon & Schuster, Inc. стр. 341–350. ISBN 0-13-216649-6. LCCN  86-25308. Архивировано (PDF) из оригинала 2021-12-13 . Получено 2021-12-13 .(1+5+10+1 страницы)
  21. Dewdney, Alexander Keewatin (март 1985 г.). «Computer Recreations — A Core War bestiary of viruss, worms and other threats to computer memorys». Scientific American . 285 : 38–39. Архивировано из оригинала 2017-07-04 . Получено 2017-07-04 .

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