Память компьютера - Программирование - Ответ 11660511

IDT - Interrupt Dispatch Table (диспетчеризация прерываний)

Как и GDT - эта таблица общая для всех задач, и система выделяет для них отдельные сегменты. Обращение к IDT возможно только на аппаратном уровне при возникновении исключений или аппаратных инт'ов. В таблице расписаны номера всех прерываний, которые в P-Mode называют дескрипторами шлюзов. Имеется всего три типа этих шлюзов: шлюз-прерывания 'Int' (точка входа в обработчик прерывания), шлюз-ловушки 'Trap' (адрес обработчиков исключений, как-правило SEH), и шлюз-задачи 'Task' (адреса TSS для переключения задач).

Для наглядности, я рассортировал их здесь по содержимому и уровням привелегий(DPL). В таблице всего 256 записей с макс.номером(FFh). Для каждого INT выделены свои дескрипторы. Между шлюзами прерываний и ловушек много общего, поэтому 'Syser' их не разделяет, хотя шлюз-задачи удостоился от отладчика личной метки (Task).

При генерации прерывания происходит следующее..

1. Из регистра(IDTR) извлекается база таблицы(IDT), в которой по номеру INT определяется дескриптор этого прерывания.

2. Если бит(Р) - 'Present' - в найденном дескрипторе сброшен, значит данное прерывание не обрабатывается системой. В этом случае генерится исключение общей защиты.

3. Если бит(Р=1), то проверяется уровень привилегий (RPL) задачи, запросившей прерывание. RPL должен быть меньше\равно DPL дескриптора прерывания, иначе - опять ошибка. (для исключений и аппаратных прерываний этот пункт игнорируется).

4. Если правила не нарушаются, то происходит переключение стека и в стеке обработчика сохраняется указатель на стек прерванной задачи (SS:ESP). В стек помещаются регистры EFLAGS и CS:EIP. Для некоторых исключений последним в стек помещается ещё и код-ошибки.

5. После обработки прерывания, обработчик должен вытолкнуть из стека код-ошибки (если он там есть), и выполнить инструкцию IRETD, которая восстановит стек и вернёт управление прикладной задаче:

>> idt
IDTBase = 8003F400   Limit = 7FF
-----------------------------------------------------------------
Int   Type      Sel : Offset                 Attributes    Module
0000  IntG32    0008:804DF360                DPL=0 P       ntoskrnl
000E  IntG32    0008:F200A5C0(0008:804E167E) DPL=0 P       Syser(ntoskrnl)
0013  IntG32    0008:804E1CAC(0008:804E18F3) DPL=0 P       ntoskrnl(ntoskrnl)
001F  IntG32    0008:80712FD0(0008:804E18F3) DPL=0 P       hal(ntoskrnl)
00FF  IntG32    0008:804DE4D0                DPL=0 P       ntoskrnl

0002  TaskG     0058:0000113E(0008:804DF5C6) DPL=0 P       (ntoskrnl)
0008  TaskG     0050:00001198(0008:804E06AD) DPL=0 P       (ntoskrnl)
0012  TaskG     00A0:804E18F3                DPL=0 P       ntoskrnl

0001  IntG32    0008:804DF4DB                DPL=3 P       ntoskrnl
0003  IntG32    0008:804DF8AD                DPL=3 P       ntoskrnl
0004  IntG32    0008:804DFA30                DPL=3 P       ntoskrnl
002A  IntG32    0008:804DEBA2                DPL=3 P       ntoskrnl
002B  IntG32    0008:804DECA5                DPL=3 P       ntoskrnl
002C  IntG32    0008:804DEE44                DPL=3 P       ntoskrnl
002D  IntG32    0008:F7ABCF96(0008:804DF78C) DPL=3 P       SDbgMsg(ntoskrnl)
002E  IntG32    0008:804DE631                DPL=3 P       ntoskrnl
002C  IntG32    0008:804DEE44                DPL=3 P       ntoskrnl
002D  IntG32    0008:F7ABCF96(0008:804DF78C) DPL=3 P       SDbgMsg(ntoskrnl)

0020  Reserved  0008:00000000                DPL=0 NP      
..........
0029  Reserved  0008:00000000                DPL=0 NP      

00FC  IntG32    0008:804DE4BB                DPL=0 P       ntoskrnl
00FD  IntG32    0008:80713464(0008:804DE4C2) DPL=0 P       hal(ntoskrnl)
00FE  IntG32    0008:80713604(0008:804DE4C9) DPL=0 P       hal(ntoskrnl)
00FF  IntG32    0008:804DE4D0                DPL=0 P       ntoskrnl

Вернуться к обсуждению:

Память компьютера Программирование