
- •7. Ввод-вывод
- •7.1. Доступ к устройствам ввода-вывода
- •7.2. Прерывания
- •7.2.1. Аппаратное обеспечение для поддержки прерываний
- •7.2.2. Запрет и разрешение прерываний
- •7.2.3. Обслуживание нескольких устройств
- •7.2.4. Управление запросами устройств
- •7.2.5. Исключения
- •7.2.6. Прерывания в операционных системах
- •7.3. Механизм прерываний процессора Pentium
- •7.4. Прямой доступ к памяти
7.3. Механизм прерываний процессора Pentium
Примерами процессоров архитектуры IA-32, могут служить процессоры Pentium, в которых используются две линии запроса прерывания, а именно NMI (Non-Maskable Interrupt) — для немаскируемых прерываний и INTR — для маскируемых прерываний, также называемых пользовательскими. Запросы прерываний по линии NMI всегда принимаются процессором. Запросы по линии INTR принимаются только в том случае, если они имеют более высокий уровень приоритета, чем текущая выполняемая программа (об этом речь пойдет чуть позже). Прерывания INTR можно разрешать или запрещать, устанавливая разряд разрешения прерываний в регистре состояния процессора.
В дополнение к внешним прерываниям существует множество исключений, связанных с событиями, которые происходят во время выполнения программ. К числу таких событий относятся, в частности, неверные коды операций, ошибки деления, переполнения и многие другие.
Любое из указанных событий заставляет процессор передать управление программе обработки прерывания. Каждому прерыванию или исключению назначается номер вектора. В случае прерываний по линии INTR номер вектора направляется устройством ввода-вывода процессору по шине после подтверждения факта прерывания. Для остальных исключений номер вектора задается заранее. Зная номер вектора, процессор определяет начальный адрес программы обработки прерывания, для чего он обращается к таблице, называемой Interrupt Descriptor Table (таблица дескрипторов прерываний).
Процессор Pentium работает совместно с микросхемой, называемой APIC (Advanced Programmable Interrupt Controller — усовершенствованный программируемый контроллер прерываний). Через нее различные устройства ввода-вывода соединяются с процессором. Контроллер прерываний определяет приоритеты устройств и направляет процессору соответствующий каждому из них номер вектора прерывания.
На рис. 7.11 показаны восемь разрядов этого регистра EFLAGS, с 8 по 15, где содержатся флаг разрешения прерываний IF (Interrupt enable Flag), флаг трассировки TF (Trap Flag), а также уровень привилегий ввода-вывода IOPL (I/O Privilege Level). Когда IF - 1, прерывания по линии INTR разрешены. Флаг трассировки разрешает прерывания трассировки после каждой команды программы.
Рис. 7.11. Часть регистра состояния процессора Pentium
У процессора Pentium довольно сложная структура приоритетов, в соответствии с которой программы операционной системы условно делятся на четыре группы и каждой из них назначается один из четырех уровней приоритета. Для каждого из таких уровней выделяется свой сегмент адресного пространства процессора. При переключении от одного уровня привилегий к другому выполняется множество проверок, реализующих так называемый механизм блокировки. Такая архитектура позволяет разрабатывать операционные системы с очень высокой степенью защиты. Но процессор Pentium может работать и в очень простом режиме, когда вообще не существует никаких привилегий и все программы функционируют в одном сегменте памяти. Такой простой режим мы и рассмотрим в данном разделе.
При возникновении исключения, а также после получения запроса прерывания процессор выполняет операции, перечисленные ниже.
1. Проталкивает в стек процессора, на который указывает регистр ESP, значение регистра текущего сегмента CS (Code Segment) и указателя команды EIP.
2. Если исключение вызвано нестандартной ситуацией при выполнении программы, помещает в стек код, определяющий причину исключения.
3. Если нужно, очищает флаг разрешения прерывания, чтобы дальнейшие прерывания от того же источника были запрещены.
4. По значению вектора прерывания находит в таблице дескрипторов прерываний начальный адрес программы обработки прерывания и загружает его в EIP, после чего продолжает выполнение команд.
5. Обслужив запрос (например, выполнив пересылку входных или выходных данных), программа обработки прерывания возвращает управление прерванной программе, для чего она выполняет команду возврата из прерывания IRET. Эта команда восстанавливает из стека значения регистров EIP и CS и регистра состояния процессора, восстанавливая тем самым состояние процессора.
Подобно любой подпрограмме программа обработки прерывания может создать для себя временное рабочее пространство, сохранив в стеке значения регистров. В этом случае должна быть гарантия того, что перед выполнением команды IRET программы указатель стека ESP будет содержать адрес возврата.
Пример 7.4
На рис. 7.12 вы видите ту же программу, использующую процедуру прерывания для чтения строки символов с клавиатуры для процессора Pentium в реальном режиме работы (MS DOS). Для клавиатуры обрабатывается запрос прерывания с кодом 0А и что соответствующая запись в таблице дескрипторов прерываний содержит начальный адрес программы обработки прерывания READ. Для того чтобы разрешить прерывания в процессоре, нужно выполнить команду STI, устанавливающую флаг IF в регистре состояния процессора в 1.
Пользовательская программа
MOV DX, offset String ;Область памяти для строки символов
MOV AH,0А ;Вызов функции ввода строки
INT 21h ;Вызов INTVEC
Программа обработки прерывания INT21h
… … ;Инициализация, переход на обработку клавиатуры
start: MOV EOL,0
MOV BL,4
OR CONTROL,BL ;Установка разряда KEN для разрешения прерываний
;от клавиатуры
STI ;Установка флага прерываний в регистре процессора
READ: PUSH ЕАХ ;Сохранение регистра ЕАХ в стеке
PUSH ЕВХ ;Сохранение регистра ЕВХ в стеке
MOV EAX,PNTR ;Загрузка адреса буфера
BT STATUS,0 ;Проверка 0-бита STATUS (SIN=1?)
BNC RTRN
MOV BL,DATAIN ;Считывание введенного символа
MOV [EAX],BL ;Сохранение символа
INC DWORD PTR [EAX] ;Увеличение значения указателя
CMP BL,ODH ;Проверка того, введен ли символ возврата каретки
JNE Rtrn
MOV BL,4
XOR CONTROL,BL ;Очистка разряда KEN
MOV EOL,1 ;Установка флага EOL
RTRN POP ЕВХ ;Восстановление регистра ЕВХ
POP EAX ;Восстановление регистра ЕАХ
IRET ;Восстановление процессора
Рис. 7.12. Программа обработки прерывания для процессоров IA-32,
считывающая вводимую с клавиатуры строку символов