Система прерываний и исключений в архитектуре IA-32 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Система прерываний и исключений в архитектуре IA-32



 

Прерывания и исключения - это события, которые указывают на возникновение в системе или в выполняемой в данный момент задаче определенных условий, требующих вмешательства процессора. Возникновение таких событий вынуждает процессор прервать выполнение текущей задачи и передать управление специальной процедуре либо задаче, называемой обработчиком прерывания или обработчиком исключения. Различные синхронные и асинхронные события в системе на основе ЦП IA-32 можно классифицировать следующим образом (рис. 46):

 

 

Рис. 46. Классификация событий в системе на основе архитектуры IA-32.

 

Прерывания обычно возникают в произвольный момент времени. Прерывания бывают аппаратные (или внешние) и программные.

Внешние прерывания генерируются по аппаратному сигналу, поступающему от периферийного оборудования, когда оно требует обслуживания. Процессор определяет необходимость обработки внешнего прерывания по наличию сигнала на одном из контактов INTR# или NMI#. При появлении сигнала на линии INTR# внешний контроллер прерываний (например, 8259A) должен предоставить процессору вектор (номер) прерывания. С линией NMI# всегда связано прерывание #2.

В процессорах Pentium, P6 и Pentium 4 эти линии могут быть сконфигурированы на использование встроенным контроллером прерываний - APIC (Advanced Programmable Interrupt Controller), тогда они называются LINT0 и LINT1 и их назначение определяется настройками APIC.

Прерывания, которые генерируются при поступлении сигнала на вход INTR#, называют маскируемыми аппаратными прерываниями. Бит IF в регистре флагов позволяет заблокировать (замаскировать) обработку таких прерываний.

Прерывания, генерируемые сигналом NMI#, называют немаскируемыми аппаратными прерываниями. Немаскируемые прерывания не блокируются флагом IF. Пока выполняется обработчик немаскируемого прерывания, процессор блокирует получение немаскируемых прерываний до выполнения инструкции IRET, чтобы исключить одновременную обработку нескольких немаскируемых прерываний.

Прерывания всегда обрабатываются на границе инструкций, т.е. при появлении сигнала на контакте INTR# или NMI# процессор сначала завершит выполняемую в данный момент инструкцию (или итерацию при наличии префикса повторения), а только потом начнет обрабатывать прерывание. Помещаемый в стек обработчика адрес очередной инструкции позволяет корректно возобновить выполнение прерванной программы.

С помощью инструкции INT n (n - номер прерывания) можно сгенерировать прерывание с любым номером 0...255. Такие прерывания называют программными. Состояние бита IF в регистре флагов не влияет на возможность генерации программных прерываний. Программные прерывания могут использоваться для доступа к сервисам операционной системы (например, INT $21 - сервисы DOS, INT $80 - сервисы Linux), функциям драйверов устройств (например, INT $33 - драйвер мыши) или специальным сервисам (INT $10 - видео-сервис BIOS, INT $31 - DPMI-сервис), INT $67 - сервис EMS). Список основных источников аппаратных прерываний приведён в таблице 5.

 

Таблица 5. Источники аппаратных прерываний
Запрос Источник Приоритет Номер вектора
NMI Ошибка памяти или другая неисправимая ошибка в системе   02h
IRQ0 Системный таймер   08h
IRQ1 Клавиатура   09h
IRQ8 Часы реального времени   70h
IRQ9 Устройство на шине ISA   71h
IRQ10 Устройство на шине ISA   72h
IRQ11 Устройство на шине ISA   73h
IRQ12 Устройство на шине ISA   74h
IRQ13 Ошибка сопроцессора   75h
IRQ14 IDE контроллер   76h
IRQ15 Устройство на шине ISA   77h
IRQ3 Последовательный порт (COM2 или COM4)   0Bh
IRQ4 Последовательный порт (COM1 или COM3)   0Ch
IRQ5 Параллельный порт (LPT2) или IDE контроллер (вторичный)   0Dh
IRQ6 Контроллер дисковода   0Eh
IRQ7 Параллельный порт (LPT1)   0Fh

