Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Таблица дескрипторов прерываний (IDT) — это структура данных, используемая архитектурой x86 для реализации таблицы векторов прерываний. IDT используется процессором для определения корректной реакции на прерывания и исключения. Детали, описанные ниже, относятся конкретно к архитектуре x86. Другие архитектуры могут иметь аналогичные структуры данных, но их поведение может отличаться. Обращение к IDT инициируется тремя типами событий: аппаратными прерываниями, программными прерываниями и исключениями процессора, которые в совокупности называются прерываниями. IDT состоит из 256 векторов прерываний, первые 32 (от 0 до 31 или от 0x00 до 0x1F) из которых зарезервированы для исключений процессора.
The interrupt descriptor table (IDT) is a data structure used by the x86 architecture to implement an interrupt vector table. The IDT is used by the processor to determine the correct response to interrupts and exceptions. The details in the description below apply specifically to the x86 architecture. Other architectures have similar data structures, but may behave differently. Use of the IDT is triggered by three types of events: hardware interrupts, software interrupts, and processor exceptions, which together are referred to as interrupts. The IDT consists of 256 interrupt vectors–the first 32 (0–31 or 0x00–0x1F) of which are used for processor exceptions.
Реальный режим
В реальном режиме таблица прерываний называется IVT (таблица векторов прерываний). Вплоть до процессора 80286, IVT всегда располагалась по одному и тому же адресу в памяти, от 0x0000 до 0x03ff, и состояла из 256 указателей на код и данные. Аппаратные прерывания могут быть привязаны к любому из векторов посредством программируемого контроллера прерываний. Начиная с процессора 80286, размер и расположение IVT можно изменять тем же способом, что и для IDT (таблица дескрипторов прерываний) в защищенном режиме (то есть с помощью инструкции LIDT (регистр загрузки таблицы дескрипторов прерываний)), хотя это не изменяет её формат.
In real mode, the interrupt table is called IVT (interrupt vector table). Up to the 80286, the IVT always resided at the same location in memory, ranging from 0x0000 to 0x03ff, and consisted of 256 far pointers. Hardware interrupts may be mapped to any of the vectors by way of a programmable interrupt controller. On the 80286 and later, the size and locations of the IVT can be changed in the same way as it is done with the IDT (Interrupt descriptor table) in protected mode (i. e., via the LIDT (Load Interrupt Descriptor Table Register) instruction) though it does not change the format of it.
Прекращение работы BIOS
BIOS обеспечивает простой доступ в реальном режиме к части аппаратных средств посредством регистрации обработчиков прерываний. Они вызываются как программные прерывания с помощью ассемблерной инструкции INT, а параметры передаются через регистры. Эти прерывания используются для выполнения различных задач, таких как определение конфигурации системной памяти, настройка видеовыхода VGA и режимов, а также доступ к диску на ранних этапах процесса загрузки.
The BIOS provides simple real mode access to a subset of hardware facilities by registering interrupt handlers. They are invoked as software interrupts with the INT assembly instruction and the parameters are passed via registers. These interrupts are used for various tasks like detecting
the system memory layout, configuring VGA output and modes, and accessing the disk early in the boot process.
Защищенный и длительный режим
IDT представляет собой массив дескрипторов, последовательно хранящихся в памяти и индексируемых по номеру вектора. Не обязательно использовать все возможные записи: достаточно заполнить таблицу до самого высокого используемого вектора прерывания и соответствующим образом установить поле длины IDT. Регистр IDTR используется для хранения как линейного базового адреса, так и лимита (длина в байтах минус 1) IDT. При возникновении прерывания процессор умножает номер вектора прерывания на размер записи (8 для защищенного режима, 16 для длинного режима) и добавляет результат к базовому адресу IDT. Если адрес находится в пределах таблицы, проверяется DPL, и прерывание обрабатывается в зависимости от типа шлюза. Дескрипторы могут быть шлюзами прерываний, шлюзами ловушек или, только для 32-битного защищенного режима, шлюзами задач. Шлюзы прерываний и шлюзы ловушек указывают на местоположение в памяти, содержащее код для выполнения, определяя как сегмент (присутствующий в GDT или LDT), так и смещение внутри этого сегмента. Единственное различие между шлюзами ловушек и шлюзами прерываний заключается в том, что шлюзы прерываний отключают дальнейшую обработку процессором маскируемых аппаратных прерываний, что делает их подходящими для обработки аппаратных прерываний (в то время как шлюзы ловушек полезны для обработки программных прерываний и исключений). Шлюз задачи приводит к переключению текущего активного сегмента состояния задачи, используя аппаратный механизм переключения задач для эффективной передачи управления процессором другой программе, потоку или процессу.
The IDT is an array of descriptors stored consecutively in memory and indexed by the vector number. It is not necessary to use all of the possible entries: it is sufficient to populate the table up to the highest interrupt vector used, and set the IDT length portion of the accordingly. The IDTR register is used to store both the linear base address and the limit (length in bytes minus 1) of the IDT. When an interrupt occurs, the processor multiplies the interrupt vector by the entry size (8 for protected mode, 16 for long mode) and adds the result to the IDT base address. If the address is inside the table, the DPL is checked and the interrupt is handled based on the gate type. The descriptors may be either interrupt gates, trap gates or, for 32 bit protected mode only, task gates. Interrupt and trap gates point to a memory location containing code to execute by specifying both a segment (present in either the GDT or LDT) and an offset within that segment. The only difference between trap and interrupt gates is that interrupt gates will disable further processor handling of maskable hardware interrupts, making them suitable to handle hardware generated interrupts (conversely, trap gates are useful for handling software interrupts and exceptions). A task gate will cause the currently active task state segment to be switched, using the hardware task switch mechanism to effectively hand over use of the processor to another program, thread or process.
Зацепка
Некоторые программы Windows перехватывают вызовы в IDT. Это предполагает разработку драйвера в режиме ядра, который перехватывает вызовы к IDT и добавляет собственную обработку. Microsoft никогда официально не поддерживала это, но не препятствовала этому программно в своих операционных системах до 64-битных версий Windows, где попытка использования драйвером перехватчика в режиме ядра приводит к сбою системы (BSOD).
Some Windows programs hook calls to the IDT. This involves writing a kernel mode driver that intercepts calls to the IDT and adds in its own processing. This has never been officially supported by Microsoft, but was not programmatically prevented on its operating systems until 64 bit versions of Windows, where a driver that attempts to use a kernel mode hook will cause the machine to bug check.