操作系统开发系列—12.g.在内核中设置键盘中断

8259A虽然已经设置完成,但是我们还没有真正开始使用它呢。

所有的中断都会触发一个函数spurious_irq(),这个函数的定义如下:

PUBLIC void spurious_irq(int irq)
{
disp_str("spurious_irq: ");
disp_int(irq);
disp_str("\n");
}

spurious_irq()其实什么也不做,仅仅是把IRQ号打印出来而已。

其实现在已经可以make并运行了,但是不会有什么效果,因为我们不但没有通过任何方式设置IF位,而且在init_8259A()中把所有中断都屏蔽掉了。

	/* Master 8259, OCW1.  */
out_byte(INT_M_CTLMASK, 0xFD); /* Slave 8259, OCW1. */
out_byte(INT_S_CTLMASK, 0xFF);

以上代码为打开键盘中断,在这里,我们向主8259A相应端口写入了0xFD,由于0xFD对应的二进制是11111101,于是键盘中断被打开,而其他中断仍然处于屏蔽状态。最后,在kernel.asm中添加sti指令设置IF位:

csinit:
sti
hlt

make并运行:

操作系统开发系列—12.g.在内核中设置键盘中断

当敲击键盘的任意键时,字符串“spurious_irq:0x1”就出现了,表明当前的IRQ号为1,正是对应的键盘中断。

操作系统开发系列—12.g.在内核中设置键盘中断

源码

上一篇:jq中数组应用的错误


下一篇:代码的坏味道(5)——数据泥团(Data Clumps)