Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Организация и функционирование вычислительных машин1.doc
Скачиваний:
37
Добавлен:
01.05.2014
Размер:
1.13 Mб
Скачать

Организация прерываний в процессоре Intel 80x86

Механизм асинхронного взаимодействия процессов, одновременно выполняемых в вычслительной системе и еще один способ вызова подпрограмм. Весь программный интерфейс с операционной системой реализуется именно на основе прерываний.

Прерывания:

Программные:

Аппаратные:

Исключения

Прерывания от внешних устройств

Прерывания от внешних устройств

Исключениявозникают при выполнении некой команды в процессоре; они подразделяются на ошибки, ловушки, и остановы.

Ошибкапоявляется до выполнения команды (например, если такой команды не существует или происходит обращение к некоторой привилегированной функции или области данных). Адрес возврата в этом случае указывает на ошибочную команду.

Ловушка- прерывание, возникающее после выполнения команды (например, для организации пошагового выполнения команд). Адрес возврата указывает на следующую команду.

Останов- ситуация с неопределенным результатом. Возврат может вообще не происходить.

Большинство программных прерываний типа

INTn

являются ловушками.

Аппаратные прерывания- прерывания, возникающие асинхронно от внешних устройств, которые обслуживаются в зависимости от приоритета и обрабатываются контроллером прерывания (микросхема 8259).

Прерывания низкого уровня.

Диапазон значений номеров вектора прерывания

NВП=0..1Fh

  • прерывания от схем процессора 00..07 (0- деление на ноль; 1- пошаговый режим; 2- немаскируемое прерывание; 3- точка останова; 4- прерывание по переполнению; 5- печать содержимого экрана, либо прерывание по команде BAUND; 6- прерывание по отсутствию команды; 7- прерывание по отсутствиюFPU).

  • прерывания от контроллера 8259 8..0Fh(8- системный таймер; 9- клавиатура; 0Ah- обслуживание видеоадаптера; 0Eh- обслуживание жесткого диска).

  • прерывания BIOS0Ah..1Fh(0Ah- обмен данными с дисплеем; 0Bh- возвращение объема памяти; 0Ch- обмен данными с диском; 0Dh- последовательный порт ввода вывода и т.д.).

Прерывания среднего уровня.

NВП=20h..5Fh

(21h- большая часть работы с файлами, управление задачами, выделение и освобождение памяти, работа с виртуальной памятью).

Прерывания пользователей.

NВП=60h..7Fh

(от 70hиспользуются для различных устройств).

Прерывания языков высокого уровня.

NВП=80h… и более

Уровни приоритета.

IRQ0..IRQ15- контролируются и выполняются с помощью контроллера 8259. Самый высокий уровень приоритета уIRQ0.

IRQ0- системный таймер;

IRQ1- клавиатура

IRQ2- размножитель приоритетных уровней;

8- часы реального времени;

9- прерывание обратного хода луча и звуковой карты;

10- 12- резерв;

13- ошибка FPU;

14 и 15- от контроллеров жесткого диска IDE1,IDE2.

IRQ3- COM2 (INT 0Bh);

IRQ4- COM1 (INT 0Ch);

IRQ5- не используется (INT0Dh);

IRQ6- прерывание от магнитного диска (INT0Eh);

IRQ7-LPT1 (INT0Fh).

Маскируемые прерывания.

Запрет от прерывания выполнения критичной части программы или для маскирования долго выполняемых прерываний.

Способы реализации.

1) общее маскирование

CLI,STI- устанавливают флаг прерыванияIFв 0 и единицу соответственно.

2) Выборочное маскирование.

Засылка определенного кода в регистр маски контроллера 8259. В этом контроллере три основных регистра.

IRR- регистр запроса прерывания регистр ;

ISR- регистр обслуживания прерывания (порт 20h);

IMR- регистр маскирования прерывания (порт 21h);

moval, 01000000b; маскируются запросы прерывания от жесткого диска

out 21h

------

mov al, 0

out 21h

К IRRподключены все линииIRQ0..IRQ15.ISRхранит приоритет текущего обслуживаемого процесса. Происходит сравнениеPRIRRиPRISR, запросIRRне должен быть маскирован.

Разработка собственных прерываний

Причины: необходимость создания собственной подпрограммы резидентной в памяти и доступной из любой программы; необходимость дополнения существующих прерываний; использование холостых прерываний, телом которых является IRET.

Существует два способа заполнения вектора прерывания адресом своего обработчика.

- Низкоуровневый: командой movзаписать по адресу вектора сегмента и смещения обработчика.

- Используя средства операционной системы: функции 25 и 35 int21hпозволяют устанавливать новое и получать старое значение адреса обработчика вектора прерывания.

Пример:N=60

Data Segment

old_cs dw 0; буфер для хранения

old_ip dw 0; старый ВП

---------

old_vp dd 0;

Data ENDS

Code Segment

;сохранение адреса старого обработчика

mov ax, 3560h

int 21; ВП_cses, ВП_irbx

mov old_cs, es

mov old_ip, bx

;задание адреса нового обработчика в ВП 60h

push ds

mov dx, offset New_sub

mov ax, seg New_sub

mov ds, ax

mov ax, 2560h

int 21h

pop ds

;новый обработчик прерывания 60h

New_sub proc far

push ax

; тело обработчика

pop ax

mov al, 20

out 20h

iret

---------

Final EQU $

---------

New_sub ENDP

;восстановление старого ВП

lds dx, DWORD PTR OLD_CS

mov ax, 2560h

int 21h

Возможные проблемы:

  • если данные передаются через память, нужно тщательно следить за содержимым регистра ds. Лучше данные передавать через регистры или стек;

  • если возможно прерывание обработчика через Ctrl+Break, необходимо предусмотреть восстановление адреса старого обработчика;

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

Перекрытие обработчика прерываний.

Можно записать существующий обработчик по новому адресу, а на старый номер- свой, который может вызывать старый. Существующие обработчики прерываний DOSиBIOSсложно поддаются модификации на уровне исходных кодов и для добавления новых функций требуется реализовать следующий механизм:

  • создать новый обработчик прерываний (реализующий дополнительные функции), который вызывает старый (системный), размещенный по новому неиспользованному вектору в диапазоне 60h..70h;

  • перенести старый обработчик прерываний в новый вектор прерывания;

  • изменить вектор прерывания с системным номером таким образом, чтобы но указывал на новый обработчик прерывания;

  • завершить программу установки нового обработчика и оставить ее резидентной в памяти.

Возврат после завершения старого обработчика может происходить либо в новый обработчик

pushf

callold_handler; дополнительные функции после старого обработчика

либо в вызывающую процедуру

jmpcs:old_handler; дополнительные функции до старого обработчика

Разработка резидентных обработчиков прерываний.

TSR(TerminateandStayResident)

int27h- более старая версия;

int21h- более новая. мама

Резидентный обработчик обычно пишется в виде модуля типа comи для его разработки необходимо:

  • наличие свободного вектора прерывания и указание метки конца обработчика для int27h(определение длины обработчика +100PSP);

  • для int31hдлина обработчика задается параграфами.

Для минимизации длины кода обработчика инициализирующую его часть выносят за его предел.

Cod_s Segment

Begin: jmp short set_up; переход на инициализацию

Rezid_h: proc far

push ds

;тело процедуры обработчика прерывания

pop ds

iret

Final EQU $; текущее значение счетчика размещения

Rezid_h ENDP

Set_up: mov dx, offset Rezid_h

mov ax, 2568h; задание свободного ВП с №68h

int 21h

;завершение с оставлением в памяти

lea dx, Final

int 27h

ret

Cod_s ENDS