- •Программирование прерываний Механизм прерываний
- •Void (* interrupt_table[256])();
- •Вызов прерываний из программ
- •Int intdos (union regs *inregs,
- •Int intdosx (union regs *inregs,
- •Архітектура центрального процесора
- •Intel8086/88
- •01.12Регістри загального призначення
- •Регістр ознак стану процесора (регістр флагів)
- •Int SetSvgaMode (int iVMode)
- •Int86 (0x10, &inregs, &outregs);
- •Int 10h ; прерывание для работы с ; видеосистемой.
- •Изменение таблицы векторов прерываний
- •Void interrupt far int_funct(void)
- •Void (_interrupt _far *oldvect)(void);
- •Void _interrupt _far timer(void)
Программирование прерываний Механизм прерываний
Прерывание можно рассматривать как некоторое особое событие в системе, требующее моментальной реакции. Например, хорошо спроектированные системы повышенной надежности используют прерывание по аварии в питающей сети для выполнения процедур записи содержимого регистров и оперативной памяти на магнитный носитель, с тем чтобы после восстановления питания можно было продолжить работу с того же места.
Возможны самые разнообразные прерывания по самым различным причинам. С каждым прерыванием связывают число, называемое номером прерывания. С каждым номером прерывания связывается то или иное событие. Система умеет распознавать, какое прерывание с каким номером произошло и запускает соответствующую этому номеру процедуру-обработчик прерывания.
Программы могут вызывать прерывания с заданным номером. Для этого они используют команду int в разных модификациях. Это так называемые синхронные (программные) прерывания. Программные прерывания являются синхронными, так как вызываются из программы (а она знает, когда вызывает прерывание!).
Программные прерывания удобно использовать для организации доступа к отдельным, общим для всех программ модулям. Например, программные модули операционной системы доступны прикладным программам именно через прерывания, и нет необходимости при вызове этих модулей знать их текущий адрес в памяти. Прикладные программы могут сами устанавливать свои обработчики прерываний для их последующего использования другими или этими же программами. Для этого встраиваемые обработчики прерываний должны быть резидентными в памяти.
Аппаратные прерывания вызываются физическими устройствами и приходят асинхронно по отношению к выполняющейся программе. Эти прерывания информируют систему о событиях, связанных с работой устройств, например о том, что завершилась печать символа на принтере и нужно выдать следующий символ, или о том, что требуемый сектор диска уже прочитан и его содержимое доступно программе.
Некоторые прерывания (первые пять в порядке номеров) зарезервированы для использования самим центральным процессором для особых событий вроде попытки деления на ноль, переполнения и т.п.
Использование прерываний при работе с медленными внешними устройствами позволяет совместить ввод/вывод с обработкой данных в центральном процессоре и в результате повышает общую производительность системы.
Обработчики прерываний могут сами вызывать программные прерывания, например, для получения доступа к сервису BIOS или MS-DOS.
Составление собственных программ обработки прерываний и замена стандартных обработчиков DOS и BIOS является ответственной и сложной работой. Необходимо учитывать все тонкости работы аппаратуры и взаимодействия программного и аппаратного обеспечения. При отладке возможно разрушение операционной системы с непредсказуемыми последствиями, поэтому надо очень внимательно следить за тем, что делает Ваша программа.
Таблица векторов прерываний
Для того чтобы связать адрес обработчика прерывания с номером прерывания, используется таблица векторов прерываний, занимающая первый килобайт оперативной памяти - адресá от 0000:0000 до 0000:03FF. Таблица состоит из 256 четырехбайтовых элементов – FAR-адресов обработчиков прерываний. Эти элементы называются векторами прерываний. В старшем слове вектора прерывания записан адрес сегмента обработчика прерывания, в младшем слове записано смещение.
Расположение векторов прерываний в ОП и их связь с обработчиками прерываний BIOS и MS-DOS:
0 1 2 3
Номера прерываний
Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию с номером 1 - 0000:0004 и т.д. Для программиста, использующего язык Си, таблицу можно описать следующим образом: