Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
x64b.pdf
Скачиваний:
81
Добавлен:
10.02.2015
Размер:
5 Мб
Скачать
☆

Инициализация локального контроллера прерываний (LAPIC)

Документация: «Intel® 64 and IA-32 Architectures Software Developer’s Manual», том 3A: «System Programming Guide, Part 1», глава 9

Инструкция CPUID: источник: EAX, иногда EAX и ECX; приёмник: EDX:ECX:EBX:EAX; подробнее см. том 2A.

Инструкции RDMSR / WRMSR: источник ECX — номер MSR регистра; содержимое MSR загружается в/из EDX:EAX; подробнее см. том 2B.

Примечание: для использования LAPIC нужно либо использовать 32-х разрядные адреса (т. е. включить т. н. «нереальный 8086» или 32-х разрядный режим 80386+), либо изменить настройку процессора (MSR IA32_APPIC_BASE), отобразив адреса LAPIC в первый мегабайт адресного пространства,доступный из реального режима.

 

 

 

1) убедиться, что процессор поддерживает LAPIC

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2) убедиться, что установлен бит разрешения LAPIC

 

(поддержка существует лишь для процессоров Pentium и более поздних; подробнее том 3A, глава 9.4);

 

 

 

 

 

(бит номер 0x0B, маска 0x800) в регистре базового

 

1.а) убедиться, что процессор поддерживает

 

 

 

 

 

1.б) убедиться, что бит 9 (маска 0x20) регистра EDX

 

 

 

адреса LAPIC; регистр базового адреса LAPIC

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

известен как MSR 0x1B (IA32_APPIC_BASE):

 

инструкцию CPUID, т.е. бит ID (0x21, маска 0x200000)

 

 

не ноль после выполнения инструкции CPUID,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

63 ... 36

35 ... 12

11

 

10

9

 

8

7 ... 0

 

 

регистра EFLAGS не ноль:

 

 

 

 

 

 

 

функция 1:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MBZ

 

Base

 

APICEN

 

MBZ

 

BSP

MBZ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

pushfl

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

movl

 

 

 

$0x01, %eax

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

movl

$0x1B, %ecx

 

 

 

 

 

 

 

popl

%eax

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cpuid

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

rdmsr

 

 

 

 

 

 

 

 

 

 

test

0x200000, %eax

 

 

 

 

 

 

 

 

 

 

 

 

 

 

test

 

 

 

$0x20, %edx

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

or

 

$0x800, %eax

 

 

 

 

 

 

jz

not_supported

 

 

 

 

 

 

 

 

 

 

 

 

 

 

jz

 

 

 

not_supported

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

wrmsr

 

 

 

 

 

 

 

 

 

 

Обычно базовый адрес LAPIC равен 0xFEE00000; современные процессоры допускают изменение базового адреса посредством MSR регистра.

 

 

 

 

 

 

3) установить бит разрешения LAPIC в дескрипторе вектора фиктивных (spuriouse) прерываний

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4) настроить вектора прерываний LINT0, LINT1, локального таймера и т. д.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+0x20

LAPIC ID

r/o или r/w

 

31 ... 24

 

23 ... 0

 

Lapic ID: содержит ID локального APIC (он же ID процессора) используется при режиме доставки «physical»;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

начальное значение Lapic ID также записывается в биты 31...24 регистра EBX инструкцией CPUID при EAX=1

 

+0xD0

LDR (Local Destination)

r/w

 

ID

 

 

 

MBZ

 

 

 

 

 

 

 

 

 

 

 

 

 

LDR:

 

 

содержит логический ID; используется совместно с DFR при режиме доставки «logical»

 

 

 

 

 

 

 

+0xE0

DFR (Destination Format)

r/w

биты 31-28: model flat 1111/cluster 0000;

27-0: MBZ. flat: побитовое И логического ID; cluster: 4 бита кластер, 4-маска

 

+0x30

LAPIC VERSION

r/o

биты 31:24: MBZ; 23:16: MAX LVT; 15-8: MBZ; 7-0: Version

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+0xB0

