|
Так
как повторная активация происходит в результате прерывания, то
способ определения используемого стека или доступного пространс-
тва стека отсутствует. Стеки, используемые диспетчером прерывания
int 21h, достаточно большие, чтобы разместить значения всех ре-
гистров процессора. |
резервное копирование файлов |
|
|
Любая прерванная программа также должна иметь
возможность использовать оставшуюся память стека, иначе она не
сможет выполнять запросы BIOS. Диспетчер BIOS сохраняет все ре-
гистры в текущем стеке.
Перед повторной активацией TSR, программа ISR должна сохра-
нить все регистры и переключиться на личный стек TSR. |
nod32 |
|
{img3} |
avast 4 professional edition |
|
Разумно
сохранять регистры в том стеке, который использовался в момент
возникновения прерывания. Оба значения стека и регистров являются
частью одного и того же контекста программы, и стек должен иметь
необходимое пространство для этих значений.
Организация "ловушек" break и критических ошибок
Следующий шаг в последовательности активации связан с измене-
нием информации состояния, которую DOS записала относительно те-
кущей программы. |
asplinux |
|
|
asplinux deluxe, антивирусные программы, резервное копирование данных, системы управления базой данных, asplinux, .
бухгалтерия
|
Ес-
ли инструкция INC в DOSSafeCheck имеет нулевой результат, то про-
должение выполнения безопасно. Ненулевой результат означает, что
выполняется одна или более дисковых операций (в конечном счете,
прерывание int 13h выполняется как результат прерываний int 25h и
int 26h), или незавершен предыдущий вызов TSR. Так как переключе-
ние стека выполняется программой повторной активации, то TSR не
является повторно входимой. (Позднее последовательность повторной
активации будет описана более подробно).
Затем эта программа проверяет флажки критической секции и
критического прерывания. Заметим, что необходимо проверять оба
флажка. Перед началом обработки критической ошибки драйвер крити-
ческой ошибки DOS уменьшает значение флажка критической секции и
увеличивает значение флажка критической ошибки. Побочным эффектом
вызова этой подпрограммы является то, что она предохраняет TSR от
повторного входа. Перед тем, как TSR переключится в фоновый раз-
дел, она должна уменьшить значение флажка "занято" (BusyFlag).
Листинг 4-27. Определение "безопасности" повторной активации
----------------------------------------------------------------
BusyFlag: DB -1 ; флажок "занято"
CSectFlg DW 0,0 ; здесь при инициализации запоми-
; нается адрес флажка критической
; секции
CErrFlg DW 0,0 ; здесь при инициализации запоми-
; нается адрес флажка критической
; ошибки
DOSSafe PROC NEAR
DOSNotSafe:
stc ;;; индикация, что "небезопасно"
ret ;;; и возврат
DOSSafeCheck:
inc cs:BusyFlag ;;; попытка снять блокировку
jg DOSNotSafe ;;; если больше -- то некоторые
;;; уже имеют блокировку
pushr ;;; сохранение, т.к. мы можем по-
;;; лучить при INDosFlag
lds si,DWORD PTR cs:CSectFlg ;;; ds:si <== адрес
;;; флажка критической секции
lodsb ;;; al <== значение флажка крити-
;;; ческой секции
lds si,DWORD PTR cs:CErrFlg ;;; ds:si <== адрес
;;; флажка критической ошибки
or al,BYTE PTR [si] ;;; вычисление ненулевого
;;; флажка критической ошибки
popr
jnz DOSNotSafe ;;; если не 0, то либо критичес-
- 4-41 -
;;; кая ошибка, либо int 21
clc ;;; индикация, что "безопасно"
ret ;;; и возврат
DOSSafe ENDP
----------------------------------------------------------------
Переключение стека и сохранение регистров
Стек является важной составной частью среды программы.
|
|
|