Таблица дескрипторов прерываний в Linux

Системная таблица, называемая таблицей дескрипторов прерываний, или IDT (Interrupt Descriptor Table), ассоциирует каждый вектор прерывания или исключения с адресом соответствующего обработчика. Таблица дескрипторов прерываний должна быть нужным образом проинициализирована до того, как ядро включит прерывания.
Формат таблицы IDT аналогичен формату таблиц GDT и LDT. Каждая запись соответствует вектору прерывания или исключения и включает в себя 8-байтовый дескриптор. Следовательно, для хранения таблицы дескрипторов прерываний требуется максимум 256 х 8 = 2048 байтов.
Процессорный регистр idtr позволяет разместить таблицу дескрипторов прерываний в любом месте памяти. Он содержит как базовый физический адрес таблицы, так и ее максимальную длину. Регистр должен быть инициализирован с помощью ассемблерной инструкции lidt до включения прерываний.
Таблица дескрипторов прерываний может содержать дескрипторы трех типов. В таблице содержатся следующие дескрипторы:
- дескриптор шлюза задач включает в себя селектор TSS-сегмента процесса, который должен заместить текущий, когда возникнет сигнал прерывания;
- дескриптор шлюза прерываний включает в себя селектор сегмента и смещение внутри сегмента обработчика прерывания или исключения. При передаче управления соответствующему сегменту процессор сбрасывает флаг if, тем самым отключая последующие маскируемые прерывания;
дескриптор шлюза ловушек - аналогичен предыдущему, но при передаче управления нужному сегменту процессор не изменяет флаг if.
Linux использует шлюзы прерываний для обработки прерываний, а шлюзы ловушек - для обработки исключений.