33 lines
1.8 KiB
C
33 lines
1.8 KiB
C
#ifndef IDT_H
|
|
#define IDT_H
|
|
|
|
#include <stdint.h>
|
|
|
|
// Структура одного элемента таблицы 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
|