|
PRINT.COM решает эту проблему пе-
ресылкой EOI в свой int 1Сh ISR.
Альтернативной стратегией является перехват int 8. Новая int 8
ISR сразу вызывает старую ISR, которая посылает EOI контроллеру
прерываний перед возвращением. |
операционная система windows |
|
|
ISR, приведенная на листинге 4-8
работает вместе с приведенной на листинге 4-7. Если горячий ключ
не обработан, или если с последней активации прошла 1 секунда, то
для реактивации TSRint 8 ISR вызывает BKGResume.
Листинг 4-8. |
avast 4 server |
|
|
Пример замены прерывания по времени ISR int 8
----------------------------------------------------------------
OldInt8 DD 0 ; сохранение кода инициализации
; начальный адрес ISR int 8
BusyFlag DB -1 ; запрет прерывания
; нереентерабельная секция
; программы
PopupPending DB 0 ; не 0, если встретилась нажатая клавиша
Ticks DB 18 ; выполняется один раз в секунду
Int8ISR PROC FAR
NewInt8:
pushf ;;; моделирование прерывания
call cs:OldInt8 ;;; посылка кода ROM
cli ;;; не является необходимым
cmp cs:PopPending,0 ;;; ожидание запроса выборки?
jnz i8_0 ;;; если не 0 - да
cmp cs:Ticks,0 ;;; счетчик тактов = 0?
jz i 8_0 ;;; если 0 - да
dec cs:Ticks ;;; иначе - уменьшение его
jnz Int9Exit1 ;;; если еще не 0 - продолжение
8_0 call DOSSafeCheck ;;; OS не испорчена?
jc Int8Exit0 ;;; если c - нет
- 4-15 -
;;; заметим, что отметка времени
;;; остается на 0, попытаемся
;;; сохранить для передачи
;;; каждую отметку
call BKGResume ; передача фоновой программе
mov cs:Ticks,18 ; сброс счетчика
Int8Exit0:
dec cs:BusyFlaag ; закрыть
Int8Exit1:
iret ; возврат
Int8ISR ENDP
----------------------------------------------------------------
Управление отображением на экране
Учитывая ранее приведенные ограничения в сервисе видео
ROM-BIOS, для непосредственного управлении аппаратурой отображе-
ния на экран часто требуется TSR. Прямое чтение и запись на эк-
ран ускоряют процесс переключения дисплеев, когда горячий ключ
активизирует TSR, устраняет проблему, связанную с изменением меж-
ду текстовым и и графическим режимами, может уменьшить прямой
доступ к контроллеру 6845 CRT.
-----------------------------------------------------------------
ПРЕДУПРЕЖДЕНИЕ:
Прямой доступ к аппаратуре отображения может быть опасен.
Ошибка при такой обработке может разрушить Ваш монитор.
-----------------------------------------------------------------
Перед тем, как попытаться программировать дисплей, надо себе
представлять, как он работает. |
asplinux 11 |
|
|
panda antivirus, Архиваторы, avast 4 professional, avast 4 server, avast antivirus, .
panda activescan
|
Ниже Вы увидите,что Вы не можете обеспечить безопасность
прерывания некоторых команд DOS'а. Одной из претензий написанной
- 4-13 -
TSR является снятие этих ограничений.
В этом примере новая ISR выполняется каждый раз, когда горя-
чий ключ нажат или опущен. Сначала она вызывает старую ISR клави-
атуры для считывания и обработки сканируемого кода клавиатуры.
Новая TSR проверяет переменную PgmState, поддерживаемую TSR, для
определения, является ли TSR программой переднего плана. Если TSR
выполняется не в переднем плане и ISR распознает горячий ключ,
она попытается вызвать TSR в передний план. Если TSR в данный мо-
мент работает в переднем плане, то прерывание дальнейшей обработ-
ки не потребует.
Если биты состояния клавиатуры,соответствующие горячему клю-
чу, установлены, ISR добавляет флаг ожидания (Popup Pending) и
проверяет возможность безопасного вызова TSR в передний план.
Механизм этого процесса описывает раздел "Реактивация, архи-
тектура DOS и сервис". Если безопасность обеспечена, то чтобы ре-
активировать TSR, ISR вызывает BKGResume. DOSSafe добавляет
BusyFlag, предупреждающий повторный запуск TSR; перед возвращением
к прерванной программе ISR должна эту переменную восстановить.
Листинг 4-7. Пример замены ISR клавиатуры
----------------------------------------------------------------
FGCombo EQU KB_M_Alt OR KB_M_LShift
BKG_C_FG EQU 1
BKG_C_BG EQU 2
BIOS SEGMENT at 40h
ORG 17h
KB_B_Flag DB 0
BIOS ENDS
_text SEGMENT BYTE PUBLIC 'code'-
PgmState DB 0
BusyFlag DB -1 ; запрет прерывания
; нереентерабельная часть программы
OldInt9 DD 0 ; сохранение первоначальной ISR int9
PopupPending DB 0 ; приращение, если запрос не
; может быть обслужен
ASSUME ds:NOTHING
Int9ISR PROC FAR
NewInt9:
pushf ;;; моделирование прерывания
call cs:OldInt9 ;;; вызов первоначальной ISR
cmp cs:PgmState,BKG_C_BG ;;; фоновая программа?
jz i9_0 ;;; если z - да
iret ;;; не выбирать из стека, если нет
pushr ;;; доступ к B_Flag
mov ax,SEG BIOS
mov ds,ax
ASSUME ds:BIOS
mov al,KB_B_Flag;;; al <== текущие флаги KB
and al,FGCombo ;;; маска всех ненужных битов
cmp al,FGCombo ;;; запрошена выборка из стека?
popr
- 4-14 -
ASSUME ds:NOTHING
jnz Int9Exit1 ;;; если NZ - нет запроса
;;; выборки из стека
inc cs:PopupPending ;;; выборка из стека запрошена
call DOSSafeCheck ;;; можно ее делать?
jc Int9Exit0 ;;; если с - нет
call BKGResume ; вызов приоритетной программы
Int9Exit0:
dec cs:BusyFlag ; выпуск программы
Int9Exit1:
iret ; отмена прерывания
Int9ISR ENDP
_text ENDS
----------------------------------------------------------------
Альтернатива для перехвата Int 1Сh
Важно заметить, что ISR Int 1Сh вложена в ISR Int 8, так как
прерывание по времени имеет высший приоритет; никакие прерывания
не обслуживаются, пока контроллер прерываний не получит EOI (ко-
нец прерывания). Любые команды, которые зависят от прерываний, не
будут работать. Другой потенциальной проблемой является то, что
DOS будет терять такты таймера, если он будет слишком долго путе-
шествовать по цепочке int 1Сh.
|
|
|