📄 interrupt.h
字号:
/* 中断处理 */
/* 定义段描述符的结构 */
typedef struct
{
unsigned long dword0;
unsigned long dword1;
} segment_desc;
extern void keyboard_interrupt();
/* 中断描述符表初始化函数 */
void InitInterrupt()
{
segment_desc idt[256]; /* 中断号 0~255 */
unsigned long idt_desc[2];
unsigned long idt_addr;
unsigned long keyboard_addr;
unsigned long idt_offset = 0x8; /* IDT 在 GDT 中的位置 */
// 发送4个ICW
outportb(0x20, 0x11);
outportb(0xA0, 0x11);
outportb(0x21, 0x20);
outportb(0xA1, 0x28);
outportb(0x21, 0x4); // 在Inter出产的硬件中,PIC之间的联系
outportb(0xA1, 0x2); // 是把PIC1的IRQ2同PIC2的IRQ1联系起来
outportb(0x21, 0x1);
outportb(0xA1, 0x1);
// 下面设定中断屏蔽字,只许可键盘中断
outportb(0x21, 0xFD);
outportb(0xA1, 0xFF);
keyboard_addr = (unsigned long)keyboard_interrupt; /* 键盘中断处理程序的位置 */
idt[0x21].dword0 = (keyboard_addr & 0xffff) | (idt_offset << 16);
idt[0x21].dword1 = (keyboard_addr & 0xffff0000) | 0x8e00;
idt_addr = (unsigned long)idt;
idt_desc[0] = 0x800 + ((idt_addr & 0xffff) << 16);
idt_desc[1] = idt_addr >> 16;
__asm__("lidt %0\n" "sti" : "=m"(idt_desc)); /* 载入 IDT 表 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -