Перехоплення переривань і резидентні програми

Велика частина всіх функціональних можливостей MS-DOS полягає в обробці різноманітних апаратних і особливо програмних переривань. Зокрема, звернення до численних системних функцій MS-DOS виконується за допомогою виклику програмного переривання int 21h.

Тим важливіше виявляється той факт, що в MS-DOS програма користувача має можливість перехопити будь-яке переривання, тобто встановити свій оброблювач цього переривання. Фактично для цього достатньо записати адресу нового обробника за відповідною адресою пам'яті. Є системні функції для запам'ятовування адреси колишнього обробника і установки нового.

Перехоплення апаратних переривань дозволяє програмі оперативно реагувати на різні події. Особливо часто перехоплюються переривання від таймера, що дозволяє виконувати деяку дію регулярно, через заданий інтервал часу, (скажімо, відображати поточний час) або ж виконати його один раз в заздалегідь запланований момент, а також переривання від клавіатури, що дозволяють виконати дію при натисканні певної комбінації клавіш. Наприклад, у свій час були популярні резидентні калькулятори, які з'являлися на екрані при натисканні заданих клавіш. Ще один приклад такого роду - програми, перемикаючі російська / латинський регістри клавіатури.

Перехоплення програмних переривань дозволяє програмі модифікувати виконання будь-якої функції MS-DOS. Вище говорилося про використання перехоплення переривань для визначення реакції програми на натискання Ctrl + Break і на критичні помилки. Ще одним прикладом може служити системна програма SHARE.EXE, яка забезпечує коректне розділення файлів між процесами. Ця програма перехоплює основні файлові функції MS-DOS, щоб відстежити всі відкриття і закриття файлів і установку / зняття блокувань. На підставі цієї інформації модифіковані функції відкриття, читання і запису файлу визначають, чи дозволено запитана операція.

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

· Нерезидентні програми, які після завершення своєї роботи повертають управління і всю займану пам'ять системі. Такі програми перехоплюють переривання тільки на час своєї роботи і повинні обов'язково відновити стандартну обробку переривань при своєму завершенні. Ця вимога стосується не тільки нормального завершення, але і завершення по Ctrl + Break і по критичну помилку. В іншому випадку при подальшому виникненні переривання керування буде передано за адресою вже не існуючого в пам'яті обробника, а це крах.

· Резидентні програми являють собою обробники переривань, що залишаються в пам'яті і після завершення завантажити їх процесу, аж до перезавантаження системи. Таким чином, резидентні програми можуть впливати на роботу MS-DOS і всіх програм, що запускаються.

До якого класу повинна належати згадана вище програма SHARE.EXE?

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

На жаль, в MS-DOS немає надійних, підтримуваних системою засобів для створення оперативних процесів. Натомість є тільки можливість перехоплення переривань і ще деякі корисні, але розрізнені функції, які дають прикладному програмісту можливість «вручну» реалізувати багатозадачність, але не гарантують коректності результату.

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

· При установці резидентного програми слід перевірити, чи не була вона вже встановлена, оскільки дворазовий перехоплення переривань однієї і тієї ж програмою зазвичай призводить до невірної роботі програми. Таку перевірку можна виконати різними способами. Найчастіше використовують виклик певного програмного переривання, яке має повернути характерний результат, якщо воно вже перехоплено.

· У MS-DOS немає поняття контексту програми і тим більше немає коштів перемикання контексту. Якщо робота резидентної програми може призвести до зміни таких системних даних, як поточні диск і каталог, інформація про останню трапилася помилку, ідентифікатор поточного процесу і т.п., то ця програма повинна подбати про збереження і відновлення цих даних, щоб не перешкодити нормальній роботі фонового процесу.

· Майже всі функції MS-DOS нереентерабельни, причому навіть не окремо, а в сукупності, тобто виклик одній з цих функцій при незавершеному виконанні іншої може привести до краху системи. Це не викликає ускладнень, поки MS-DOS працює як однозадачная система. Проте активізація резидентної програми може статися під час виконання функції DOS, викликаної з фонової програми. Якщо резидентний програма також викличе якусь системну функцію (а без цього неможливо, наприклад, працювати з файлами), то наслідки будуть плачевні. Способи обійти це утруднення існують, але за своєю заплутаністю вони більше схожі на рецепти алхіміків.