¦ Д О С ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
¦ ВЕКТОРЫ ПРЕРЫВАНИЙ ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
рис.11.1. Карта памяти ДОС.
После загрузки командным процессором программы она начинает
выполняться. При необходимости обращения к ДОС, например, для
выполнения операции с файлом, вызов ДОС осуществляется
программным прерыванием с передачей параметров через регистры. В
зависимости от параметров ДОС выполняет одну из своих
функций. Вызвавшая ДОС программа находится в состоянии ожидания.
Результаты функций ДОС возвращаются в регистрах и с помощью
установки флажка переноса.
Такая последовательность событий описывает работу типичной
однозадачной ОС. ДОС не обеспечивает одновременное нахождение в
памяти и выполнение пользовательских программ, или поддержание
информации о более, чем одной задаче в памяти. Единственный метод
сделать несколько задач активными в памяти - оформить
(несколько) задач как программы обработки прерываний. Для ДОС эти
программы будут выглядеть как ISR-программы, поддерживающие
выполнение единственной задачи. В ДОС задаче разрешается
порождать подчиненную подзадачу, но только одна из них может быть
активной в текущее время. Главная задача будет бездействовать,
пока не завершится подзадача.
Для правильной работы ISR-программ должно быть соблюдено
одно правило: избегать вызова функций ДОС, если ISR-программа
может быть вызвана в результате прерывания работы самой ДОС. ISR-
программы, вызываемые только из нерезидентных программ с помощью
программных прерываний, не имеют таких ограничений, но
асинхронные по отношению к текущей задаче ISR-программы
(например, обработки прерываний от таймера или клавиатуры) не
должны вызывать ДОС. Программисты узнали через некоторое время,
что TSR-программы, будучи вызванными, не должны использовать
функции ДОС. Если резидентная программа читает с клавиатуры с
помощью функций ROM-BIOS (BIOS, "зашитый" в ПЗУ) и пишет на экран
теми же функциями или путем прямого доступа к буферу экрана, она
выполняется без проблем; но при попытке использования такой
программой функции ДОС для чего-либо, система "ломается". Функции
ДОС не реентерабельны; когда резидентная программа прерывает
выполнение функции ДОС и сама вызывает функцию ДОС, система
превращается в мусор. Казалось бы, что нереентерабельность
программ ДОС ограничивает TSR-программы функциями, позволяющими
работать с памятью и использовать возможности ROM-BIOS. Это
ограничение не приводит к большим жертвам. После того, как вы
узнаете, как были созданы функции "окон", вы сможете прекрасно
обойтись без ДОС.
К этой аномалии создатели ДОС добавили трюк, включив в
состав ДОС программу печати со спулингом по имени PRINT.COM.
Спулинг - это слово из прошлых времен, означающий "одновременное
оперативное выполнение периферийных операций". Спулинг при печати
позволяет печатать файл в то время, как пользователь выполняет на
компьютере другую задачу, для которой не требуется принтер.
PRINT.COM является резидентной программой, остающейся в
памяти, поддерживающей очередь запросов на печать, и печатающей
заданные файлы; одновременно с этим возможности компьютера и ДОС
остаются доступными пользователю. Наличие программы, читающей
дисковые файлы, читающей и записывающей в файл очереди на печать,
и переводящей страницы на принтере, пока пользователь делает
что-нибудь еще, позволяет предположить, что в ДОС реализуется
некоторая мультизадачность без объяснения миру, как это делается.
Это предположение и пытливая натура поколения хэккеров,
конечно, подталкивали к открытию возможностей ДОС по ограниченной
мультизадачности. Некоторое время ключи не удавалось
подобрать; затем те, кто понял технику написания функционально
полных TSR-программ, хранили секрет, так они продавали эти
программы, и, наверно, хотели задушить конкурентов. Но остальные,
однако, начали "взламывать" чужие программы и открыли секрет.
Сегодня аккуратный автор может скомбинировать шаги, необходимые
для написания такой программы, прочитав массу технических
журналов и сотни выдержек из электронных бюллетеней. В то время,
как вы читаете эту книгу, возможно печатаются еще книги, подобные
этой, чтобы помочь объяснить суть дела.
TSR-ПРОГРАММЫ
-----------------------------------------------------------------
При работе ДОС и запуске из командной строки TSR-программы
выполняются как нормальные нерезидентные программы. По сути, ни у
ДОС, ни у командного процессора нет способов узнать, что эти
программы станут резидентными, до того, как они завершатся с
помощью одной из TSR-функций ДОС. При завершении программы
информируют ДОС, сколько памяти надо зарезервировать. Насколько
известно, в ДОС это действие приведет лишь к установке нижнего
адреса нерезидентной области на значение сразу после конца
TSR-программы и уменьшению размера доступной для нерезидентных
программ памяти на размер TSR-программы. На рис.11.2 показана
карта памяти системы при наличии двух TSR-программ.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ ¦
¦ КОМАНДНЫЙ ПРОЦЕССОР ¦
¦ (нерезидентная часть) ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
¦ НЕРЕЗИДЕНТНАЯ ОБЛАСТЬ ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
¦ TSR-программа #2 ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
¦ TSR-программа #1 ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
¦ КОМАНДНЫЙ ПРОЦЕССОР ¦
¦ (резидентная часть) ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
¦ ДРАЙВЕРЫ УСТРОЙСТВ ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
¦ Д О С ¦
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ
¦ ¦
¦ ВЕКТОРЫ ПРЕРЫВАНИЙ ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
рис.11.2. Карта памяти ДОС с двумя TSR-программами.
TSR-программы существуют в двух вариантах: программы обработки
прерываний и резидентные утилиты. Разница между ними
незначительна, но она есть.
Программы обработки прерываний.
-----------------------------------------------------------------
Программы обработки прерываний реагируют на прерывания от
аппаратуры или от программ и обычно предназначены для поддержки
различных устройств. Примером такой программы является программа,
вызываемая прерыванием от таймера. Пример в главе 12 показывает,
как можно использовать прерывание от системного таймера для
отображения даты и времени на экран. Программа, поставляемая
вместе с "мышью" фирмы Microsoft под названием MOUSE.COM,
обрабатывает аппаратные прерывания, возникающие при перемещении
"мышки". MOUSE.COM также обрабатывает программные прерывания от
программ, которым требуется определить местонахождение "мышки" и
состояние ее кнопок. Резидентные утилиты могут включать несколько
таких программ.
Резидентные утилиты.
-----------------------------------------------------------------
Резидентные утилиты - это программы обработки прерываний,
обычно не поддерживающие какое-либо устройство, но реагирующие на
нажатие определенной "горячего ключа" и запускающие процессы по
запросу пользователя. Эти утилиты сохраняют состояние компьютера
на момент своего вызова, и восстанавливают это состояние после
окончания своей работы. Типичные резидентные утилиты используют
технику "окон" для связи с пользователем.
Что может быть резидентным.
-----------------------------------------------------------------
После того, как вы прочтете эту и следующую главу, вы
научитесь писать TSR-программы на Турбо Cи. У вас может
возникнуть тенденция писать все в виде резидентных программ и
вызывать все, что возможно, по нажатию клавиши, но себя надо
сдерживать. Не все может или должно быть резидентным.
Помните, что после добавления резидентной программы в память
ее величина уменьшается. Вы можете дойти до того, что не
останется памяти для выполнения обычных программ. Можно быть
богатым на "всплывающие" утилиты, но не иметь памяти, чтобы
сделать маленькую табличку или составить записку на своем
текстовом редакторе.
Помните также, что вы увеличиваете встроенные ограничения
ДОС, вводя первую резидентную программу в память. Не является
сюрпризом, что TSR-программы из разных источников не уживаются.
Далее, некоторые TSR-программы плохо работают с некоторыми
нерезидентными программами.
Некоторые TSR-программы должны быть загруженными после всех
других резидентных программ; они должны быть первыми в наборе
программ, обрабатывающих прерывания. Несколько таких программ не
могут работать вместе, так как только одна из них может быть
последней. Программа Sidekick является примером такой программы;
она должна быть последней загруженной, так как она перехватывает
прерывания таймера из любой программы, загруженной после нее.
Такие несообразности являются результатом попыток вставить
мультизадачность в ДОС. К чести создателей TSR-программ они
старались прийти к соглашениям по стандартам таких программ. Они
делали попытки сотрудничества и определения "хорошо ведущих" себя
TSR-программ, но ни один такой стандарт до сих пор не
опубликован. Также делались попытки определения такой структуры
нерезидентных программ, которая позволяла бы им гармонично
сосуществовать с "правильными" TSR-программами. Создатели
программ для PC привыкли работать с однозадачной ДОС и
ограничениями оборудования PC определенным образом. Чтобы
преодолеть ограничения ДОС и получить требуемые характеристики,
многие программисты "напрямую" сканировали клавиатуру и выводили
данные прямо в видеопамять. Этот метод предполагал наличие только
одной программы и отсутствие соперничества из-за этих
ресурсов. Такие ограничения встают на дороге TSR-программ,
которым нужно быть второй задачей, не мешающей первой.
Фирма Borland поставляет программу Sidekick Plus,
управляющую работой TSR-программ. Она обеспечивает запуск и
взаимодействие семейства TSR-программ, которые созданы с ее
помощью. Преймущество такого решения - в достижении совместимости
TSR-программ. Явным недостатком является необходимость иметь
Sidekick Plus для запуска таких программ и то, что многие
резидентные программы, созданные независимо, не будут работать в
этой среде.
Чтобы решить, делать свою программу резидентной или нет, мы
предлагаем использовать следующие правила:
- Размер программы. Если программа не может быть создана в