ФЭНДОМ


Источники прерыванийПравить

Local APIC’и могут получать прерывания от ниже следующих источников:

  • Locally connected I/O devices, локально подключенные устройства в/в — Эти прерывания могут, порождаются как фронтом, так и уровнем. В зависимости от того какое одобряет устройство. Такие устройства подключены напрямую к выводам процессоров (LINT0 и LINT1). Такие устройства в/в также могут быть подключены к 8259 контроллеру прерывания и он в свою очередь будет вызывать локальный контроллер прерываний через локальные линии прерываний (LINT0 и LINT1).
  • Externally connected I/O devices, внешне подключенные устройства в/в — Эти прерывания могут, порождаются как фронтом, так и уровнем. В зависимости от того какое одобряет устройство. Это устройство подключается к выходам I/O APIC. Вызванное таким способом прерывание рассылается I/O APIC при помощи специальных сообщений к одному или нескольким процессоров.
  • Inter-processor interrupts (IPIs) , меж процессорные прерывания— В процессорах Интел 64 или 32 могут использовать механизма IPI для прерывания другого процессора или группу процессоров связанных одной шиной. IPI используется для программного прерывания себя или другого процессора, для пересылки прерывания или оперативного управления.
  • APIC timer generated interrupts, прерывания сгенерированные APIC таймером— Local APIC таймер можно запрограммировать на посылку локального прерывания в процессор связанный с этим таймером. Прерывание будет посконно, когда таймеру это потребуется.(Смотри секцию, “APIC таймер”).
  • Performance monitoring counter interrupts , прерывания, вызванные счетчиками мониторинга производительности. Процессоры семейств P6, Pentium 4, и Intel Xeon одарены возможностью отсылать прерывания к текущему процессору. Посылка происходит когда счетчик мониторинга производительности переполняется.
  • Thermal Sensor interrupts, прерывания от термального датчика — Процессоры Pentium 4 и Intel Xeon умеют посылать прерывание самому себе когда внутренний термальный датчик среагирует. (Смотри секцию, “Thermal Monitor”).
  • APIC internal error interrupts, прерывания от внутренних ошибок APIC — Когда ошибка произошла и была опознана local APIC, он генерирует прерывание для процессора связанного с ним. (пример такими ошибками могут быть обращение к несуществующим регистрам ) (Смотри секцию, “Error Handling”).


Базовый Адрес Править

Обращение к регистрам Local APIC идет по внутренней шине. Поэтому базовые адреса Local APIC'ов могут перекрываться. И скорее всего все так и есть. По этой же причине регистры изолированны — ни один процессор напрямую не может обратиться к Local APIC другого процессора.

Базовый адрес находится в MSR 0x0000001Bh

31-12Базовый адрес
11Состояние (включен=1/выключен=0)
8Загрузочный процессор

Пример получения базового адреса Править

<highlightSyntax language="asm_x86">

mov ecx,MSR_APIC_BASE
RDMSR
;проверяем состояние
test ah,8
jnz apic_init_end
;выключен, включаем
;устанавливаем 11-й бит
bts eax,11		
WRMSR
apic_init_end:
and eax,0xFFFFF000
;EAX содержит базовый адрес

</highlightSyntax>

Регистры Править

Все регистры Local APIC находятся в памяти по адресу, который находится в MSR 0x0000001Bh см. выше. (обычно это 0xFEE00000h) Каждый регистр имеет размерность 32 бита и расположен по адресу кратному 16 байтам.

