首页 | 旅游 | 健康 | 时尚 | 下载 | 论坛 | 图文 | 专题 | 地图
资讯 IT人 电脑入门 操作系统 上网 办公 技巧 硬件 软件 网络 图像 多媒体 程序 数据库 网页制作 网站开发 网游 安全 加密 企业

编写操作系统之键盘交互的实现

巧巧读书 2006-06-04   技术论坛

总述

一个操作系统必需要具有交互性。所谓交互性就是指人与计算机之间的一种交流,有两种最基本的交互设备,一是显示器,一是键盘。显示器是计算机用来与人进行交流的,计算机通过显示器来告诉人一些信息,而键盘是人用来与计算机进行交流的,人通过键盘将命令发送给计算机,计算机接受人通过键盘发来的命令,然后进行处理,最后将处理的结果通过显示器告诉人,这样就完成了一次最简单最基本的交互。在本篇中,笔才将从一个编写操作系统的角度去描述操作系统应当怎样处理键盘,让人可以通过键盘与计算机进行交互。在本篇中,我们同样将以pyos做为我们的实验平台,在pyos上实验操作系统对键盘的控制,为了进行本次实验,笔者专门编写了一人非常简单的“推箱子”游戏,当pyos启动后,你可以输入“game(回车)”命令,然后系统就会调入这个游戏,这时,你可以通过上下左右四个方向键进行游戏,游戏结束后,按“ESC”键,可以返回系统内核。所有的这一切你都会从本篇中了解到去怎样实现它。

在本篇中,pyos实现了类似windows的一个消息系统,换句话说,此处的pyos是由消息驱动的,如果你能windows的消息驱动很好奇,但又不知它是怎样实现的,那么,本篇中所介绍的pyos的消息驱动或许能对你理解windows消息戏动有些许帮助:)

