Skip to main content

proka_kernel/interrupts/
idt.rs

1use crate::interrupts::gdt;
2use crate::interrupts::handler;
3use crate::interrupts::pic::{PIC_1_OFFSET, PIC_2_OFFSET}; // 导入 PIC 相关常量和全局 PICS
4use lazy_static::lazy_static;
5use x86_64::structures::idt::InterruptDescriptorTable;
6// 定义 PIC 相关的中断向量数量
7#[allow(dead_code)]
8pub const PICS_EVT_COUNT: u8 = 16; // IRQ0到IRQ15,共16个中断
9pub const SPURIOUS_APIC_VECTOR: u8 = 0xFF; // APIC 伪中断向量
10
11lazy_static! {
12    pub static ref IDT: InterruptDescriptorTable = {
13        let mut idt = InterruptDescriptorTable::new();
14        // Spurious Interrupt Handler
15        idt[SPURIOUS_APIC_VECTOR].set_handler_fn(handler::spurious_interrupt_handler);
16
17        // 无错误码异常设置
18        idt.divide_error.set_handler_fn(handler::divide_error_handler);
19        idt.debug.set_handler_fn(handler::debug_handler);
20        idt.non_maskable_interrupt.set_handler_fn(handler::nmi_handler);
21        idt.breakpoint.set_handler_fn(handler::breakpoint_handler);
22        idt.overflow.set_handler_fn(handler::overflow_handler);
23        idt.bound_range_exceeded.set_handler_fn(handler::bound_range_handler);
24        idt.invalid_opcode.set_handler_fn(handler::invalid_opcode_handler);
25        idt.device_not_available.set_handler_fn(handler::device_not_available_handler);
26        idt.x87_floating_point.set_handler_fn(handler::x87_floating_point_handler);
27        // 有错误码异常设置
28        idt.invalid_tss.set_handler_fn(handler::invalid_tss_handler);
29        idt.segment_not_present.set_handler_fn(handler::segment_not_present_handler);
30        idt.stack_segment_fault.set_handler_fn(handler::stack_segment_handler);
31        idt.general_protection_fault.set_handler_fn(handler::general_protection_handler);
32        idt.alignment_check.set_handler_fn(handler::alignment_check_handler);
33        idt.cp_protection_exception.set_handler_fn(handler::control_protection_handler);
34        // 特殊异常设置
35        idt.page_fault.set_handler_fn(handler::pagefault_handler);
36        idt.machine_check.set_handler_fn(handler::machine_check_handler);
37        unsafe {
38            idt.double_fault
39                .set_handler_fn(handler::double_fault_handler)
40                .set_stack_index(gdt::DOUBLE_FAULT_IST_INDEX);
41        }
42        // PIC 中断处理器设置
43        // IRQ0 - 时钟中断, IRQ1 - 键盘中断
44        idt[PIC_1_OFFSET].set_handler_fn(handler::pic_interrupt_handler_0); // IRQ0
45        idt[PIC_1_OFFSET + 1].set_handler_fn(handler::pic_interrupt_handler_1); // IRQ1
46        idt[PIC_1_OFFSET + 2].set_handler_fn(handler::pic_interrupt_handler_2); // IRQ2
47        idt[PIC_1_OFFSET + 3].set_handler_fn(handler::pic_interrupt_handler_3); // IRQ3
48        idt[PIC_1_OFFSET + 4].set_handler_fn(handler::pic_interrupt_handler_4); // IRQ4
49        idt[PIC_1_OFFSET + 5].set_handler_fn(handler::pic_interrupt_handler_5); // IRQ5
50        idt[PIC_1_OFFSET + 6].set_handler_fn(handler::pic_interrupt_handler_6); // IRQ6
51        idt[PIC_1_OFFSET + 7].set_handler_fn(handler::pic_interrupt_handler_7); // IRQ7
52        idt[PIC_2_OFFSET].set_handler_fn(handler::pic_interrupt_handler_8);   // IRQ8
53        idt[PIC_2_OFFSET + 1].set_handler_fn(handler::pic_interrupt_handler_9);   // IRQ9
54        idt[PIC_2_OFFSET + 2].set_handler_fn(handler::pic_interrupt_handler_10);  // IRQ10
55        idt[PIC_2_OFFSET + 3].set_handler_fn(handler::pic_interrupt_handler_11);  // IRQ11
56        idt[PIC_2_OFFSET + 4].set_handler_fn(handler::pic_interrupt_handler_12);  // IRQ12
57        idt[PIC_2_OFFSET + 5].set_handler_fn(handler::pic_interrupt_handler_13);  // IRQ13
58        idt[PIC_2_OFFSET + 6].set_handler_fn(handler::pic_interrupt_handler_14);  // IRQ14
59        idt[PIC_2_OFFSET + 7].set_handler_fn(handler::pic_interrupt_handler_15);  // IRQ15
60        idt
61    };
62}
63pub fn init_idt() {
64    IDT.load();
65}