рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Выгрузка резидентной программы из памяти

Работа сделанна в 2000 году

Выгрузка резидентной программы из памяти - Курсовой Проект, раздел Программирование, - 2000 год - Системы программирования и операционные системы Выгрузка Резидентной Программы Из Памяти. Следует Заметить, Что В Dos Отсутст...

Выгрузка резидентной программы из памяти. Следует заметить, что в DOS отсутствуют средства выгрузки резидентных программ.

Единственный предусмотренный для этого механизм - перезагрузка компьютера. Практически, однако, большинство резидентных программных продуктов имеют встроенные средства выгрузки. Обычно выгрузка резидентной программы осуществляется соответствующей командой, подаваемой с клавиатуры и воспринимаемой резидентной программой.

Для этого резидентная программа должна перехватывать прерывания, поступающие с клавиатуры, и вылавливать команды выгрузки. Другой, боже простой способ заключается в запуске некоторой программы, которая с помощью, например, мультиплексного прерывания 2Fh передает резидентной программе команду выгрузки. Чаще всего в качестве выгружающей используют саму резидентную программу, точнее, ее вторую копию, которая, если ее запустить в определенном режиме, не только не пытается остаться в памяти, но, наоборот, выгружает из памяти свою первую копию.

Выгрузку резидентной программы из памяти можно осуществить разными способами. Наиболее простой - освободить блоки памяти, занимаемые программой собственно программой и ее окружением с помощью функции DOS 49h. Другой, более сложный - использовать в выгружающей программе функцию завершения 4Ch, заставив ее завершить не саму выгружающую, а резидентную программу, да еще после этого вернуть управление в выгружающую.

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

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

Поэтому надежно можно выгрузить только последнюю из загруженных резидентных программ. В нашей программе подфункция 00h прерывания 2Fh служит для проверки на повторную установку, а подфункция 01h - для выгрузки. В секцию инициализации добавлены строки сохранения старого содержимого вектора 09h. Это выполняется точно так же, как и для вектора 2Fh - с помощью функции DOS 35h. Старый вектор сохраняется в ячейке old09h, размещаемой в резидентной части программы.

Поскольку выгрузка программы выполняется с помощью прерывания 2Fh, текст обработчика этого прерывания усложняется. Резидентный обработчик прерывания 2Fh прежде всего проверяет номер функции, поступивший в регистре АН, Если этот номер отличается от F1h, управление передается следующему обработчику по цепочке. Далее анализируется содержимое регистра AL. Если AL00h, выполняются действия по защите от повторной загрузки.

Если AL01h, осуществляется переход на метку uninstall для выполнения действий по выгрузке программы. При любом другом номере подфункции управление передается следующему обработчику по цепочке. По метке uninstall осуществляется сохранение используемых далее регистров что делается скорее для красоты, чем по необходимости и функцией DOS 25h восстанавливается из ячеек old09h и old2Fh исходное содержимое соответствующих векторов. Далее из ячейки со смещением 2Ch относительно начала PSP в регистр ES загружается адрес окружения программы.

Сегментный адрес освобождаемого блока памяти - единственный параметр, требуемый для выполнения функции DOS 49h. Размер освобождаемого блока DOS известен, он хранится в блоке управления памятью МСВ. Далее освобождается блок памяти с самой программой. Сегментный адрес этого блока адрес PSP находится в регистре CS. Наконец, командой iret управление передастся в программу, вызвавшую прерывание 2Fh. Функция 49h оповещает DOS о том, что данный блок памяти свободен и может впредь использоваться DOS. Это, однако, не мешает выполняться завершающим строкам программы в данном случае команде iret, поскольку освобождение памяти не разрушает ее содержимого. Наша резидентная программа физически сотрется лишь после того, как в память будет загружена очередная выполняемая программа.

Если программа запускается с клавиатуры с указанием каких-либо параметров имен файлов, ключей, определяющих режим работы программы и проч то DOS, загрузив программу в память, помещает все символы, введенные после имени программы так называемый хвост команды в префикс программного сегмента программы, начиная с относительного адреса 80h. Хвост команды помещается в PSP во вполне определенном формате.

В байт по адресу 80h DOS заносят число символов в хвосте команды включая пробел, разделяющий на командной строке саму команду и ее хвост. Далее начиная с байта по адресу 81h следуют все символы, введенные с клавиатуры до нажатия клавиши Enter. Завершается хвост колом возврата каретки 13. К данным секции инициализации добавилась строка с ожидаемым хвостом команды и байтовый флаг запроса на выгрузку.

