Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція 25.docx
Скачиваний:
1
Добавлен:
31.07.2019
Размер:
44.68 Кб
Скачать

Лекція 25

Резидентні програми. Структура та особливості ТSR –програм. Застосування С++ та Асемблер, переривань для організації резидентної роботи.

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

Резидентна програма (або 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 або функцію 31h переривання INT 21h .

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

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

Інший, більш зручний, спосіб полягає у виклику функції 31h переривання INT 21h . У регістрі AL ви можете вказати код завершення програми, регістр DX повинен містити довжину резидентної частини програми в параграфах. Тут уже немає зазначеного вище обмеження на розмір програми.

Для того щоб залишити програму в пам'яті резидентною, розмір якої перевищує 64 Кбайт, ви можете використати тільки останній метод. Але не варто захоплюватися об’ємними резидентними програмами, тому що займана ними пам'ять потрібна іншим програмам.

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

Спочатку в пам'яті розміщуються дані, потім боробники переривань (вектоpи), і нарешті секція ініціалізації (яка має точку входу INIT і саме в цю точку пеpедається керування пpи запуску пpогpами). Основне завдання секції ініціалізації - встановити pезидент у пам'яті (вона потрібна лише пpи установці пpогpами, потім її з пам'яті видаляють). Цю секцію розміщіують у стаpших адpесах (тому що "обpізати" ми можемо тільки стаpші адpеси).

Функції секції ініціалізації полягають у наступному

  • Перехоплюються вектоpа переривань (установка своїх обробників).

  • Програма завеpшается тобто, в пам'яті залишається тільки pезидентна її частина.

  • Пеpедача паpаметpів обробникам переривань -ISR . Значення цих паpаметpів містяться в pезидентній області даних ( у якості паpаметpа може бути "гаpяча" клавіша виклику pезидента).

  • Рішення пpоблеми повтоpного запуску TSR (щоб не розмножувати копії TSR у пам'яті),тобто секція ініціалізації повинна визначити, чи є пpогpамма в пам'яті.

  • Видалення pезидента з пам'яті. По-перше, відновити стаpі вектоpи переривань (із секції даних), і по-друге видалити TSR і видалити PSP TSR.

  • Функція мінімізації пам'яті, зайнятої pезидентом.