Что такое резидентная программа в компьютере

Резидентные программы — что это?

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

Недопустимая операция. Решение

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

Как удалить резидентные программы

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

Что такое резидентная программа (TSR)?

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

Резидентная программа или TSR — cокращённо от английского: Terminate and Stay Resident, что в переводе обозначает «Завершить (прервать) работу и остаться на постоянном месте».

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

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

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

К примеру, Вы устанавливали антивирусную программу, затем её удалили. Но удаление произошло не полностью, остался вирусный сканер, который был постоянно загружен в память, и потому его невозможно было удалить обычным способом.

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

Данная программа и подобные ей называются резидентными или TSR.

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

Источник

Резидентная программа

Резидентная программа (или TSR-программа, от англ. Terminate and Stay Resident — «завершиться и остаться резидентной») — в операционной системе MS-DOS программа, вернувшая управление оболочке операционной системы (command.com), либо надстройке над операционной системой (Norton Commander и т. п.), но оставшаяся в оперативной памяти персонального компьютера. Резидентная программа активизируется каждый раз при возникновении прерывания, вектор которого эта программа изменила на адрес одной из своих процедур.

При работе с MS-DOS резидентные программы широко использовались для достижения различных целей (например, русификаторы клавиатуры, программы доступа к локальной сети, менеджеры отложенной печати, вирусы).

По способу инициализации и вызова операционной системой резидентные программы необходимо отличать от «настоящих» драйверов MS-DOS, встраиваемых операционной системой в своё ядро во время загрузки. В эпоху многозадачных ОС резидентными иногда называют программы, загруженные постоянно и работающие в фоновом режиме. Но применение этого термина некорректно по отношению к многозадачным ОС.

Содержание

Основные понятия

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

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

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

Аналогично работают резидентные модули некоторых систем управления базами данных (СУБД). Прикладная программа посылает запросы к базе данных через прерывание, устанавливаемое при запуске такой СУБД.

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

Например, резидентным программам не разрешается использовать прерывания MS-DOS, когда вздумается. Это связано с тем, что MS-DOS с самого начала проектировалась как однозадачная операционная система, поэтому функции прерываний MS-DOS не обладают свойством реентерабельности (повторной входимости).

Представьте себе такую ситуацию.

Пусть обычная программа вызвала какую-либо функцию прерывания MS-DOS, на выполнение которой требуется относительно много времени (например, запись на диск).

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

Функции BIOS также далеко не все реентерабельны. Резидентная программа может смело вызывать разве лишь прерывание INT 16h (которое предназначено для работы с клавиатурой). Если резидентной программе нужно вывести что-нибудь на экран, то вместо прерывания INT 10h следует выполнить непосредственную запись символов и их атрибутов в видеопамять.

Без принятия специальных мер предосторожности резидентная программа не может вызывать многие функции библиотеки транслятора, так как последние вызывают прерывания MS-DOS. Например, функция malloc вызывает прерывание MS-DOS для определения размера свободной памяти в системе.

Для использования прерывания INT 27h сегментный регистр CS должен указывать на PSP программы. При этом в регистр DX следует записать смещение последнего байта программы плюс один байт.

Нетрудно заметить, что этот способ больше всего подходит для com-программ, так как с помощью прерывания INT 27h невозможно оставить в памяти резидентной программу длиннее 64 Кбайт.

Для того чтобы оставить резидентной в памяти программу, размер которой превышает 64 Кбайт, вы можете использовать только последний метод. Но не стоит увлекаться большими резидентными программами, так как занимаемая ими память нужна другим программам.

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

Функции секции инициализации заключаются в следующем

Инициализация резидентной программы

Для использования прерывания 27h сегментный регистр CS должен указывать на PSP программы, а в регистре DX должно быть записано смещение последнего байта программы плюс один байт. Нетрудно заметить, что этот способ остаться резидентной больше всего подходит для программ в формате COM. Вы не сможете оставить резидентной программу длиннее 64 килобайт.

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