Поскольку действия программы при е запуске зависят от того, введена ли команда запуска с параметром или нет, наличие хвоста в PSP анализируется в самом начале секции инициализации. При запуске программы типа СОМ все сегментные регистры указывают на начало PSP. Байт с длиной хвоста возможно, нулевой помещается в регистр CL и сравнивается с нулем.

Если в нем 0, команда запуска была введена без параметров и инициализация программы продолжается обычным образом. Если хвост имеет ненулевую длину, начинается его анализ. Обнулением регистра СН длина хвоста расширяется на весь регистр СХ, что нужно для организации цикла. Регистр DI настраивается на первый байт хвоста, а регистр SI на начало поля tail с ожидаемой формой параметра. Регистр AL подготавливается для выполнения команды сканирования строки. Команда scasb сравнивает в цикле байты хвоста с содержимым AL кодом пробела.

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

После этого регистр DI указывает на второй символ параметра. Команда dec DI корректирует указатель DI, направляя его на первый значащий символ введенного параметра. Далее командой сравнения строк cmpsb осуществляется сравнение трех оставшихся символов хвоста. Если символы совпадают с параметром off, записанным в программе, устанавливается флаг запроса на выгрузку. Если результат сравнения оказался отрицательным, флаг запроса не устанавливается и, следовательно, неправильный параметр просто не воспринимается.

В любой случае осуществляется переход на продолжение программы, начинающей проверять, не установлена ли уже эта программа в памяти. Если программа еще не установлена, введенный параметр не имеет смысла. Инициализация осуществляется обычным образом сохраняются и устанавливаются векторы и программа завершается с оставлением в памяти. При наличии в памяти резидентной копии этой программы осуществляется переход на метку installed, где прежде всего проверяется, установлен ли флаг запроса на выгрузку.

Если флаг сброшен, выводится сообщение о невозможности повторной загрузки и программа завершается с кодом возврата 1. Если флаг запроса установлен, выполняется выгрузка программы, которая заключается в вызове мультиплексного прерывания 2Fh с функцией F1h и подфункцией 01h. Резидентный обработчик этого прерывания, включенный в состав нашей резидентной программы, отработает эту подфункцию, восстановит векторы и освободит занятые программой блоки памяти.

После возврата управления из обработчика в текущую программу будет выведено сообщение об успешной выгрузке и программа будет завершена функцией 4Ch с нулевым кодом возврата. Составленная нами программа не избавлена от недостатков. Так, в ней анализируются всегда только 3 значащих символа хвоста. Таким образом, программа будет выгружена и при вводе команды имя.com onset. Другой недостаток заключается в том, что результат сравнения записанного в программе хвоста с введенным с клавиатуры параметром будет положительным, только если с клавиатуры введены строчные буквы.

Команда имя OFF не приведет к выгрузке программы. По-настоящему следовало включить в программу перед анализом хвоста преобразование символов параметра в прописные буквы. 2.4.

– Конец работы –

Эта тема принадлежит разделу:

Системы программирования и операционные системы

Обработчик должен иметь механизм выгрузки из оперативной памяти встроенный в него самого. Также программа должна иметь защиту от повторной установки в оперативную… Такие программы носят названия программ, резидентных в памяти Terminate and Stay Resident, TSR, или просто резидентных…

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Выгрузка резидентной программы из памяти

Что будем делать с полученным материалом:

Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Все темы данного раздела:

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

Защита резидентной программы от повторной установки
Защита резидентной программы от повторной установки. Как правило, в секции инициализации загружаются векторы прерываний, через которые будет активизироваться программа. Последними строками секции и

Перехват прерываний
Перехват прерываний. В архитектуре процессоров 80х86 предусмотрены особые случаи, когда процессор прекращает прерывает выполнение текущей программы и немедленно передает управление программе-обрабо

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

Описание для пользователя
Описание для пользователя. Приведнная ниже программа осуществляет перехват прерывания от клавиатуры, и производит запись скэн-кодов клавиш и байта флагов клавиатуры в файл с именем scodef.txt. При

Описание для программиста
Описание для программиста. Программа пишется в формате СОМ, поэтому в ней предусматривается только один сегмент, с котором связываются сегментные регистры CS и DS в начале сегмента резервируется 25

Рекомендации по улучшению
Рекомендации по улучшению. Главным недостатком этой программы является неудобное визуальное восприятие записей в файле. Т.е. мы видим не ASCII-код который образовался в результате нажатия кл

Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • Популярное
  • Облако тегов
  • Здесь
  • Временно
  • Пусто
Теги