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,正是对应的键盘中断。

    源码

  • 相关阅读:
    搭建基于nginx-rtmp-module的流媒体服务器
    mysql length和char_length
    mediainfo使用
    linux下ftp服务器搭建
    排序算法
    设计模式之注册树模式
    dock
    linux下安装使用tar
    linux下安装rar
    linux 内存操作相关命令
  • 原文地址:https://www.cnblogs.com/joey-hua/p/5421692.html
Copyright © 2011-2022 走看看