Таблица дескрипторов прерываний
![]() | Эта статья включает список общих ссылок , но в ней отсутствуют достаточные соответствующие встроенные цитаты . ( сентябрь 2013 г. ) |
Таблица дескрипторов прерываний ( IDT ) — это структура данных, используемая архитектурой x86 для реализации таблицы векторов прерываний . IDT используется процессором для определения адресов памяти обработчиков, которые должны выполняться при прерываниях и исключениях .
Подробности в описании ниже относятся конкретно к архитектуре x86. Другие архитектуры имеют схожие структуры данных, но могут вести себя по-другому.
IDT состоит из 256 векторов прерываний , и использование IDT запускается тремя типами событий: исключениями процессора, аппаратными прерываниями и программными прерываниями, которые вместе называются прерываниями :
- Исключения процессора, генерируемые ЦП, имеют фиксированное сопоставление с первыми (до 32) векторами прерываний. [1] Хотя 32 вектора (0x00–0x1f) официально зарезервированы (и многие из них используются в новых процессорах), исходный 8086 использовал только первые пять (0–4) векторов прерываний, а схема IBM PC IDT не учитывала зарезервированный диапазон. .
- Номера векторов аппаратных прерываний соответствуют номерам аппаратных IRQ. например Intel 8259 Точное сопоставление зависит от того, как запрограммирован программируемый контроллер прерываний , . [2] В то время как Intel документирует, что IRQ 0–7 сопоставляется с векторами 0x20–0x27, IBM PC и совместимые компьютеры сопоставляют их с векторами 0x08–0x0F. IRQ 8–15 обычно отображаются на векторы 0x70–0x77.
- Номера векторов программных прерываний определяются конкретной средой выполнения, например IBM PC BIOS, DOS или другими операционными системами. Они запускаются программным обеспечением с помощью инструкции INT (приложениями, драйверами устройств или даже другими обработчиками прерываний). Например, IBM PC BIOS предоставляет видеосервисы по вектору 0x10, MS-DOS предоставляет DOS API по вектору 0x21, а Linux предоставляет интерфейс системных вызовов по вектору 0x80.
Реальный режим
[ редактировать ]В реальном режиме таблица прерываний называется IVT (таблица векторов прерываний). До 80286 IVT всегда находился в одном и том же месте памяти, начиная от 0x0000
к 0x03ff
и состоял из 256 дальних указателей . Аппаратные прерывания могут быть сопоставлены любому из векторов с помощью программируемого контроллера прерываний. На 80286 и более поздних версиях размер и расположение IVT можно изменить так же, как это делается с IDT (таблицей дескрипторов прерываний) в защищенном режиме (т. е. с помощью команды LIDT (загрузить регистр таблицы дескрипторов прерываний)). хотя это не меняет его формат. [3]
прерывания биоса
[ редактировать ]BIOS обеспечивает простой доступ в реальном режиме к подмножеству аппаратных средств путем регистрации обработчиков прерываний. Они вызываются как программное прерывание с помощью ассемблерной инструкции INT , а параметры передаются через регистры. Эти прерывания используются для различных задач, таких как обнаружение структуру системной памяти , настройку вывода и режимов VGA , а также доступ к диску на ранних этапах процесса загрузки.
Защищенный и длительный режим
[ редактировать ]IDT представляет собой массив дескрипторов, последовательно хранящихся в памяти и индексируемых номером вектора. Нет необходимости использовать все возможные записи: достаточно заполнить таблицу до самого высокого используемого вектора прерывания и установить часть длины IDT IDTR
соответственно.
Регистр IDTR используется для хранения как линейного базового адреса, так и предела (длина в байтах минус 1) IDT. Когда происходит прерывание, процессор умножает вектор прерывания на размер записи (8 для защищенного режима, 16 для длинного режима) и добавляет результат к базовому адресу IDT. [4] Если адрес находится внутри таблицы, проверяется DPL и прерывание обрабатывается в зависимости от типа шлюза.
Дескрипторы могут быть либо вентилями прерываний, вентилями ловушек, либо, только для 32-битного защищенного режима, вентилями задач. Ворота прерываний и ловушек указывают на ячейку памяти, содержащую код для выполнения, путем указания сегмента (присутствующего либо в GDT , либо в LDT ), а также смещения внутри этого сегмента. Единственная разница между шлюзами ловушек и прерываний заключается в том, что вентили прерываний отключают дальнейшую обработку процессором маскируемых аппаратных прерываний, что делает их пригодными для обработки аппаратно генерируемых прерываний (и наоборот, вентили прерываний полезны для обработки программных прерываний и исключений). Шлюз задачи вызывает переключение текущего активного сегмента состояния задачи, используя аппаратный механизм переключения задач для эффективной передачи использования процессора другой программе, потоку или процессу.
Общие макеты IDT
[ редактировать ]Официальный макет Intel
[ редактировать ]Все INT_NUM от 0x0 до 0x1F включительно зарезервированы Intel для исключений. [5] INT_NUM больше 0x1F следует использовать для процедур обработки прерываний.
INT_NUM | Тип события | Краткое описание |
---|---|---|
0x00 | Исключение процессора | Деление на ноль |
0x01 | Исключение процессора | Одношаговое прерывание (см. флаг ловушки ) |
0x02 | Исключение процессора | НМИ |
0x03 | Исключение процессора | Точка останова (которая выигрывает от более короткой кодировки 0xCC INT 3) |
0x04 | Исключение процессора | Переполнение |
0x05 | Исключение процессора | Граничный диапазон превышен |
0x06 | Исключение процессора | Неверный код операции |
0x07 | Исключение процессора | Сопроцессор недоступен |
0x08 | Исключение процессора | Двойная ошибка |
0x09 | Исключение процессора | Переполнение сегмента сопроцессора (только 386 или более ранние версии) |
0x0A | Исключение процессора | Неверный сегмент состояния задачи |
0x0B | Исключение процессора | Сегмент отсутствует |
0x0C | Исключение процессора | Ошибка сегмента стека |
0x0D | Исключение процессора | Общая ошибка защиты |
0x0E | Исключение процессора | Ошибка страницы |
0x0F | Исключение процессора | сдержанный |
0x10 | Исключение процессора | Исключение x87 с плавающей запятой |
0x11 | Исключение процессора | Проверка выравнивания |
0x12 | Исключение процессора | Проверка машины |
0x13 | Исключение процессора | Исключение SIMD с плавающей запятой |
0x14 | Исключение процессора | Исключение виртуализации |
0x15 | Исключение процессора | Исключение защиты управления (доступно только с CET ) |
0x16-0x1F | Исключение процессора | сдержанный |
0x20-0x27 | Аппаратное прерывание | прерывание 0–7 |
0x70-0x77 | Аппаратное прерывание | прерывание 8–15 |
Компоновка IBM-ПК
[ редактировать ]IBM PC ( BIOS и среда выполнения MS-DOS ) не соответствует официальной схеме Intel, за исключением первых пяти векторов исключений, реализованных в исходном 8086. Прерывание 5 уже используется для обработки клавиши Print Screen , IRQ 0–7 сопоставлено с INT_NUM. 0x08-0x0F, а BIOS использует большинство векторов в диапазоне 0x10-0x1F как часть своего API. [6]
Зацепка
[ редактировать ]Некоторые Windows программы перехватывают вызовы IDT. Это предполагает написание драйвера режима ядра , который перехватывает вызовы IDT и добавляет собственную обработку. Это никогда официально не поддерживалось Microsoft , но не было программно предотвращено в ее операционных системах до 64-битных версий Windows, где драйвер, который пытается использовать перехват режима ядра , вызывает проверку машины на наличие ошибок . [7]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Исключения — OSDev Wiki» . wiki.osdev.org . Проверено 17 апреля 2021 г.
- ^ Фризен, Брэндон. «IRQ и PIC» . Учебное пособие Брана по разработке ядра . Проверено 6 июня 2024 г.
- ^ Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32, 20.1.4 Обработка прерываний и исключений
- ^ Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32, 6.12.1 Процедуры обработки исключений или прерываний
- ^ «Исключения — OSDev Wiki» . wiki.osdev.org . Проверено 17 апреля 2021 г.
- ^ Юргенс, Дэвид. «Таблица прерываний, реализованная в BIOS/DOS системы» . Справочная библиотека HelpPC . Проверено 6 июня 2024 г.
- ^
«Политика установки исправлений для систем на базе x64» . Майкрософт .
Если операционная система обнаружит одну из этих модификаций или любое другое несанкционированное исправление, она выполнит проверку ошибок и завершит работу системы.
- Общий
Внешние ссылки
[ редактировать ]- Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, том 3A: Руководство по системному программированию, часть 1 (см. ГЛАВУ 5, ОБРАБОТКА ПРЕРЫВАНИЙ И ИСКЛЮЧЕНИЙ, и ГЛАВУ 10, РАСШИРЕННЫЙ ПРОГРАММИРУЕМЫЙ КОНТРОЛЛЕР ПРЕРЫВАНИЙ)]
- Таблица дескрипторов прерываний на OSDev.org