СмещениеОписаниеДоступ
0000HReserved
0010HReserved
0020HLocal APIC ID RegisterRead/Write.
0030HLocal APIC Version RegisterRead Only.
0040HReserved
0050HReserved
0060HReserved
0070HReserved
0080HTask Priority Register (TPR)Read/Write.
0090HArbitration Priority Register1 (APR)Read Only.
00A0HProcessor Priority Register (PPR)Read Only.
00B0HEOI RegisterWrite Only.
00C0HReserved
00D0HLogical Destination RegisterRead/Write.
00E0HDestination Format RegisterBits 0-27 Read only; bits 28-31 Read/Write.
00F0HSpurious Interrupt Vector RegisterBits 0-8 Read/Write; bits 9-31 Read Only.
0100H - 0170HIn-Service Register (ISR)Read Only.
0180H - 01F0HTrigger Mode Register (TMR)Read Only.
0200H - 0270HInterrupt Request Register (IRR)Read Only.
0280HError Status RegisterRead Only.
0290H - 02F0HReserved
0300HInterrupt Command Register (ICR) [0-31]Read/Write.
0310HInterrupt Command Register (ICR) [32-63]Read/Write.
0320HLVT Timer RegisterRead/Write.
0330HLVT Thermal Sensor RegisterRead/Write.
0340HLVT Performance Monitoring Counters RegisterRead/Write.
0350HLVT LINT0 RegisterRead/Write.
0360HLVT LINT1 RegisterRead/Write.
0370HLVT Error RegisterRead/Write.
0380HInitial Count Register (for Timer)Read/Write.
0390HCurrent Count Register (for Timer)Read Only.
03A0H - 03D0HReserved
03E0HDivide Configuration Register (for Timer)Read/Write.
03F0HReserved

Local APIC ID Register Править

Смещение:0х20
Доступ:Read/Write
31 - 24уникальный идентификатор Local APIC это значение после загрузки соответствует значению 31-24 бита регистра EBX при CPUID 0x01
23 - 0 зарезервировано и равно 0


Local APIC Version Register Править

Смещение:0x30
Доступ:Read Only
31 Intel - Reserved, AMD - Есть расширенное регистровое пространство
30 - 24 Зарезервировано
23 - 16 Количество элементов локальной векторной таблицы минус 1
15 - 8 Зарезервировано
7 - 0 Версия

EOI RegisterПравить

Смещение:0xB0
Доступ: Write Only
31 - 0 равно 0 и таким должно оставаться

Для прерываний кроме доставленных как NMI, SMI, INIT, ExtINT, startup, или INIT-Deassert, обработчик прерываний должен содержать команду которая сделает запись в регистр end-of-interrupt (EOI). Это запись, должна производиться в конце подпрограммы обработчика прерывания, перед машинной командой IRET. Это действие указывает что обслуживание текущего прерывания закончено, и Local APIC может выполнить следующее прерывание от ISR. После EOI, APIC очищает самый высокий приоритетный бит в ISR и посылает следующее, с самым высоким приоритетном, прерывание процессору. Если прерывание было настроено на реакцию на уровень сигнала(выбран режим тригера запуск уровнем, а не фронтом), то Local APIC также посылает сообщение конца прерывания ко всем I/O APIC'ам. Для будущей совместимости от программного обеспечения требуется: чтобы когда оно выполняет команду завершения прерывание путем записи значения в регистр EOI, оно должно выполнять запись в регистр EOI значением 0H.

LVTПравить

Локальная таблица векторов(local vector table) или LVT.

LVT Timer Register Править

Смещение:0x320
Доступ:Read/Write

Вектор прерывания таймера. В этом регистре хранится режим работы таймера и номер вектора прерывания который будет вызываться.

31 - 18Зарезервировано
17Timer Mode (Периодическое = 1/Одноразовое = 0)
16Маска (Запрещено = 1/Разрешено = 0)
15-13Зарезервировано
12Статус доставки(Read Only) (есть или нет запрос на прерывание)
11-8Зарезервировано
7-0Вектор

LVT Thermal Sensor Register Править

Смещение:0x330
Доступ:Read/Write

Вектор прерывания температурного датчика. В этом регистре хранится номер вектора прерывания который будет вызываться и режим доставки(тип источника).

31 - 17Зарезервировано
16Маска (Запрещено = 1/Разрешено = 0)
15-13Зарезервировано
12Статус доставки(Read Only) (есть или нет запрос на прерывание)
11Зарезервировано
10-8Delivery Mode/Режим доставки
7-0Вектор

