#ifndef IDT_H #define IDT_H #include // Структура одного элемента таблицы IDT (8 байт) struct idt_entry { uint16_t base_low; // Младшие 16 бит адреса функции-обработчика uint16_t sel; // Сегментный селектор кода (0x08 — Kernel Code в GDT) uint8_t always0; // Всегда 0, зарезервировано процессором uint8_t flags; // Флаги доступа (0x8E для Ring 0 прерываний) uint16_t base_high; // Старшие 16 бит адреса функции-обработчика } __attribute__((packed)); // Структура «указателя» для инструкции lidt (6 байт) struct idt_ptr { uint16_t limit; // Размер таблицы в байтах минус 1 (256 * 8 - 1) uint32_t base; // Физический адрес начала массива структур idt_entry } __attribute__((packed)); // Структура, передаваемая в Си-обработчик, содержащая состояние всех регистров struct registers { uint32_t ds; // Сегмент данных uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; // Напушено инструкцией pushad uint32_t int_no, err_code; // Номер прерывания и код ошибки (если есть) uint32_t eip, cs, eflags, useresp, ss; // Автоматически пушится процессором }; // Объявляем функции для вызова извне void idt_init(void); void idt_set_gate(uint8_t num, uint32_t base, uint16_t sel, uint8_t flags); #endif