Решение пpоблемы повтоpного запуска

Нужно опpеделить, была уже запущена TSR или нет. Возможно несколько ваpиантантов опpеделения запуска TSR:

Достоинство: Шиpокое использование. Недостаток: Набоp сигнатуpы достаточно огpаничен (сигнатуpа может случайно совпасть). Надежность меньше, чем у 2-го метода.

Взаимодействие новых и стаpых обpаботчиков пpерываний (ISR).

Возвpат осуществляется из стаpого обpаботчика. Возникает цепочка между обpаботчиками пpеpываний. Недостаток: Часто бывает необходимо, чтобы новые функции выполнялись после стаpых. По этой схеме это невозможно.

Уpовни сложности TSR и взаимодействие новых ISR дpуг с дpугом.

В зависимости от взаимодействия новых ISR выделяют pазличные уpовни сложности.

Источник

Резидентские программы. Что это такое, для чего они нужны и как отключить резидентные программы в памяти.

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

E Вкратце Я хочу начать серию статей по повышению безопасности наших компьютеров. В этих статьях мы увидим, как установить различные антишпионские программы (антишпионские программы), такие как Поиск и уничтожение Spybot o el Ad-Aware и важно, чтобы вы знали, что это резидентная программа, чтобы в дальнейшем избежать головной боли, когда мы начнем говорить о них в этих статьях.

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

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

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

C Как видите, хорошо, что такие программы, как антивирус, запускаются автоматически при включении компьютера и остаются в памяти для непрерывного использования. Другие программы, которые также находятся в памяти, предназначены для ускорения загрузки приложения, например, программа Acrobat Reader, который используется для открытия файлов PDF, частично находится в памяти, ожидая, когда вы захотите открыть файл PDF, таким образом, когда вы открываете один из этих файлов, программа уже частично загружается, и загрузка выполняется быстрее (если вы хотите заменить Acrobat Reader подумайте о Foxit PDF).

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

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

P Правда, если вы посмотрите в правый нижний угол рабочего стола (в Windows XP), вы увидите множество значков, каждый из которых представляет программу, которая запускается при запуске и остается резидентной в памяти. Мы уже говорили, что некоторые из них необходимы, например антивирус, но другие потребляют ресурсы только без надобности. Например, предположим, что вы устанавливаете Winamp Потому что по выходным вы любите слушать музыку на компьютере, но в течение недели вы работаете со своим компьютером и не используете его, при установке Winamp он всегда запускается вместе с компьютером, так что остается в памяти до тех пор. так как ваш компьютер ждет, когда вы воспользуетесь плеером, но вы используете его только по выходным, поэтому Зачем хранить эту программу в памяти, если вы не собираетесь ее использовать?. С другой стороны, даже если вы используете программу каждый день, разница между запуском ее с нуля и запуском из памяти минимальна, но все время, когда вы не используете плеер, он будет занимать ресурсы. Не лучше ли запретить запуск программы при запуске ПК и предотвратить ее сохранение в памяти?.

P Чтобы программа не загружалась в память и не запускалась с операционной системой, у нас есть несколько методов, но мы увидим только один, который для меня самый простой.

1-й) Перейдите в меню «Пуск» и нажмите «Выполнить»:

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

2-й) Откроется окно с названием «Выполнить», в котором необходимо ввести «Msconfig» (без кавычек). Затем нажмите «Принять».

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

3-й) Откроется окно «Утилита настройки системы», нажмите на последнюю вкладку выше, где написано «Пуск».

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

4-й) Теперь вы можете увидеть все программы, которые загружаются при включении компьютера.

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

5-й) Чтобы ни один из них не загружался, снимите соответствующий флажок. Например, чтобы предотвратить загрузку Winamp, снимите флажок рядом с «winampa», который соответствует «агенту Winamp», программе Winamp, которая загружается при запуске.

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