EOI

 

 

w/o

любая запись (обычно 0) обозначает End-Of-Interrupt (для ExtINT EOI надо посылать в PIC, а не LAPIC)

 

 

 

 

 

 

 

+0xF0

SPURIOUS

 

r/w

биты 31-10: MBZ; 9: FocusProcessorChecking; 8: Soft.APICEN;

7-0: Spurious Vector

(при этом ISR[n]==0 и EOI не нужен)

 

 

 

+0x80

TPR (Task Priority)

r/w

 

31 ... 8

7 ... 4

 

3 ... 0

 

 

 

 

TPR: приоритет «задачи», т. е. приоритет процессора, когда он не занят обработкой прерываний;

 

+0x90

APR (Arbitration Priority)

r/o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PPR: текущий приоритет процессора (либо прерывания, либо TPR);

 

 

 

 

 

 

 

 

MBZ

 

Priority

 

Priority Subclass

 

 

 

 

 

 

 

 

 

 

APR: используется для доставки процессору с наименьшим приоритетом

 

 

 

 

 

 

 

+0xA0

PPR (Processor Priority)

r/o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+0x320

LVT[0] Timer (Local Vector Table)

 

 

Все LVT регистры имеют сходный формат:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Timer: 0=однократный 1=периодический (для LVT[0])

 

+0x330

LVT[1] Thermal

 

 

 

 

31 ... 18

17

16

 

15

 

 

14

13

 

12

 

11

 

 

10 ... 8

7 ... 0

 

 

 

 

 

 

 

 

 

 

 

MASK: 0=разрешено, 1=запрещено (masked)

 

+0x340

LVT[2] Performance Monitor

r/w

 

MBZ

 

 

Timer

MASK

TM

 

IRR

POL

 

DS

MBZ

 

DM

 

Vector

 

 

 

 

 

 

 

 

 

 

TM (Triggered Mode): 0=фронтом, 1=уровнем (LINT)

 

+0x350

LVT[3] LINT0

 

 

 

 

Биты DM (Delivery Mode) могут быть:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IRR (Remote IRR): r/o (только для LINT при TM=1)

 

+0x360

LVT[4] LINT1

 

 

 

 

000

 

 

001

 

 

 

 

 

 

 

 

010

 

 

 

011

 

 

 

100

101

 

 

110

 

 

 

 

111

 

POL (Polarity Mode): 0=высокий, 1=низкий (LINT)

 

 

 

ERROR

см. также +0x280 ESR

 

 

Fixed

IPI Lowest Priority

SMI

Reserved

 

 

NMI

INIT

IPI StartUP

 

ExtINT

 

DS: r/o 0=нет (idle), 1=ожидает обработки (pending)

 

+0x370

LVT[5]

 

(

 

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+0x380

TICR (Timer Initial Count)

r/w

TDCR:

 

 

 

 

 

 

 

 

 

 

 

 

 

Значение делителя частоты CPU в зависимости от d2 d1 d0: TICR и TCCR соответствуют

 

+0x390

TCCR (Timer Current Count)

r/w

 

31...4

3

 

2

 

 

 

 

1 0

 

 

 

000

 

001

 

010

 

 

011

 

100

 

101

 

110

 

 

111

 

 

 

 

 

 

 

начальному и текущему значению

 

+0x3E0

TDCR (Timer Divide Config.)

r/w

 

MBZ

d2

MBZ

 

d1 d0

 

 

2

 

 

 

 

4

 

8

 

 

16

 

32

 

 

64

 

128

 

 

1

 

 

 

 

 

 

 

 

регистра - счётчика делителя

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+0x300

ICRLOW (Interrupt Command Low)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Self: 00=Dest, 01=себе, 10=всем, 11=всем кроме себя

 

 

63...56

55...32

31...20

19 18

17 16

15

14

 

13

 

 

12

11

 

10...8

7...0

 

 

+0x310

ICRHIGH (Interrupt Command High)

 

Dest.ID

MBZ

 

MBZ

 

Self

 

MBZ

TM

D-A/A

MBZ

I/P

P/L

 

DM

 

 

Vector

D-A/A: r/o 0=de-assert, 1=assert;

P/L: 0=физ., 1=лог.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+0x100

ISR[n] (In-Service)

r/o

4 набора по 8 штук 32-х битовых регистров; каждый набор - 256 бит, обозначающих вектора прерываний

 

 

 

 

+0x180

TMR[n] (Trigger Mode)

r/o

ISR – в обработке процессором;

IRR – принятые к обработке, ноещё не обрабатываемые; TMR – для тех векторов, у

 

+0x200

IRR[n] (Interrupt Request)

r/o

которых бит IRR не ноль, указывают способ, которым прерывание было активировано (0: фронт, 1: уровень)

 

 

 

Инициализация контроллера прерываний ввода-вывода (IO APIC)

Документация: "29056601 - Intel 82093AA IO APIC (82093AA I/O ADVANCED PRPROGRAMMABLE INTERRUPT CONTROLLER (IOAPIC))"

1)IOAPIC обычно отображается на адрес IOAPICBASE 0xFEC00000 (адрес может быть несколько изменен средствами северного моста);