本篇与前几篇实验报告是一脉相承的,特别是同《保护模式下中断编程》一篇有较为紧密的相关性,你可以在“纯C论坛”(http://purec.binghua.com)上的“操作系统实验”专区找到它们,上面的内容对理解本篇会具有较大帮助。

pyos的编写过程中,得到了许多朋友的大力支持与帮助,中国安天实验室张栗炜老师指出了pyos中存在的一些问题,并给出了怎样完全在windows环境下进行pyos开发的方法,哈尔滨工业大学的kylixsun本实现中曾经出现的奇怪现象提出了非常好的意见,极大的扩展了笔者的思路及眼界,pineapplelizhenguo为本实验的调试花费了许多精力……

还有许多朋友给我发来电子邮件及在QQ上留言,帮助并支持笔者进行实验,无法一一列举,仅在此对上述关心pyos的朋友致以最真诚的谢意与问候!

?? Ok,言归正传,下面就让我们开始我们的实验,Lets Go!~~

?

键盘驱动简介

CPU对外部设备的管理是通过中断程序进行的,键盘也是一种外部设备,因此,CPU对键盘的管理也是通过中断进行的。当你击打键盘的时候,键盘控制器会向CPU提出中断申请,CPU响应此中断进行处理,这就完成了一次很简单与人之间通过键盘进行的交互。

有关键盘的详情的硬件控制说明,大家可以在纯C论坛上找到一篇名为《PS/2键盘控制》的文章,这篇文章里非常详细描述了有关键盘的硬件控制。由于本文旨在从操作系统的角度描述操作系统怎样通过键盘与人进行交互,因此,并不打算详细而完整的描述对键盘控制器的控制方法,如果你想了解对键盘的更多控制细节,比如设定键盘响应时间,重复键频率,键盘自检等,你会在《PS/2键盘控制》中找到所有的内容。这里,仅就pyos所用到的一些细节进行简单的介绍,因为,pyos是一个很简单的系统。J

从上面的描述中我们可以看到,键盘有许多属性比如说响应时间,重复频率等需要进行设置,不过比较幸运的是,在计算机被引导后,BIOS已经将这一切为我们做好了,如果你不需要很特别的应用,使用BIOS为我们设定的默认值对于pyos这样的系统来说是足够了,因此,我很乐意在这里将BIOS进行的设置称之为键盘初始化,由于BIOS的运行是在操作系统运行之前进行的,因此,当操作系统被调入内存并运行时键盘已经完成了初始化,这个时候键盘就处于等待用户输入的状态。在前面几篇中我们知道,键盘中断是连结在计算机内部8259A中断控制器的IRQ1号线上,当有按键发生时键盘控制器将会在IRQ1号线上送出中断信号,8259A中断控制器将此中断信号与其它外部设备通过其余的IRQ线送来的中断信号进行判优、排队,最后,将此信息送给CPUCPU在一条指令运行结束后,会查询一下是否有中断信号送来,如果此时发现有中断信号送来,就会通过此中断信号的中断向量在中断描述符表中查询应当使用哪一个中断处理程序。当找到中断处理程序后,CPU将调用此中断处理程序进行中断处理,完成中断处理后,CPU再返回到原来被中断的程序处继续执行。有关8259A的初始化,中断向量及中断向量表的初始化的问题在上一篇实验报告〈〈保护模式下的8259A芯片编程及中断处理探究〉〉中已经详细描述过了,这里就不在多费口舌了。现在我们只需要知道,CPU通过8259A发送来的键盘中断的中断向量号,在中断向量表中调入了键盘中断程序进行键盘中断的处理。下面我们将集中精力,来看看键盘中断程序到底都完成了些什么事情。

?

键盘中断程序概述

键盘中断程序到底要完成些什么事儿,这完全不是固定的。不同的系统对它的各个功能模块所需要完成的工作有不同的划分,不过对于键盘中断程序,它所必须完成的任务就是要告诉系统键盘上到底什么键被按下了,这是通过读取键盘控制器的一个端口完成的。

键盘上的每一个键都有两个唯一的数值进行标志。为什么要用两个数值而不是一个数值呢?这是因为一个键可以被按下,也可以被释放。当一个键按下时,它们产生一个唯一的数值,当一个键被释放时,它也会产生一个唯一的数值,我们把这些数值都保存在一张表里面,到时候通过查表就可以知道是哪一个键被敲击,并且可以知道是它是被按下还是被释放了。这些数值在系统中被称为键盘扫描码,而这张供查询用的表就被称为键盘扫描码集。最早的键盘键数较少,而现在的键盘键数比以前多了不少,键盘键数的变化也引起了扫描码的变化,历史上产生过三种键盘扫描码集,分别标记为Set 1Set 2Set 3它们并没有什么本质的不同,而区别只在于:对于键盘上的同一个键,所带表的扫描码不一样罢了。现代键盘常常使用Set 2,但是为了兼容以前的老式键盘,BIOS在启动的时候自动将键盘控制器设置为工作在Set 1模式下,因此键盘控制器会自动翻译由键盘数据线送来的扫描码,将它有Set 2中的码转换成Set 1中的码。因此,传给CPU或说操作系统的就是Set 1中的扫描码了,当然我们完全可以给键盘控制器发送命令,让它不进行这样的转换,不过这仿佛没有什么必要。下面,我们就来看看Set 1中的键盘扫描码:

Set 1 键盘扫描码

按下码

释放码

-----

按下码

释放码

-----

按下码

释放码

A

1E

9E

?

9

0A

8A

?

[

1A

9A

B

30

B0

?

`

29

89

?

INSERT

E0,52

E0,D2

C

2E

AE

?

-

0C

8C

?

HOME

E0,47

E0,97

D

20

A0

?

=

0D

8D

?

PG UP

E0,49

E0,C9

E

12

92

?

\

2B

AB

?

DELETE

E0,53

E0,D3

F

21

A1

?

BKSP

0E

8E

?

END

E0,4F

E0,CF

G

22

A2

?

SPACE

39

B9

?

PG DN

E0,51

E0,D1

H

23

A3

?

TAB

0F

8F

?

U ARROW

E0,48

E0,C8

I

17

97

?

CAPS

3A

BA

?

L ARROW

本类最热图文
巧巧读书图文推荐
Google