Расширенный программируемый контроллер прерываний (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. Задать три колонки символов в правой части экрана и задать их перемещение в левую часть экрана.