2)IOZPIC представлен двумя регистрами: "селектор" (selector) по адресу IOAPICBASE и "окно" (window) по адресу IOAPICBASE+0x10;

3)При работе с IOAPIC в селектор записывается номер регистра IOAPIC, а из окна производится чтение или запись регистра;

4)Термин "Reserved", определяющий те или иные биты регистров IOAPIC обозначает не "MBZ", а то, что содержимое этих разрядов нельзя изменять, т.е. при необходимости изменить регистр надо сначала прочитать прежнее значение, потом только нужные биты обнулить или установить, а затем записать обратно.

Регистры IOAPIC:

0x00

ID

r/w

 

 

31...

28

 

27

...24

23...

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reserved

 

ID

 

Reserved

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0x01

VER

r/o

 

 

31..24

 

 

23...

16

15

...

8

 

 

7...

0

 

 

 

 

 

 

 

 

 

 

Reserved

Max. IRQ Lines

Reserved

 

Version

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0x02

ARB

r/o

Arbitration ID

 

31...

28

 

27...

24

23...

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reserved

 

ID

 

Reserved

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

24 пары 32-х разрядных регистров образуют 24 записи, по 64 бита на описание каждого IRQ; порядок little-endian

0x10 0x3F REDTBL r/w...

Redirection Table

 

63...

56

 

55...

32

 

31..17

 

 

16

 

15

14

13

 

12

11

10...

8

7...

0

 

 

Dest.ID

Reserved

Reserved

MASK

TM

IRR

POL

DS

P/L

DM

 

Vector

командным ICRHIGH:ICRLOW и таблицей LVT)

 

 

 

 

 

 

 

 

 

 

 

