13 中断初始化trap init:你的键盘是何时生效的?
你好,我是闪客。
上一讲我们说到管理内存前划分出的三个边界值,以及主内存初始化函数 mem_init,也算是迈出了main 函数的第一步。
这一讲我们要来探索“中断”隐藏的奥秘,建立一个中断描述符表 idt,来管理各种中断。
trap_init 方法
话不多说,我们先看一个方法。
这个方法是干嘛的?不着急,先来听我抛出一个问题。
当你的计算机刚刚启动时,你按下键盘是没有任何效果的,但是过了一段时间后,再按下键盘就有效果了,也就是计算机会给出反应,最简单的反应就是直接将键盘字符显示在屏幕上。
那我们今天就来刨根问底一下,到底过了多久之后,按下键盘才有效果呢?我们带着这个问题,打开 trap_init 方法看一看。
// kernel/traps.c
void trap_init(void) {
int i;
set_trap_gate(0,÷_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,¶llel_interrupt);
}