Jump to content

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

Таблица дескрипторов прерываний ( 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]

См. также

[ редактировать ]
  1. ^ «Исключения — OSDev Wiki» . wiki.osdev.org . Проверено 17 апреля 2021 г.
  2. ^ Фризен, Брэндон. «IRQ и PIC» . Учебное пособие Брана по разработке ядра . Проверено 6 июня 2024 г.
  3. ^ Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32, 20.1.4 Обработка прерываний и исключений
  4. ^ Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32, 6.12.1 Процедуры обработки исключений или прерываний
  5. ^ «Исключения — OSDev Wiki» . wiki.osdev.org . Проверено 17 апреля 2021 г.
  6. ^ Юргенс, Дэвид. «Таблица прерываний, реализованная в BIOS/DOS системы» . Справочная библиотека HelpPC . Проверено 6 июня 2024 г.
  7. ^ «Политика установки исправлений для систем на базе x64» . Майкрософт . Если операционная система обнаружит одну из этих модификаций или любое другое несанкционированное исправление, она выполнит проверку ошибок и завершит работу системы.
Общий
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d705ec697a29821797d57759f81f8e5a__1720029420
URL1:https://arc.ask3.ru/arc/aa/d7/5a/d705ec697a29821797d57759f81f8e5a.html
Заголовок, (Title) документа по адресу, URL1:
Interrupt descriptor table - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)