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.在内核中设置键盘中断

 

 

源码

相关文章:

  • 2021-07-24
  • 2021-09-19
  • 2021-06-27
  • 2021-09-24
  • 2022-01-16
  • 2021-11-04
  • 2021-07-13
  • 2021-12-19
猜你喜欢
  • 2021-08-01
  • 2021-09-03
  • 2021-12-28
  • 2022-02-04
  • 2021-11-23
  • 2021-07-03
  • 2021-12-16
相关资源
相似解决方案