⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt.h

📁 国内的一个小型操作系统
💻 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 + -