Описание битовых полей схожи с регистрами LAPIC (64-х битовым

Note: здесь и выше для сокращения некоторые названия битовых полей изменены по сравнению с документацией:

P/L соответствует Destination Mode (DESTMOD) – выбор физического (physical) или логического (logical) адреса LAPIC'а

DM соответствует Delivery Mode (DELMOD)

DS соответствует Delivery Status (DELIVS)

TM соответствует Trigger Mode

POL соответствует Pin Polarity (INTPOL)

Типичное назначение полей Trigger Mode (TM) и Pin Polarity (POL) (если иное не оговорено для конкретного устройства):

IRQ0 ... IRQ15

возбуждение прерывания передним фронтом, т.е. TM=0 и POL=0

IRQ16 ... IRQ23

возбуждение прерывания низким уровнем, т.е. TM=1 и POL=1

Сегментная модель защищенных режимов i286...x64

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SSSS

 

 

:

FFFFFFFFFFFFFFFF

 

Логический адрес

 

0

Атрибуты дескриптора:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15

0 31

 

 

55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(проверка смещения на пределы)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SSSS : OOOO OOOO

G X L AVL предел 19..16 P DPL

S

 

тип

 

 

База,

 

Предел,

DPL, Тип, Атрибуты

 

 

 

CS

 

 

 

 

(проверка прав доступа к сегменту)

 

 

0

системный тип

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Типы системных сегментов:

 

 

 

 

 

 

 

 

 

...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+

 

 

 

 

 

 

(селектор)

 

 

 

 

1

1

С

R

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 — старшие 64 бита

1

0

ED

W

A

 

База, Предел, DPL, Тип, Атрибуты

 

 

 

 

GS

 

 

 

 

 

 

 

база сегмента

 

Сегментное

 

1,9 — доступный TSS

 

 

 

 

 

 

 

 

 

 

 

 

 

преобразование

2 — LDT

 

 

 

 

 

 

* Серым цветом выделены игнорируемые в x64 атрибуты

 

 

 

 

 

Линейный адрес

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3,11 — занятый TSS

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Линейный адрес

 

 

 

4,12 — вентиль вызова

 

 

 

 

 

 

 

 

 

 

 

 

 

15

...

 

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

63

47

32

23

0

5 — вентиль задачи

 

 

 

 

 

 

 

 

 

 

 

 

 

смещение дескриптора в таблице TI RPL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SSSS FFFF FFFF FFFF

6,14 — вентиль прерывания

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Локальная таблица

 

 

 

 

 

7,15 — вентиль ловушки

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

выбор

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

дескрипторов (LDT)

 

 

 

 

 

8 — запрещено

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

таблицы

 

 

 

база

GX предел

PS

 

Страничное

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

ТИП

база

предел

 

 

Уровни привилегий запроса (RPL),

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

31...24

L 19...16

DPL

23...15...0

15...0

 

преобразование

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

...

 

 

 

 

 

 

 

 

дескриптора (DPL), ввода-вывода (IOPL)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

база

GX предел

PS

ТИП

база

предел

 

Физический адрес

 

 

0 — высший (режим ядра ОС)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

31...24

L 19...16

DPL

23...15...0

15...0

 

 

 

1 — обычно не используется

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

63

51

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

000F FFFF FFFF FFFF

2 — обычно не используется

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Глобальная таблица

 

4 PB

 

 

 

3 — низший (режим приложений)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

База,

 

Предел

 

 

 

 

 

LDTR

 

 

 

 

 

 

 

 

 

 

 

 

дескрипторов (GDT)

Если говорят, что «а» более привилегированный, чем «б», то это значит, что

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

63

 

47

31

 

15

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PL(а) < PL(б), т.е. «численно меньше» == «более привилегированный»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

база

GX предел

PS

ТИП

база

предел

 

Текущий уровень привилегий

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

31...24

L 19...16

DPL

...

23...15...0

15...0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CPL := RPL(CS)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GDTR (база)

 

(предел)

 

 

 

 

 

 

база

GX предел

PS

ТИП

база

предел

 

«Согласованный» сегмент (бит «C» типа установлен)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

31...24

L 19...16

DPL

23...15...0

15...0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

...

 

 

 

для согласованного сегмента допускается CPL>=DPL(CS)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

база

GX предел

PS

ТИП

база

предел

 

иначе требуется, чтобы CPL==DPL(CS)

 

 

 

 

 

 

 

 

 

 

База,

Предел

 

 

 

 

 

TR

 

 

 

 

 

 

 

31...24 L 19...16

DPL

...

23...15...0

15...0

 

Эффективный уровень привилегий

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

база

GX предел

PS

ТИП

база

предел

 

EPL := max( CPL, RPL(цели) )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

31...24 L 19...16

DPL

23...15...0

15...0

 

В общем случае требуется, чтобы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IDTR

(база)

 

(предел)

 

 

 

 

 

 

 

 

 

 

 

Сегмент состояния

EPL <= DPL(цели)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пред. TSS

ES

EFLAGS

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

задачи (TSS)

 

Отдельные флаги атрибутов:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SS: ESP #0

CS

E IP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

SS: ESP #1

SS

E AX

E SP

база карты

S — «системный» сегмент

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RFLAGS

 

 

 

EFLAGS

 

FLAGS

 

 

 

 

 

 

SS: ESP #2

DS

E CX

E BP

битовая

 

A — к сегменту было обращение

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CR3

FS

E DX

E SI

карта

 

R — право чтения сегмента кода

 

 

 

 

 

31..22

 

21

20

19 18

17

16

15

14

13 12

11

10

9

8

7

6

5

4

3

2

1

0

 

LDTR

 

 

 

 

портов

 

 

 

 

 

 

 

 

GS

E BX

E DI

i/o

 

W — право записи в сегмент данных

 

 

 

 

 

 

0..0

 

ID

VIP VIF AC

VM

RF

0

NT

IOPL

OF

DF

IF

TF

SF

ZF

0

AF

0

PF

1

CF

 

 

 

 

 

 

 

 

 

C — признак «согласованного» сегмента

 

 

 

 

 

 

 

 

вложенная задача

уровень привилегий i/o

 

 

 

 

 

 

 

 

Таблица дескрипторов

 

ED — сегмент данных, «расширяемый вниз» (стек)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

обработчиков прерываний (IDT)

DPL — уровень привилегий дескриптора

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

CR0

 

 

MSW

 

 

 

 

 

 

 

смещение

 

PS

ТИП

селектор

смещение

 

P — сегмент присутствует в ОЗУ

 

 

 

 

 

31

30

29

28

...

19 18

17

16

15

 

...

 

6

5

4

3

2

1

0

 

 

 

 

 

31...16

 

DPL

15...0

15...0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

...

 

 

 

X — 0:=16ти, 1:=32х разрядный сегмент («B» для данных, «D» для кода)

PG

CD

NW

 

...

AM

-

WP

-

-

- -

-

-

NE

ET

TS

EM

MP

PE

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

смещение

 

PS

 

селектор

смещение

 

G — бит гранулярности, 0:=1 байт, 1:=4K (1 страница)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ТИП

 

 

 

 

 

 

 

 

 

 

 

TS,EM,MP: поддержка FPU

=1 защита разрешена

31...16

 

DPL

15...0

15...0

 

L — 1:=64х разрядные адреса (D должно быть 0; данные 32 бита)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Общая структура дескриптора

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Исключения 80386+

 

63 62 61 60 59 58 57 56

55

54

53

52

51

50

49

48

47

46

45

44

43

42

41

40

 

39 38 37 36 35

34 33 32

31 30 29 28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

Int# тип

описание

 

База сегмента 31…24

G

X

L

AVL

предел 19..16

P

DPL

 

 

 

тип

 

 

База сегмента 23…16

 

 

 

 

База сегмента 15 … 0

 

 

 

 

 

 

 

 

Предел сегмента 15 … 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

00

ошибка

целочисленное деление на ноль

Дескрипторы сегментов приложений

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

01

ловушка пошаговое выполнение

Дескриптор сегмента кода

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

02

-

критические ошибка, резерв

63 62 61 60 59 58 57 56

55

54

53

52

51

50

49

48

47

46

45

44

43

42

41

40

 

39 38 37 36 35

34 33 32 31 30 29 28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

03

ловушка прерывание отладчика (int 3)

 

База сегмента 31…24

G

D

L

AVL

предел 19..16

P

DPL

1

1

С

R

A

 

База сегмента 23…16

 

 

 

 

База сегмента 15 … 0

 

 

 

 

 

 

 

 

Предел сегмента 15 … 0

 

 

 

 

Дескриптор сегмента данных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

04

ловушка обработка переполнения (into)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

05

ошибка

ошибка проверки границы

63 62 61 60 59 58 57 56

55

54

53

52

51

50

49

48

47

46

45

44

43

42

41

40

 

39 38 37 36 35

34 33 32 31 30 29 28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

 

База сегмента 31…24

G

B

L

AVL

предел 19..16

P

DPL

1

0

ED

W

A

База сегмента 23…16

 

 

 

 

База сегмента 15 … 0

 

 

 

 

 

 

 

 

Предел сегмента 15 … 0

 

 

 

 

 

 

(bound)

Дескрипторы системных сегментов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

06

ошибка

недопустимый код операции

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

07

ошибка

устройство недоступно (FPU при

Дескриптор TSS (№№1,9 — доступные TSS; №№3,11 — занятые TSS; в 64х разрядном режиме занимает две записи)

 

 

 

 

 

 

CR0.TS!=0)

63

62

61

60

59

58

57

56

55

54

53

52

51

50

49

48

47

46

45

44

43

42

41

40

 

39

38

37

36

35

34

33

32

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

 

 

 

База сегмента 31…24

G

0

0

AVL

предел 19..16

P

DPL

 

 

0/1

0

B

1

 

База сегмента 23…16

 

 

 

 

База сегмента 15 … 0

 

 

 

 

 

 

 

 

Предел сегмента 15 … 0

 

 

 

 

08

авария

двойная ошибка

 

 

 

 

 

 

 

 

 

- - - 0 - - -

 

 

 

 

 

 

 

 

 

 

0

0

0

0

 

 

 

- - - 0 - - -

 

 

 

 

 

 

 

 

 

 

 

 

 

 

База сегмента 63 … 32

 

 

 

 

 

 

 

 

 

 

 

 

09

авария

авария сопроцессора 386/387

Дескриптор LDT (№2; в 64х разрядном режиме занимает две записи)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0A

ошибка

недопустимый TSS

63 62 61 60 59 58 57 56

55

54

53

52 51 50 49 48

47

46

45

44

43

42

41

40

 

39 38 37 36 35 34 33 32 31 30 29 28

27 26 25 24 23 22 21 20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

0B

ошибка

сегмент отсутствует

 

База сегмента 31…24

0

0

0

AVL

- - - 0 - - -

P

DPL

 

0

0

0

1

0

 

База сегмента 23…16

 

 

 

 

База сегмента 15 … 0

 

 

 

 

 

 

 

 

Предел сегмента 15 … 0

 

 

 

 

0C

ошибка

ошибка в сегменте стека

 

 

 

 

 

 

 

 

 

- - - 0 - - -

 

 

 

 

 

 

 

 

 

 

0

0

0

0

 

 

 

- - - 0 - - -

 

 

 

 

 

 

 

 

 

 

 

 

 

 

База сегмента 63 … 32

 

 

 

 

 

 

 

 

 

 

 

 

0D

ошибка

общий (неспецифичный) сбой

 

Дескриптор вентиля прерывания или

 

ловушки

 

 

(№№6,14 —

вентили прерывания; №№7,15 — вентили ловушки;

 

 

 

 

 

 

 

защиты

в 64х разрядном режиме занимают две записи)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0E

ошибка

ошибка обращения к странице

63 62

61

60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45

44

43

42

41

40

 

39

38

37

36

35

34 33 32 31 30 29 28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

0F

-

(резерв)

 

 

 

 

Смещение цели 31 … 16

 

 

 

P

DPL

0

0/1

1

1

T

 

- - - 0 - - -

 

000/IST

 

 

 

 

 

Селектор цели

 

 

 

 

 

 

 

 

 

Смещение цели 15 … 0

 

 

 

 

10

ошибка

ошибка операции FPU/MMX

 

 

 

 

 

 

 

 

 

- - - 0 - - -

 

 

 

 

 

 

 

 

0

0

0

0

0

 

 

 

- - - 0 - - -

 

 

 

 

 

 

 

 

 

 

 

 

 

Смещение цели 63 … 32

 

 

 

 

 

 

 

 

 

 

 

11

ошибка

сбой проверки выравнивания

Дескриптор вентиля вызова (№№4,12; в 64х разрядном режиме занимает две записи)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

адресов

 

63 62

61

60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45

 

44

43

42

41

40

 

39

38

37

36

35

34

33

32

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

12

авария

сбой машинной проверки (ЦПУ

 

 

 

 

Смещение цели 31 … 16

 

 

 

P

DPL

 

 

0/1

1

0

 

0

- - - 0 - - -

Счетчик слов

 

 

 

 

 

Селектор цели

 

 

 

 

 

 

 

 

 

Смещение цели 15 … 0

 

 

 

 

 

 

или шины)

 

 

 

 

 

 

 

 

 

- - - 0 - - -

 

 

 

 

 

 

 

 

 

0

0

0

0

0

 

 

 

- - - 0 - - -

 

 

 

 

 

 

 

 

 

 

 

 

 

Смещение цели 63 … 32

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

13

ошибка

ошибка SIMD операции (SSE)

Дескриптор вентиля задачи (№5)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14

-

(резерв)

 

63

62

61

60

59

58

57

56

55

54

53

52

51

50

49

48

47

46

45

44

43

42

41

40

 

39

38

37

36

35

34

33

32

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

…

...

--»--»--

 

 

 

 

 

 

 

- - - 0 - - -

 

 

 

 

 

 

P

DPL

0

0

1

0

1

 

 

 

- - - 0 - - -

 

 

 

 

 

 

 

Селектор TSS

 

 

 

 

 

 

 

 

 

 

 

- - - 0 - - -

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1F

-

(резерв)

Примечания к форматам дескрипторов:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- дескрипторы i80286 описывают сегменты с 24х разрядной базой и 16ти разрядным пределом. Дескриптор занимает 8 байт. В зависимости от причины возникновения

- дескрипторы i80386+ описывают сегменты с 32х разрядным базовым адресом и 32х разрядным пределом. Для сегментов

 

прерывания (инструкция INT, внешний

 

менее 1М размер задается в байтах, для сегментов от 1М до 4Г — в страницах по 4К. Дескриптор занимает 8 байт.

 

 

 

 

сигнал, внутренняя причина) их делят на

Примечания к типам системных дескрипторов:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ловушки, ошибки и аварии.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В случае ошибок, связанных со

- тип 0 запрещен в IA-32; в x64 маркирует старшие 8 байт 16ти байтового дескриптора.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- типы 1,3,4,6,7 обозначают 16ти разрядные дескрипторы i80286 (размер/смещение 16 бит, база 24 бита).

 

 

 

 

 

 

 

 

 

 

срабатыванием защиты, в стек фрейма

- типы 2,9,11,12,14.15 обозначают в IA-32 8ми байтовые дескрипторы, а в x64 — 16ти байтовые.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

обработчика прерывания дополнительно

- согласованные сегменты — способ выполнения привилегированного кода с низким уровнем привилегий; вентили —

 

 

 

 

включается код ошибки.

 

механизм смены уровня привилегий.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

По формату код ошибки похож на

Примечания к архитектуре x64:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

обычный селектор, три младших бита

- сегментные регистры SS, DS, ES не используются.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

которого имеют смысл: TI, IDT (отличие

- для сегмента кода используются только атрибуты.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

селектора шлюза таблицы прерываний от

- используется FLAT модель, в которой сегменты CS,SS,DS и ES имеют предел 264 и базовый адрес 0.

 

 

 

 

 

 

 

 

 

 

 

дескриптора GDT/LDT) и EXT (признак

- FS и GS используют только 32х битовую базу; предел не проверяется; 64х битовая база невидимой части регистра

 

 

 

 

ошибки, вызванной внешним

 

проецируется на MSR регистры IA32_FS_BASE, IA32_GS_BASE, IA32_KERNEL_GS_BASE.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

оборудованием).

- загрузка сегментных регистров считывает дескриптор как в IA-32, но невидимая часть регистров не используется.

 

 

 

 

 

Извлечение из стека кода ошибки до IRET

- дескрипторы x64 описывают системные сегменты с 64х разрядной базой; дескриптор длиной 16 байт (128 бит) занимает — обязанность обработчика. две последовательных записи в таблице; старшая часть находится в следующей записи с типом 0.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]