Хотя номер прерывания в этой инструкции может быть любым, следует отметить, что, например, при использовании вектора #2 для вызова обработчика немаскируемого прерывания внутреннее состояние процессора будет отличаться от того, которое бывает при обработке аппаратного немаскируемого прерывания. Аналогично, попытка вызвать обработчик исключения с помощью этой инструкции может оказаться неудачной, т.к. при возникновении большинства исключений в стек включается код ошибки, а при генерации программного прерывания этого не происходит. Обработчик исключения извлекает из стека код ошибки, а в случае программного прерывания из стека будет ошибочно извлечен адрес возврата, что нарушит целостность стека и, в конечном итоге, скорее всего, приведет к исключению #13 или более тяжелому.

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

· генерируемые программой исключения, позволяющие программе контролировать определенные условия в заданных точках программы (INTO - проверка на переполнение, INT3 - контрольная точка, BOUND - проверка границ массива);

· исключения машинного контроля (#18), возникающие в процессе контроля операций внутри чипа и транзакций на шине процессора (Pentium, P6 и Pentium 4);

· обнаруженные процессором ошибки в программе (деление на ноль, нарушение правил защиты, отсутствие страницы и т.п.)

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

Нарушение (отказ) - это исключение, которое обнаруживается либо перед исполнением, либо во время исполнения команды. При этом процессор переходит в состояние, позволяющее осуществить рестарт команды. В качестве адреса возврата в стек обработчика заносится адрес вызвавшей исключение команды.

Ловушка возникает на границе команд сразу же после команды, вызвавшей это исключение. Значения регистров CS и EIP, заносимые в стек обработчика, указывают на очередную команду. Например, если ловушка сработала на команде JMP, то в стеке запоминаются значения регистров CS и EIP, указывающие на ссылку команды JMP.

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

Авария не позволяет осуществить рестарт программы, и зачастую нельзя точно локализовать команду, вызвавшую это исключение. Исключения типа "авария" генерируются при обнаружении серьезных ошибок, таких как неразрешенные или несовместимые значения в системных таблицах или аппаратные сбои.

Типичным случаем аварии является исключение #8 "двойная ошибка". Двойная ошибка происходит, когда процессор пытается обработать исключение, а его обработчик генерирует еще одно исключение. Для некоторых исключений процессор не генерирует двойную ошибку, такие исключения называют "легкими". Только ошибки деления (исключение #0) и сегментные исключения (#10, #11, #12, #13), называемые "тяжелыми", могут вызвать двойную ошибку. Таким образом, получение исключения "неприсутствие сегмента" во время обработки исключения отладки не приведет к двойной ошибке, в то время как ошибка сегмента, происходящая во время обработки ошибки деления на нуль, приведет к исключению #8.

Если при попытке вызвать обработчик исключения #8 возникает ошибка, процессор переходит в режим отключения (shutdown mode). Вывести из этого режима процессор могут только аппаратные сигналы: NMI#, SMI#, RESET# или INIT#. Обычно чипсет, обнаружив на шине процессора цикл отключения, инициирует аппаратный сброс.

Если на границе инструкции обнаруживается, что требуется обработка более одного прерывания или исключения, процессор обрабатывает прерывание или исключение с наивысшим приоритетом. Исключения с низким приоритетом снимаются, а прерывания с низким приоритетом откладываются. Снятые исключения могут быть потом снова сгенерированы при возврате из обработчика.

Архитектура IA-32 предоставляет механизм обработки прерываний и исключений, прозрачный для прикладного и системного программного обеспечения. При возникновении прерывания или исключения текущая выполняемая задача автоматически приостанавливается на время действий обработчика, после чего ее выполнение возобновляется без потери непрерывности, кроме случаев, когда обработка прерывания или исключения вынуждает завершить программу.

Все прерывания и исключения имеют номер (иногда именуемый вектором) в диапазоне от 0 до 255. Номера 0...31 зарезервированы фирмой Intel для исключений.

Расширенный программируемый контроллер прерываний (APIC)

 

Микропроцессоры IA-32, начиная с модели Pentium, содержат встроенный расширенный программируемый контроллер прерываний (APIC). Встроенный APIC предназначен для регистрирования прерываний от источников внутри процессора (например, блок температурного контроля у Pentium 4) или от внешнего контроллера прерываний и передачи их ядру процессора на обработку. Особо важная роль возлагается на встроенный APIC в многопроцессорных системах, где APIC принимает и генерирует сообщения о межпроцессорных прерываниях (IPI - InterProcessor Interrupt). Такие сообщения могут использоваться для распределения обработки прерываний между процессорами или для выполнения системных функций (первоначальная загрузка, диспетчеризация задач и т.п.).

Встроенный APIC различает следующие источники прерываний.

1. От локальных устройств. Прерывания, генерируемые по фронту или уровню сигнала, который поступает от устройства, непосредственно подключенного к сигналам LINT0 и LINT1 (например, контроллер прерываний типа 8259A).

2. От внешних устройств. Прерывания, генерируемые по фронту или уровню сигнала, который поступает от устройства, подключенного к внешнему контроллеру прерываний. Такое прерывание передается в виде сообщения по шине APIC (или системной шине в Pentium 4).

3. Межпроцессорные (IPI). В многопроцессорных системах один из процессоров может прервать другой при помощи сообщения IPI на шине APIC (или системной шине в Pentium 4).

4. От таймера APIC. Встроенный APIC содержит таймер, который можно запрограммировать на генерацию прерывания по достижении определенного отсчета.

5. От таймера монитора производительности. Процессоры P6 и Pentium 4 содержат блок мониторинга производительности. Этот блок можно запрограммировать таким образом, чтобы связанный с ним таймер при достижении определенного отсчета генерировал прерывание.

6. От термодатчика. Процессоры Pentium 4 содержат встроенный блок температурного контроля, который можно запрограммировать на генерацию прерываний.

7. Внутренние ошибки APIC. Встроенный APIC может генерировать прерывания при возникновении внутренних ошибочных ситуаций (например, при попытке обратиться к несуществующему регистру APIC).

Источники 1, 4, 5, 6, 7 считаются локальными источниками прерываний и обслуживаются специальным набором регистров APIC, называемым таблицей локальных векторов (LVT – local vector table). Два других источника обрабатываются APIC через механизм сообщений. Эти сообщения в Pentium и P6 передаются по выделенной трехпроводной шине APIC (рис. 47). В Pentium 4 для передачи APIC-сообщений используется системная шина, поэтому контроллер прерываний может быть подключен непосредственно к обычному системному интерфейсу (например, PCI).

 


Рис. 47. Взаимодействие встроенного APIC и внешнего контроллера прерываний.

 

Структура встроенного APIC является архитектурным подмножеством микросхемы контроллера прерываний Intel 82489DX. Регистры APIC отображаются на 4К-байтный блок оперативной памяти по адресу FEE00000h (может быть изменен через MSR регистры процессора).

Наличие встроенного APIC в процессоре обнаруживается при помощи инструкции CPUID(1). После RESET встроенный APIC включен, однако впоследствии он может быть отключен, тогда процессор будет работать с прерываниями как Intel-386/486 (линии LINT0 и LINT1 будут использоваться как NMI# и INTR#, к которым может быть подключен контроллер прерываний типа 8259A).

Таблица локальных векторов (LVT) состоит из шести 32-битных регистров (в P6 – 5, в Pentium – 4):

· регистр вектора прерывания от таймера;

· регистр вектора прерывания от термодатчика (только в Pentium 4);

· регистр вектора прерывания от монитора производительности (P6 и Pentium 4);

· регистр вектора прерывания LINT0;

· регистр вектора прерывания LINT1;

· регистр вектора прерывания ошибки.

Значения в этих регистрах определяют:

· номер вектора прерывания;

· тип прерывания (fixed – с указанным вектором, SMI - переход в режим системного управления, NMI – немаскируемое, INIT – сброс, ExtINT – внешнее: процессор генерирует цикл INTA и ожидает номер вектора прерывания от внешнего контроллера);

· активный уровень сигнала (низкий или высокий) или триггерный режим (прерывание по фронту или по уровню);

· маску прерывания (прерывание может быть замаскировано).

Эти регистры также отражают состояние прерывания (доставляется ли это прерывание ядру процессора в данный момент).

Кроме того, APIC содержит регистры управления таймером APIC, регистр версии, регистр ошибки, регистры, связанные с обслуживанием прерываний (регистр приоритета, регистр запроса IRR, регистр обслуживания ISR), и регистры, связанные с передачей и приемом IPI.

 

Лабораторная работа №3. Прерывания и работа с монитором

Прерывание int 10h обеспечивает управление всем экраном. В регистре AH устанавливается код, определяющий функцию прерывания.

Функция 02h. Установить позицию курсора.

На входе:

AH – 02h

BH – номер страницы

DH – строка

DL – столбец

Эта процедура может позиционировать курсор, как на активной, так и на пассивной видеостранице. Чтобы сделать курсор невидимым, спозиционируйте его в 25-ую строку.

Функция 05h. Установить активную страницу

На входе:

AH – 05h

AL – номер страницы

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

Функция 0Ah. Записать символ(ы).

На входе:

AX – 09h

AL – ASCII-код символа

BH – номер видеостраницы (в текстовом режиме)

CX – количество раз

Символы записываются от положения курсора по направлениям вправо и вниз, но сам курсор при этом не перемещается.

Пример программы на языке ассемблер:

 

;Программа вывода на экран движущейся по диагонали группы символов.

cseg1 SEGMENT 'code1'

face PROC far

assume cs:cseg1

push ds;Сохранение регистров для выхода.

sub ax,ax;

push ax;

mov ah,5;Задание активной страницы.

mov al,0;

int 10h;

mov cx,3;Задание числа символов.

mov dx,0;Столбец и строка по 0 (dh -номер

; строки, dl -номер колонки).

crsr: mov ah,2;Функция установки позиции курсора.

int 10h

mov al,4;Задание ASCII-кода символа.

mov ah,10;Функция вывода символа.

int 10h

push cx;Количество символов - в стек.

mov cx,4;Временная задержка внешнего цикла

ps1: push cx; около 0.5 сек.

mov cx,0ffffh

ps2: loop ps2;

pop cx;

loop ps1;

pop cx

sub al,al;Для гашения символа.

mov ah,10;

int 10h;

inc dl;Смена столбца.

inc dl;

inc dl;

inc dh;Смена строки.

cmp dh,25;Дошли до нижней строки?

jne crsr;Если нет - переход на новую.

retf

face ENDP

cseg1 ENDS

END face

 

Выполните следующие задания:

1. Задать вывод строки символов и ее перемещение сверху вниз.

2. Задать вывод строки символов и ее перемещение снизу вверх.

3. Задать вывод колонки символов с 0 позиции, и ее перемещение слева направо по экрану.

4. Задать вывод колонки символов в правой части экрана и ее перемещения справа налево.

5. Задать линию символов с левого верхнего угла экрана в правый нижний угол.

6. Задать линию символов с верхнего правого угла экрана в левый нижний угол.

7. Задать три строки символов и их перемещение сверху вниз по экрану.

8. Изобразить в центре экрана квадрат со сторонами 10 на 10 символов.

9. Задать последовательное перемещение символа по строке расположенной в середине экрана.

10. Задать перемещающуюся группу символов (5 символов) по строке экрана.

11. Задать в центре экрана квадрат с изменяющимися сторонами.

12. Задать диагональную линию символов, перемещающуюся по экрану.

13. Задать перемещение символа по экрану с образованием треугольника.

14. Задать три колонки символов в левой части экрана и обеспечить их перемещение в правую часть экрана.

15. Задать три колонки символов в правой части экрана и задать их перемещение в левую часть экрана.

 



Поделиться:


Последнее изменение этой страницы: 2016-09-18; просмотров: 838; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.134.118.95 (0.063 с.)