листинге каталога. Однако, эти файлы еще располагаются и на дис-
ке.
Таблица 3-6
Компоненты операционной системы MS-DOS
________________________________________________________________
| |
Название | Атрибуты | Функция
_____________________|_________________|________________________
COMMAND.COM | совместимый | Командный процессор
_____________________|_________________|________________________
IBMDOS.COM или другой| совместимый | Обслуживание системы
_____________________|_________________|________________________
IBMBIO.COM или другой| независимый от | Интерфейс ROM-BIOS или
| системы | BIOS
_____________________|_________________|________________________
ROM-BIOS | независимый от | BIOS, базируемая на
| системы | ROM (несколько)
_____________________|_________________|________________________
ROM-BIOS в сравнении с загружаемой BIOS
Имеются две основные области различий, которые могут возни-
кать внутри операционных систем MS-DOS различных исполнений. Эти
различия очень существенно влияют на то, что можно выполнять, и
что нельзя выполнять для компонентов, функционирующих в рези-
дентной части оперативной памяти. Одна из таких областей разли-
чий формируется в зависимости от того, где первоначально распо-
лагается BIOS (Basic Input/Output System - базовая система ввода
/вывода) для аппаратных средств системы в ROM (read-only memory
- 3-61 -
- постоянное запоминающее устройство - ПЗУ) или в файле, который
может быть загружен с диска. Воздействие этих альтернативных ва-
риантов исполнения состоит в том, что BIOS, расположенная в ПЗУ,
обеспечивает заданную среду для этой отдельной машины, в то вре-
мя как загружаемая BIOS часто недоступна для программиста. (В
отличие от систем CP/M, поставщики операционной системы MS-DOS
не обеспечивают пользователей исходными листингами загружаемой
BIOS).
Важность этой опции заключается в том, что MS-DOS не является
реентерабельной (повторно-входимой)! Т.е., если написана рези-
дентная подпрограмма, которая либо управляется прерываниями, либо
помещает "заплаты" в векторы прерываний MS-DOS, то подпрограмма
не может вызывать MS-DOS! Аппаратно MS-DOS поддерживает только
один набор буферов внутренних данных, и любая попытка повторного
входа приводит к полному отказу системы. Т.к. MS-DOS не является
реентерабельной, она не может быть использована для выполнения
ввода/вывода или поддержки функций для резидентных программ, уп-
равляемых прерываниями. Это ограничение может быть снято тогда,
когда фирма "Майкрософт" выпустит конкурентную версию MS-DOS, в
которой, надеемся, будет обеспечен способ обработки таких собы-
тий. До этих пор программисты, желающие писать резидентные под-
программы, должны, вероятно, рассчитывать на ROM-BIOS или писать
свои собственные подпрограммы драйверов. Все эти опции приводят в
результате к непереносимому программному коду, но иногда это и
есть цена платы за предоставляемые возможности.
Если BIOS, на самом деле, загружается с диска во время на-
чальной загрузки системы, то почти наверняка для обеспечения ин-
терфейса с аппаратными средствами пользователи будут писать свои
собственные подпрограммы. В отличие от связи между обычными прог-
раммами и MS-DOS, которые используют векторы прерываний, MS-DOS
общается с BIOS посредством инструкций CALL и JMP. MS-DOS не име-
ет стандартной таблицы переходов для BIOS (типа системы CP/M),
которая могла бы использоваться прикладным программистом, так как
можно легко заметить, что иметь BIOS, базируемую на ROM, гораздо
ценнее, чем писать резидентные подпрограммы для доступа к аппа-
ратным средствам.
Прерывания в сравнении с системами с опросом
Вторая область различий формируется в зависимости от того,
являются ли аппаратные средства управляемыми с помощью прерыва-
ний или управляются с помощью опроса. "Управляемые с помощью
прерываний" означает, что для уведомления BIOS о событиях, кото-
рые могут произойти, система использует прерывания аппаратных
средств. "Управляются с помощью опроса" означает, что эта систе-
ма должна неоднократно спрашивать, или опрашивать аппаратные
средства для проверки экземпляров событий. Системы, управляемые
прерываниями, обеспечивают большую гибкость и большие удобства
для установки некоторых типов резидентных программ.
Одним из соблазнов разработчиков систем, управляемых преры-
ваниями, является желание использовать только одни прерывания
аппаратных средств для управления резидентными подпрограммами.
Иногда это приводит к облегчению способа вывода информации,
а иногда приводит к невероятному "кошмару". До тех пор, пока ис-
пользуется локальный стек, и не "захламлен" стек системы, MS-DOS
сама обычно нечувствительна к присутствию прерываний. Однако, в
отношении BIOS такое упрощение недопустимо. BIOS невозможно на-
- 3-62 -
писать без учета прерываний или, по крайней мере, тех прерыва-
ний, на которые рассчитывали авторы BIOS. Если происходит
прерывание в чувствительной по времени части BIOS, как, напри-
мер, при чтении или записи на дисковый накопитель, то подпрог-
рамма обслуживания может нарушить функционирование BIOS, что мо-
жет привести к сбою или зависанию всей системы.
Внесение "заплат" в векторы прерываний
Резидентные подпрограммы активизируются в одном из двух слу-
чаев: они инициирутся с помощью прерываний аппаратных средств
(управление событиями), или они должна поместить "заплату" в су-
ществующую систему (управление перехватом). Возможна также ком-
бинация этих способов, где точка "заплаты" является одним из
прерываний аппаратных средств. Если используемая система не под-
держивает прерывания аппаратных средств, то следует использовать
способ "заплат".
Для доступа (с некоторыми сложностями) к резидентным под-
программам могут быть использованы прерывания аппаратных
средств, не используемые операционной системой MS-DOS. До тех
пор, пока программа не осуществляет вызов MS-DOS, никаких сис-
темных конфликтов не произойдет. Если аппаратные средства систе-
мы доступны с помощью резидентной подпрограммы, то она должна
проверить, что в это время нет больше доступных аппаратных
средств, и быть осторожной при восстановлении аппаратного средс-
тва в его исходное состояние. Примером минимального влияния
подпрограммы управления прерываниями является программа сохране-
ния всех регистров текущего выполнения программы в зарезервиро-
ванном разделе памяти, когда происходит внешнее прерывание. Та-
кая подпрограмма полезна при отладке программ реального времени.
Однако, если используемое прерывание также используется систе-
мой, то подпрограмма должна принимать во внимание управление пе-
рехватом, потому что резидентная подпрограмма установлена с
"заплатой".
Способ "заплат" является способом вставки резидентных подп-
рограмм в обычное исполнение системы в данной точке так, чтобы
доступ в эту точку осуществлялся через резидентную подпрограмму.
Примером вставки "заплат", вызывающей аппаратное прерывание, яв-
ляется установка резидентной подпрограммы управления клавиату-
рой. Для этого вектор прерывания клавиатуры изменяется на точку
для резидентной подпрограммы. Значение предыдущего вектора кла-
виатуры запоминается в адресе назначения инструкции перехода far
(далекий), которая используется при выходе из подпрограммы рези-
дентной памяти. Когда происходит прерывание клавиатуры, начина-
ется выполнение резидентной подпрограммы. После завершения обра-
ботки прерывания, резидентная подпрограмма передает управление
драйверу клавиатуры. Если резидентная подпрограмма действительно
использует ввод клавиатуры в некоторых случаях, которые не может
продолжить драйвер клавиатуры, то резидентная подпрограмма долж-
на сама обслужить и очистить прерывание, и затем вернуться в вы-
зывающую программу по инструкции IRET. Во всех случаях резидент-
ная подпрограмма должна сохранять контекст прерванной программы.
Другими возможными точками вставки "заплат", которые не вы-
полняют использование прерываний аппаратных средств, является
вставка "заплат" в один из векторов прерывания программного
обеспечения или в адрес перехода. Вставка "заплат" в MS-DOS че-
рез векторы прерываний программного обеспечения обычно не дела-
ется потому, что в операционной системе MS-DOS отсутствует воз-
- 3-63 -
можность распознавания таблицы переходов. Кроме того, в связи с
тем, что не существует стандартный интерфейс между MS-DOS и ин-
терфейсом ее BIOS, вставка "заплат" между MS-DOS и BIOS обычно
затруднительна. Использование прерываний программного обеспече-
ния остается проблематичным.
Одним из общих мест вставки "заплат" в векторы прерываний
MS-DOS является прерывание int 28h. Это, по-видимому, вспомога-
тельное прерывание, используемое внутри MS-DOS. Это также одна
из точек вставки "заплат", в которую гарантируется частый дос-
туп. Резидентная подпрограмма, вставленная в качестве "заплаты"
в этой точке, не может вызывать драйверы функций MS-DOS, т.к.
это приведет к сбою системы. Резидентная подпрограмма также дол-
жна использовать свой собственный контекст для предотвращения
изменения существующего стека и регистров. Листинг 3-12 показы-
вает программные коды, необходимые для установки резидентной
подпрограммы в прерывании int 28h и поддержки этой резидентной
подпрограммы.
Листинг 3-12. Программа INIT28 - Вставка "заплат" в векторы
прерываний системы
----------------------------------------------------------------
; ==== INIT28 - Этот файл вырабатывает программу формата .COM ==
; ==== Установка резидентной подпрограммы путем вставки ========
; ==== "заплаты" в прерывание int 28h ==========================
PAGE 60,132
; ==== Соответствует установке прерывания ======================
VECT_NUM EQU 28h ; номер вектора для установки
OFF EQU 0h ; подпрограмма неактивна
ON EQU 0FFFFh ; подпрограмма активна