zoukankan      html  css  js  c++  java
  • 操作系统开发系列—12.g.在内核中设置键盘中断

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

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

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

    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并运行:

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

    源码

  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/joey-hua/p/5421692.html
Copyright © 2011-2022 走看看