Skip to content

13 中断初始化trap init:你的键盘是何时生效的?

你好,我是闪客。

上一讲我们说到管理内存前划分出的三个边界值,以及主内存初始化函数 mem_init,也算是迈出了main 函数的第一步。

这一讲我们要来探索“中断”隐藏的奥秘,建立一个中断描述符表 idt,来管理各种中断

trap_init 方法

话不多说,我们先看一个方法。

// init/main.c
void main(void) {
    ...
    trap_init();
    ...
}

这个方法是干嘛的?不着急,先来听我抛出一个问题。

当你的计算机刚刚启动时,你按下键盘是没有任何效果的,但是过了一段时间后,再按下键盘就有效果了,也就是计算机会给出反应,最简单的反应就是直接将键盘字符显示在屏幕上。

那我们今天就来刨根问底一下,到底过了多久之后,按下键盘才有效果呢?我们带着这个问题,打开 trap_init 方法看一看。

// kernel/traps.c
void trap_init(void) {
    int i;
    set_trap_gate(0,&divide_error);
    set_trap_gate(1,&debug);
    set_trap_gate(2,&nmi);
    set_system_gate(3,&int3);   /* int3-5 can be called from all */
    set_system_gate(4,&overflow);
    set_system_gate(5,&bounds);
    set_trap_gate(6,&invalid_op);
    set_trap_gate(7,&device_not_available);
    set_trap_gate(8,&double_fault);
    set_trap_gate(9,&coprocessor_segment_overrun);
    set_trap_gate(10,&invalid_TSS);
    set_trap_gate(11,&segment_not_present);
    set_trap_gate(12,&stack_segment);
    set_trap_gate(13,&general_protection);
    set_trap_gate(14,&page_fault);
    set_trap_gate(15,&reserved);
    set_trap_gate(16,&coprocessor_error);
    for (i=17;i<48;i++)
        set_trap_gate(i,&reserved);
    set_trap_gate(45,&irq13);
    set_trap_gate(39,&parallel_interrupt);
}