6-й) После того, как мы сняли все флажки, соответствующие программам, которые мы НЕ хотим загружать в начале, мы должны нажать «Применить», а затем «Закрыть». Важно, чтобы вы не начинали снимать флажки как сумасшедшие и снимали только те, которые, как вы знаете, соответствуют программам, которые вы хотите удалить с самого начала. После нажатия на «Close» появится следующее окно, в котором вы должны выбрать между перезапуском системы сейчас или позже.

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

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

Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.

Полный путь к статье: Новости гаджета » Общие » ПО » Резидентские программы. Что это такое, для чего они нужны и как отключить резидентные программы в памяти.

Источник

Операционная система MS-DOS

5. Резидентные программы

5.1. Что такое резидентная программа?

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

Остающиеся в памяти после завершения своей работы программы называются резидентными или TSR (Terminate and Stay Resident).

Для чего может понадобиться составление TSR-программ?

Другим примером использования TSR-программ могут служить программы резидентных калькуляторов, справочных баз данных типа Norton Guide или целых интегрированных систем наподобие Sidekick фирмы Borland. Такие программы тоже обычно запускаются через AUTOEXEC.BAT или при необходимости. Они перехватывают клавиатурные прерывания и отслеживают нажатие клавиш. Как только обнаруживается нажатие определенной заранее клавиши, поверх имеющегося на экране изображения выводится окно диалога резидентной программы.

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

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

TSR-программы не могут свободно пользоваться прерываниями DOS из-за того, что программы DOS (и BIOS) не обладают свойством реентерабельности. Об этом мы будем говорить при обсуждении особенностей резидентных программ.

5.2. Как программе стать резидентной?

Для использования прерывания 27h сегментный регистр CS должен указывать на PSP программы, а в регистре DX должно быть записано смещение последнего байта программы плюс один байт. Нетрудно заметить, что этот способ остаться резидентной больше всего подходит для программ в формате COM. Вы не сможете оставить резидентной программу длиннее 64 килобайт.

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

Нужно внимательно следить за размером оставляемой резидентной части программы, не забывать про области данных и буфера. Если вы укажите слишком малый объем памяти для TSR-программы, то прикладная программа, загруженная сразу за ней, может оказаться разрушенной.

5.3. Вызов резидентной программы

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

Если вы используете прерывание 9, вырабатываемое при каждом нажатии на клавишу для определения момента запуска диалога, не следует забывать об организации цепочки прерываний, с тем чтобы после анализа (или перед анализом) передать управление стандартному обработчику 9-го прерывания.

Подробно о работе с клавиатурой и о 9-м прерывании будет рассказано во втором томе книги.

5.4. Особенности резидентных программ

TSR-программы имеют некоторые особенности, отличающие их от «нормальных» программ.

Им не разрешается использовать DOS-прерывания, когда вздумается. Это связано с тем, что DOS проектировалась как однозадачная операционная система, поэтому модули DOS не обладают свойством реентерабельности (повторной входимости). Что это означает на практике?

Допустим, Ваша программа записывает длинный файл на диск. Во время записи вы (возможно, случайно) нажали клавишу, активизирующую TSR-программу записи содержимого экрана в файл.

И таких примеров можно привести много. BIOS также далеко не весь реентерабельный. TSR-программа может смело использовать разве лишь прерывание 16h для работы с клавиатурой, которое реентерабельно. Для вывода на экран лучше всего использовать непосредственную запись символов в видеопамять дисплейного адаптера.

Не стоит пользоваться многими функциями библиотеки Quick C, так как они могут вызывать прерывания DOS. Например, функция malloc() вызывает прерывание DOS для определения размера свободной памяти в системе.

Могут возникнуть трудности с использованием арифметических действий с числами в формате плавающей запятой, так как функция _dos_keep() при завершении программы восстанавливает прерывания, использовавшиеся для эмуляции арифметики с плавающей запятой и для работы с арифметическим сопроцессором.

Некоторые из перечисленных проблем (те, что связаны с использованием прерываний DOS) можно решить с помощью недокументированного прерывания INT 28h.

