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这个表或者我们直接称为数组吧,这个是干嘛的,这个放哪里?带着这些疑问,我们继续。
首先明确一个前提,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这个表或者我们直接称为数组吧,这个是干嘛的,这个放哪里?带着这些疑问,我们继续。
相关文章推荐
- 第二人生的源码分析(二十三)人物行走的键盘消息处理
- 第二人生的源码分析(二十四)人物向前走的键盘消息处理
- 第二人生的源码分析(二十四)人物向前走的键盘消息处理
- 第二人生的源码分析(二十四)人物向前走的键盘消息处理
- 蔡军生先生第二人生的源码分析(二十三)人物行走的键盘消息处理
- 蔡军生先生第二人生的源码分析(二十四)人物向前走的键盘消息处理
- 第二人生的源码分析(二十三)人物行走的键盘消息处理
- 第二人生的源码分析(二十三)人物行走的键盘消息处理
- hadoop源码解析之hdfs写数据全流程分析---客户端处理
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- SoundTouch音频处理库源码分析及算法提取(4)
- jQuery-1.9.1源码分析系列(十六)ajax——ajax处理流程以及核心函数
- TOMCAT源码分析(消息处理)
- Tomcat源码分析(四)------ Request和Response处理的全过程
- jQuery源码分析-10事件处理-Event-DOM-ready
- Kubernetes controller-manager中deployment处理流程源码分析
- Android部分开源项目源码分析之--ListView 图片顶部模糊的高斯处理
- 源码分析异步消息处理线程机制(Looper MessageQueue Handler Message)
- 第二人生的源码分析(四十二)实现消息处理的线程类
- android的frameworks层键盘事件处理流程分析