您的位置:首页 > 其它

Geekos源码分析专题:键盘处理

2013-10-27 10:19 323 查看
Geekos源码分析专题:键盘处理
       首先明确一个前提,geekos的内核代码执行在cpu上,数据或者代码数据是在内存中存储执行的。我们如果按下键盘,是怎么让cpu来知道发生这件事,然后如果寻找到对应的中断向量,从而交给对用的中断处理程序来执行键盘的处理的。

       我们看到的键盘是一个块状类似的东西连着一根线,然后我们在接入对应的接口后,就可以使用了。会不会觉得奇怪呢。我们并没有在键盘里面写代码什么,我们装电脑的时候,可能就没有键盘,或者通过在装电脑系统的时候就可以使用键盘了。我是对这个很好奇,一直想知道到底是为什么。

       在geekos的main函数里面有个键盘初始化入口,我们沿着这个入口进入键盘处理模块,

代码如下:

 

/*----------------------------------------------------------------------

 *Public functions

 *---------------------------------------------------------------------- */

 

void Init_Keyboard(void)

{

   ushort_t irqMask;

 

   Print("Initializing keyboard...\n");

 

   /* Start out with no shift keys enabled. */

   s_shiftState = 0;

 

   /* Buffer is initially empty. */

   s_queueHead = s_queueTail = 0;

 

   /* Install interrupt handler */

    Install_IRQ(KB_IRQ,Keyboard_Interrupt_Handler);

 

   /* Enable IRQ1 (keyboard) */

    irqMask = Get_IRQ_Mask();

    irqMask &= ~(1 << KB_IRQ);

    Set_IRQ_Mask(irqMask);

}

主要先看两个地方,其他地方暂时先略过,主要是标红的两个地方。首先来看看    Install_IRQ(KB_IRQ,Keyboard_Interrupt_Handler);这段代码,这里是两个参数,第一个KB_IRQ(include/keyboard.h)中,值为1,即#define KB_IRQ 1,另外一个参数是Keyboard_Interrupt_Handler,从这个字面意义上可以大概猜出是键盘中断处理程序的入口地址,那么这个Install_IRQ就是在键盘处理之间的桥梁了,那么另一端是谁呢?cpu还是别的什么,这个1和中断处理程序之间有什么关系呢,我们可以随便定义这个KB_IRQ吗?

       带着这些疑问,我们进入了install_IRQ这个函数的定义部分,这段函数定义在irq.c的文件中,里面就一行代码:Install_Interrupt_Handler(irq + FIRST_EXTERNAL_INT, handler);

只是处理了KB_IRQ传递过来的参数进行了处理,然后把这两个参数直接会送到另外一个处理函数中了,从这个函数名,我们也好猜测,大概是安装中断处理的意思。我们平时安装程序时也知道,我们通过安装包安装后,通过快捷图标什么的或者命令可以打开某个程序了,比如你在命令行输入winword就可以打开word程序来处理你的文件什么的了。这么我们可以类似推想,大概就是我们的键盘处理程序现在就像这个word应用程序了,我们需要进行安装后,方可使用,这个安装过程具体是怎么回事,我们大概知道是一些程序文件包和一些与系统打交道的配置。这里geekos里面怎么处理键盘的处理和cpu直接的关系的,是安装中断处理,从目前我们所了解的代码来看,我们知道键盘的处理是直接相关的是中断。这里还有一点提到的是,FIRST_EXTERNAL_INT这个参数,这里作为是基的参数,irq是不同的,字面意义大概也是第一个扩展中断什么的,具体现在也不清楚什么含义。待后面在分析吧,下面还是还是先沿着这条路走一段。毕竟目前的主线是,键盘怎么和cup打交道的,我们写的代码怎么知道处理那块代码的,这个是现在的主要问题。

       我们在沿着这个中断安装的函数代码块,进入里面看看怎么回事,这段代码在idt.c文件中,这个函数里面主要是g_interruptTable[interrupt]= handler;这段代码,这个代码说明就很清楚了,一个数组把这两个的关系映射对应起来了。我们大概就清楚了,handler是我们的处理程序,像我们按的是字母键啊,还是数字键啊什么的,我们可以让按字母键显示数字也可以让数字键显示字母,当然随自己愿意吧。不过个人兴趣也就好了,做东西可别这样,不然别人没法理解了。反正大概就是这么个意思。G_interruptTable这个表或者我们直接称为数组吧,这个是干嘛的,这个放哪里?带着这些疑问,我们继续。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  源码分析 键盘