| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- #ifndef __KERNEL_INTERRUPT_H
- #define __KERNEL_INTERRUPT_H
- #include "stdint.h"
- #include "global.h"
- #define IDT_DESC_CNT 0x21 // 目前支持的中断数
- #define PIC_M_CTRL 0x20 // 主片的控制端口是 0x20
- #define PIC_M_DATA 0x21 // 主片的数据端口是 0x21
- #define PIC_S_CTRL 0xA0 // 从片的控制端口是 0xA0
- #define PIC_S_DATA 0xA1 // 从片的数据端口是 0xA1
- typedef void *intr_handler;
- /* 中断门描述符结构体 */
- // Example type_attributes values that people are likely to use (assuming DPL is 0):
- // 32-bit Interrupt Gate: 0x8E (p=1, dpl=0b00, type=0b1110 => type_attributes=0b1000_1110=0x8E)
- // 32-bit Trap Gate: 0x8F (p=1, dpl=0b00, type=0b1111 => type_attributes=1000_1111b=0x8F)
- // Task Gate: 0x85 (p=1, dpl=0b00, type=0b0101 => type_attributes=0b1000_0101=0x85)
- typedef struct
- {
- uint16_t offset_low; // 16位 偏移量的低 16 位 (0..15)
- uint16_t selector; // 选择器 acode segment selector in GDT or LDT
- uint8_t dcount; // 置 0
- uint8_t attribute; // 述符类型 (bit 7:0) gate type, dpl, and p fields
- uint16_t offset_high; // 16 位 偏移量的高 16 位 (16..31)
- } __attribute__((packed)) gate_desc;
- static void make_idt_desc(gate_desc *p_gdesc, uint8_t attr, intr_handler function);
- static void itd_desc_init(void);
- void itd_init(void);
- static gate_desc idt[IDT_DESC_CNT]; // 中断描述符表,本质上就是个中断门描述符数组
- // 定义中断处理程序数组.在 kernel.S 中定义的intrXXentry只是中断处理程序的入口,最终调用的是ide_table中的处理程序
- extern intr_handler intr_entry_table[IDT_DESC_CNT];
- // 通用的中断处理函数,一般用在异常出现时的处理
- static void general_intr_handler(uint8_t vec_nr);
- // 完成一般中断处理函数注册及异常名称注册
- static void exception_init(void);
- #endif // __KERNEL_INTERRUPT_H
|