Это прерывание вызывается DOS при ожидании ввода с клавиатуры. В этот момент вы можете использовать любое прерывание DOS, кроме функций от 00h до 0Сh прерывания INT 21h. Утилита спулинга печати PRINT.COM использует это прерывание.

Можно рекомендовать следующий способ использования прерывания 28h. Обработчик прерывания 9 отслеживает нажатие клавиши, которая должна активизировать TSR-программу. Обнаружив эту клавишу (или комбинацию клавиш), обработчик прерывания 9 устанавливает флаг запроса на активизацию TSR-программы и завершает свою работу обычным способом.

Ваша TSR-программа должна создать свой обработчик прерывания 28h и сцепить его со стандартным. Каждый раз, когда DOS ожидает ввода с клавиатуры (в этот момент DOS не использует сама свои прерывания), вызывается прерывание 28h. Ваш обработчик проверяет флаг активизации, устанавливаемый обработчиком прерывания 9, и если флаг установлен, TSR-программа активизируется и может пользоваться услугами DOS, в частности, файловой системой.

Разумеется, после выполнения всех необходимых действий TSR-программа должна сбросить флаг активизации.

Можно также вместе с прерыванием 28 использовать аппаратное прерывание таймера с номером 8. В этом случае надо проверять не только флаг активизации, но и так называемый флаг критической секции DOS. Это байт, адрес которого возвращает недокументированная функция 34h прерывания DOS 21h в регистрах ES:BX. Если этот байт равен 0, то DOS не использует свои прерывания и наступил подходящий момент для активизации TSR-программы.

TSR-программа может вступить в конфликт с другими TSR-программами или прикладным обеспечением, если будет использовать занятые ими номера прерываний. Известен случай, когда драйвер клавиатуры и экрана (SDRIVER) вызывал зависания программных продуктов фирмы Microsoft из-за того, что эти продукты выдавали 16h прерывание с содержимым регистра AX равным 5500h, 5501h и т.д. Обработчик 16h-го прерывания программы SDRIVER при этом зацикливался из-за ошибки в программе (или точнее, из-за плохой реакции на такого рода номера функций прерывания 16h).

Очень важно не допустить случайного повторного запуска TSR-программы, так как повторное переназначение векторов прерываний почти наверняка приведет систему к краху.

Для проверки наличия TSR-программы в памяти обычно используют прерывание мультиплексора 2Fh, специально предназначенное для организации элементов мультизадачности в DOS. Это прерывание используется спулером печати PRINT.COM (об этом мы будем говорить при описании работы с принтером).

TSR-программа может переназначить это прерывание на себя и сделать так, чтобы оно «откликалось» на какой-либо код функции, зарезервированный для прикладных программ. Можно использовать коды C0h. FFh. При запуске TSR-программа вызывает прерывание 2Fh с выбранным кодом и проверяет ответ (передаваемый, например, в регистре AX). Если прерывание отвечает тем кодом, который задан в TSR-программе, это означает, что копия программы уже есть в памяти и повторная установка недопустима.

Приведенные ниже примеры проиллюстрируют все эти особенности.

5.5. Примеры резидентных программ

Приведем несколько примеров TSR-программ.

Первая программа перехватывает прерывание 9 (аппаратное прерывание клавиатуры). Запустив эту программу из приглашения DOS, вы сможете убедиться в том, что прерывание от клавиатуры возникает не только тогда, когда вы нажимаете на клавишу, но и когда ее отпускаете.

Следующая программа GRAB демонстрирует использование функций DOS в TSR-программах. Она содержит все элементы, необходимые «безопасным» резидентным программам.

Программа предназначена для копирования содержимого видеобуфера в файл. Запись в файл активизируется при нажатии комбинации клавиш Ctrl+PrtSc. После каждой записи имя файла изменяется.

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

Итак, текст программы:

Источник

MS-DOS для программиста

5. Резидентные программы

Что это такое резидентная программа?

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

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