LVT Performance Monitoring Counters Register Править

Смещение:0x340
Доступ:Read/Write

Вектор счетчика производительности. В этом регистре хранится номер вектора прерывания который будет вызываться и режим доставки(тип источника).

31 - 17Зарезервировано
16Маска (Запрещено = 1/Разрешено = 0)
15-13Зарезервировано
12Статус доставки(Read Only) (есть или нет запрос на прерывание)
11Зарезервировано
10-8Delivery Mode/Режим доставки
7-0Вектор


LVT LINT0 Register Править

Смещение:0x350
Доступ:Read/Write

Вектор линии прерывания 0. В этом регистре хранится номер вектора прерывания который будет вызываться, режим доставки (тип источника) и другие настройки. LINT0 обычно выступает в качестве INTR вывода процессора для внешнего контроллера прерываний I/O APIC или 8259A PIC. В зависимости от режима системы прерываний Virtual Wire Mode или Symmetric I/O Mode Должен быть настроен соответственно.

31 - 17Зарезервировано
16Маска (Запрещено = 1/Разрешено = 0)
15Режим тригера (уровнем = 1/фронтом= 0)
14Remote IRR Flag (Read Only)(прерывание в процессе обработки= 1/сбрасывает в 0 при посылке EOI)
13Поляризация (активация низким уровнем= 1/активация высоким уровнем = 0)
12Статус доставки(Read Only) (есть или нет запрос на прерывание)
11Зарезервировано
10-8Delivery Mode/Режим доставки
7-0Вектор

LVT LINT1 Register Править

Смещение:0x360
Доступ:Read/Write

Вектор линии прерывания 1. В этом регистре хранится номер вектора прерывания, который будет вызываться, режим доставки (тип источника) и другие настройки. LINT1 обычно выступает в качестве NMI вывода процессора для внешних устройств. Должен быть настроен соответственно.

31 - 17Зарезервировано
16Маска (Запрещено = 1/Разрешено = 0)
15Режим тригера (уровнем = 1/фронтом= 0)
14Remote IRR Flag (Read Only)(прерывание в процессе обработки= 1/сбрасывает в 0 при посылке EOI)
13Поляризация (активация низким уровнем= 1/активация высоким уровнем = 0)
12Статус доставки(Read Only) (есть или нет запрос на прерывание)
11Зарезервировано
10-8Delivery Mode/Режим доставки
7-0Вектор

LVT Error Register Править

Смещение:0x370
Доступ:Read/Write

Вектор прерывания внутренней ошибки контроллера APIC.

31 - 17Зарезервировано
16Маска (Запрещено = 1/Разрешено = 0)
15-13Зарезервировано
12Статус доставки(Read Only) (есть или нет запрос на прерывание)
11-8Зарезервировано
7-0Вектор

Initial Count Register (for Timer) Править

Смещение:0x380
Доступ:Read/Write
31 - 0Значение счетчика

Current Count Register (for Timer) Править

Смещение:0x390
Доступ:Read Only

При достижении значения счетчика 0 вызывается прерывание.

31 - 0Текущее значение счетчика

Divide Configuration Register (for Timer) Править

Смещение:0x3E0
Доступ:Read/Write

Регистр делителя частоты

31 - 4,2Текущее значение счетчика
3,1-0 Конфигурация делителя частоты

Таблица значений делителя частоты

3,1-0Делитель
000b2
001b4
010b8
011b16
100b32
101b64
110b128
111b1

Intel: Отсчет времени таймера идет по сигналам тактовой частоты шины процессора, деленной на значение, указанное в регистре делителя частоты. (The time base for the timer is derived from the processor’s bus clock, divided by the value specified in the divide configuration register.)


AMD: Поле DV определяет значение делителя тактовой частоты ядра процессора. (The DV field specifies the value of the CPU core clock divisor.)