peredOS/kernel/idt.h
msh356 884b58f304 MULTIPLE: 2 изменения
CHORE: удалено лишнее
ROADMAP: закрыто 2 пункта
2026-07-01 19:18:37 +03:00

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