Другой пример использования резидентных программ: резидентные калькуляторы, справочные базы данных или интегрированные системы, наподобие Borland SideKick.

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

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

Аналогично работают резидентные модули некоторых систем управления базами данных (СУБД). Прикладная программа посылает запросы к базе данных через прерывание, устанавливаемое при запуске такой СУБД.

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

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

Например, резидентным программам не разрешается использовать прерывания MS-DOS, когда вздумается. Это связано с тем, что MS-DOS с самого начала проектировалась как однозадачная операционная система, поэтому функции прерываний MS-DOS не обладают свойством реентерабельности (повторной входимости).

Представьте себе такую ситуацию.

Пусть обычная программа вызвала какую-либо функцию прерывания MS-DOS, на выполнение которой требуется относительно много времени (например, запись на диск).

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

Функции BIOS также далеко не все реентерабельны. Резидентная программа может смело вызывать разве лишь прерывание INT 16h (которое предназначено для работы с клавиатурой). Если резидентной программе нужно вывести что-нибудь на экран, то вместо прерывания INT 10h следует выполнить непосредственную запись символов и их атрибутов в видеопамять.

Без принятия специальных мер предосторожности резидентная программа не может вызывать многие функции библиотеки транслятора, так как последние вызывают прерывания MS-DOS. Например, функция malloc вызывает прерывание MS-DOS для определения размера свободной памяти в системе.

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

Как оставить программу резидентной в памяти?

Для использования прерывания INT 27h сегментный регистр CS должен указывать на PSP программы. При этом в регистр DX следует записать смещение последнего байта программы плюс один байт.

Нетрудно заметить, что этот способ больше всего подходит для com-программ, так как с помощью прерывания INT 27h невозможно оставить в памяти резидентной программу длиннее 64 Кбайт.

Для того чтобы оставить резидентной в памяти программу, размер которой превышает 64 Кбайт, вы можете использовать только последний метод. Но не стоит увлекаться большими резидентными программами, так как занимаемая ими память нужна другим программам.

Библиотека функций системы разработки Borland C++ содержит в своем составе специальную функцию, предназначенную для оставления программы резидентной в памяти.

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

5.1. Резидентная программа TSRDEMO

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

Программа TSRDEMO может работать в MS-DOS версии 4.0 и более старших версий. Мы проверили ее в среде MS-DOS версии 6.22.

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

Если программу TSRDEMO запустить без параметров в первый раз, она выведет сообщение и останется резидентной в памяти. При повторной попытке запуска программа выведет сообщение о том, что она уже активна. Для того чтобы деинсталлировать программу (выгрузить ее из памяти), достаточно указать при запуске параметр u.

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

Когда программа TSRDEMO загружена в память, в правом верхнем углу экрана мигают символы «*» и «+». Соответствующие функции демонстрируют способ непосредственной записи кодов символов и атрибутов в видеопамять.

При запуске программы TSRDEMO управление получает функция main, исходный текст которой приведен ниже:

Прежде всего, функция main проверяет параметры, переданные программе через командную строку.

Если указан параметр u, вызывается функция unload, которая удаляет резидентную программу из памяти или отключает ее (при невозможности удаления). Если же указан любой другой параметр, функция main выводит на экран инструкцию по запуску программы. В обоих случаях вслед за этим работа программы завершается.

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

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

5.2. Инициализация резидентной программы

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

На первом этапе инициализации наша резидентная программа резервирует память для области кучи (heap) и стека. Это необходимо, если функция, получающая управление при активизации программы, работает со стандартными функциями из библиотеки транслятора (например, открывает файлы или потоки ввода/вывода, заказывает области памяти функцией malloc и т. п.).

Что такое резидентная программа в компьютере. Смотреть фото Что такое резидентная программа в компьютере. Смотреть картинку Что такое резидентная программа в компьютере. Картинка про Что такое резидентная программа в компьютере. Фото Что такое резидентная программа в компьютере

