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