Рис. 5.1. Расположение сегментов в модели памяти small

Какие из этих сегментов потребуются программе, после того как она останется резидентной в памяти?

Если резидентная программа составлена на языке программирования С, то наибольшие трудности возникают при определении необходимого размера сегмента данных.

Вслед за сегментом _BSS в памяти расположена область HEAP, которая иногда называется просто кучей. Из этой области (доступ к которой возможен с помощью регистра DS) происходит динамическое выделение памяти по явному или неявному запросу программы. Заметим, что вызов многих функций стандартной библиотеки С приводит к неявному выделению памяти из области HEAP.

Механизм выделения памяти из области HEAP имеет одну особенность: если программа заказала для себя блок памяти из этой области (например, функцией malloc), а затем освободила его, этот блок памяти не будет возвращен MS-DOS до завершения работы программы. Когда программе опять потребуется блок памяти, по возможности он будет выделен из области HEAP без обращения к соответствующей функции прерывания MS-DOS.

Что же касается стека, то, как известно, он адресуется с помощью регистров SS:SP. Содержимое регистра SS после запуска программы в модели памяти small равно содержимому регистра DS, так как для этой модели памяти стек расположен в сегменте данных.

В отличие от области данных HEAP, которая растет в направлении к концу памяти (в сторону больших адресов), стек растет в направлении к началу памяти. На рис. 5.1 это показано при помощи стрелок.

Вслед за областью стека в памяти расположена область FAR HEAP. Блоки памяти из этой области выделяются в тех случаях, когда программа заказывает их такой функцией, как farmalloc.

Для того чтобы при активизации резидентная программа могла вызывать стандартные функции библиотеки транслятора С, необходимо зарезервировать достаточное количество памяти для областей HEAP и стека. Кроме того, при активизации необходимо правильно загрузить регистры SS:SP, чтобы они указывали на нижнюю границу блока памяти, выделенного резидентной программой для стека.

Взгляните на последние две строки нашей программы TSRDEMO:

Функция tsrinit

Функция tsrinit выполняет все действия, необходимые для инициализации резидентной программы.

Прежде всего, эта функция резервирует область памяти для стека, который будет использован в момент активизации резидентной программы.

Вот соответствующий фрагмент кода:

Вернувшись к рис. 5.1, заметим, что перед стеком должна располагаться область памяти HEAP. Она нужна для работы функций динамического выделения памяти (и не только для этих функций). Поэтому область стека резидентной программы должна быть расположена ниже, как это показано на рис. 5.1.

На самом деле вызывая функцию malloc в первый раз, мы резервируем память для области HEAP. После второго вызова функции malloc будет выделена область памяти размером STACK_SIZE, расположенная сразу после области HEAP. Такая область подходит для стека резидентной программы.

Так как стек растет в направлении к началу памяти, мы запоминаем в переменной tsr_stack адрес нижней границы полученной области (точнее говоря, компоненту смещения адреса стека, пригодную для загрузки в регистр SP).

Когда резидентная программа активизируется, регистры SS:SP будут загружены так, чтобы указывать на выделенную нами область стека. При этом перед стеком будет расположена область памяти, имеющая размер HEAP_RESERVED. Она будет выполнять роль области HEAP, обеспечивая возможность использования стандартных функций библиотеки С.

Далее функция tsrinit сохраняет старые значения ряда векторов прерываний и устанавливает новые обработчики для этих прерываний.

В завершение функция освобождает блок памяти, выделенный для переменных среды в сегменте PSP :

Флаг InDos

Искомый адрес возвращается в регистрах ES:BX.

Для выяснения расположения флага обработчика критических ошибок в MS-DOS новых версий вы должны использовать недокументированную функцию 5Dh прерывания INT 21h:

Эта функция вернет указатель на флаг обработчика критических ошибок в регистрах DS:SI.

5.3. Установка обработчиков прерываний

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

Расскажем подробно о том, какие вектора прерываний мы переопределяем и зачем.

Прерывание INT 1Ch

Прерывание INT 1Ch является программным и вызывается обработчиком аппаратного прерывания от таймера INT 08h приблизительно 18,2 раза в секунду.

Наша программа использует это прерывание, для того чтобы выводить в правом верхнем углу экрана мигающие символы «*» и «+». Такое мигание нужно только для индикации активности резидентной программы. Если индикация не требуется, вы можете не изменять соответствующий вектор прерывания и не предусматривать обработчик для этого прерывания.

Наш обработчик прерывания INT 1Ch называется new_int1c и имеет следующий вид:

Массив screen содержит дальние указатели на массив целых чисел, определенные следующим образом:

Прерывание INT 2Fh

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

Во-вторых, он нужен для выгрузки резидентной программы из памяти.

Исходный текст обработчика прерывания INT 2Fh представлен ниже:

Вызов прерывания INT 2Fh происходит при запуске нашей программы, а также и при запуске других резидентных программ. Регистр AH при этом должен содержать идентификатор резидентной программы. Для программы TSRDEMO мы выбрали идентификатор FFh, хотя никто не сможет гарантировать, что такой идентификатор уже не используется другой программой. Для надежности вы можете указать дополнительный идентификатор, например, в виде текстовой строки, адрес которой передается через другие регистры. Мы не стали этого делать для сокращения объема листинга программы.

Итак, если при вызове прерывания INT 2Fh регистр AH содержит значение FFh, наш обработчик прерывания считает, что вызов выполняет программа TSRDEMO.

В этом случае он дополнительно проверяет содержимое регистра AL, в котором находится код выполняемой функции.

Если этот код равен 0, прерывание INT 2Fh вызвано для проверки наличия программы TSRDEMO в памяти. В ответ обработчик возвращает в регистре AX значение 00FFh. Это и есть признак того, что программа TSRDEMO уже загружена в память и ее повторная загрузка невозможна.

Если же код равен 1, программа TSRDEMO была запущена с параметром u для выгрузки своей копии из памяти.

В этом случае обработчик прерывания INT 2Fh сохраняет в глобальной переменной ExitAddress адрес завершения, переданный обработчику в регистрах BX:DX. Затем проверяется флаг tsr_already_active, который установлен, если резидентная программа активна и ее в данный момент нельзя выгружать из памяти.

Далее обработчик разрешает аппаратные прерывания, которые были запрещены перед вызовом прерывания INT 2Fh для выгрузки, и предпринимает попытку выгрузить резидентную программу, вызывая функцию tsr_exit.

Заметим, что после выгрузки резидентной программы функция tsr_exit передает управление MS-DOS, а не возвращает его обратно в программу.

Подробнее процесс выгрузки резидентной программы будет рассмотрен позже.

Прерывание INT 09h

Аппаратное прерывание от клавиатуры INT 09h обрабатывается для того чтобы обнаружить комбинацию клавиш, предназначенную для активизации резидентной программы:

Когда программа уже активна, установлен флаг tsr_already_active. В этом случае наш обработчик прерывания передает управление по цепочке, вызывая старый обработчик.

Для корректной обработки аппаратного прерывания необходимо выдать в контроллер прерывания соответствующую команду, разрешающую обработку других прерываний. Эту задачу решают несколько команд, оформленных как asm-вставки в исходный текст обработчика.

Прерывание INT 08h

Наша программа использует несколько возможностей для своей активизации. В частности, обработчик аппаратного прерывания таймера INT 08h периодически проверяет возможность активизации:

Прежде всего, проверяется флаг tsr_already_active. Этот флаг устанавливается, когда резидентная программа уже активизирована. Проверка флага активизации позволяет избежать повторной активизации, которая может привести к катастрофе.

Активизация не выполняется также и в том случае, если установлен флаг InDos или unsafe_flag (последний устанавливается, если вызван обработчик прерывания INT 13h ).

Если активизация возможна, сбрасываются флаги popup_while_dos_busy и устанавливается флаг tsr_already_active. Затем вызывается старый обработчик прерывания INT 08h и разрешаются прерывания.

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

В том случае, когда активизация резидентной программы невозможна, наш обработчик прерывания INT 08h вызывает старый обработчик и возвращает управление прерванной программе.

Прерывание INT 28h

Прерывание INT 28h вызывается MS-DOS, когда она ожидает ввод данных от клавиатуры или, иными словами, ничем особенным не занята. Поэтому обработчик прерывания INT 28h может активизировать резидентную программу, если на это есть запрос от пользователя.

Приведем исходный текст обработчика прерывания INT 28h :

Обработчик прерывания INT 28h содержит счетчик рекурсивных вызовов int_28_in_progress, который анализируется при активизации резидентной программы функцией activate_tsr.

В первом случае вызывается функция DosBusy:

Эта функция проверяет содержимое флагов InDos и флага обработки критической ошибки. Если MS-DOS не выполняет обработку критической ошибки и если прерываемая программа не вызывает функцию MS-DOS, можно выполнять активизацию. В этом случае функция DosBusy возвращает значение 0.

При рекурсивных вызовах функций MS-DOS значение, хранящееся в этом байте, увеличивается на 1. Активизация резидентной программы допускается только в том случае, когда в этом байте находится значение 1, т. е. когда нет рекурсии.

Прерывание INT 13h

Исходный текст обработчика прерывания INT 13h представлен ниже:

Для обеспечения возможности адресации глобальной переменной unsafe_flag регистр DS устанавливается на сегмент данных программы TSRDEMO.

Адрес старого обработчика прерывания INT 13h находится в переменной old_int13, куда он записывается функцией get_int_13. Эта функция вызывается из функции tsrinit. Ее исходный текст вы найдете в листинге 5.3 (см. ниже).

5.4. Активизация резидентной программы

Когда обработчик прерываний INT 08h или INT 28h обнаруживает, что есть запрос на активизацию и, кроме того, возможность активизации, вызывается функция activate_tsr. Она и выполняет всю необходимую работу.

Переключение стека

Прежде всего, функция activate_tsr переключает стек при помощи функции set_stack. Эта функция составлена на языке ассемблера и приведена в листинге 5.3.

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

Переключение PSP

На следующем этапе активизации резидентная программа сохраняет PSP прерванной программы и устанавливает свой PSP. Если этого не сделать, текущий PSP не будет соответствовать текущей выполняемой программе (в данном случае программе TSRDEMO).

Для получения адреса PSP прерванной программы вызывается функция GetPSP.

Переключение DTA

Сохранение расширенной информации об ошибке

Если при выполнении какой-либо функции прерывания INT 21h возникает ошибка, в соответствующую структуру памяти записывается расширенная информация, позволяющая определить причины ее возникновения.

Функция SetExtErr восстанавливает расширенную информацию об ошибке при помощи функции 5D0Ah того же самого прерывания.

Удаление содержимого буфера клавиатуры

Для удаления содержимого буфера клавиатуры используется функция _bios_keybrd. Она вызывается в цикле до тех пор, пока буфер клавиатуры не окажется пуст:

Вызов функции application

Теперь можно делать то, для чего предназначена резидентная программа. В данном случае, программа TSRDEMO вызывает функцию application, которая копирует содержимое видеопамяти в создаваемый текстовый файл.

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

Обратное переключение

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

Напомним, что для выгрузки программы TSRDEMO из памяти ее нужно запустить с параметром u.

Что происходит в этом случае?

Функция main вызывает функцию unload. Та, в свою очередь, пытается выполнить удаление копии программы TSRDEMO из памяти, вызывая для этого функцию tsrunload. В зависимости от успеха этой операции функция unload выводит на экран соответствующее сообщение.

Функция tsrunload составлена на языке ассемблера. Ее исходный текст вы сможете найти в листинге 5.3.

Кратко о том, что делает эта функция.

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

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

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *