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

上传人:子 文档编号:41906371 上传时间:2018-05-31 格式:DOC 页数:22 大小:59.50KB
返回 下载 相关 举报
编写操作系统之键盘交互的实现_第1页
第1页 / 共22页
编写操作系统之键盘交互的实现_第2页
第2页 / 共22页
编写操作系统之键盘交互的实现_第3页
第3页 / 共22页
编写操作系统之键盘交互的实现_第4页
第4页 / 共22页
编写操作系统之键盘交互的实现_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《编写操作系统之键盘交互的实现》由会员分享,可在线阅读,更多相关《编写操作系统之键盘交互的实现(22页珍藏版)》请在金锄头文库上搜索。

1、编写操作系统之键盘交互的实现编写操作系统之键盘交互的实现GUCAS2008 的专栏条新通知 登录 注册 欢迎 退出 我的博客 配置 写文章 文章管理 博客首页 全站 当前博客 空间 博客 好友 相册 留言 用户操作 留言 发消息 加为好友 李建伟 ID:GUCAS2008共 3757 次访问,排名 2 万外,好友 1 人,关注者 1 人。李建伟的文章原创 12 篇翻译 0 篇转载 8 篇评论 1 篇订阅我的博客 编辑GUCAS2008 的公告 编辑文章分类 存档 2008 年 07 月(7)2008 年 06 月(1)2008 年 04 月(1)2008 年 03 月(11)编写操作系统之键盘

2、交互的实现 收藏 编写操作系统之键盘交互的实现Version 0.01谢煜波http:/QQ:13916830总述一个操作系统必需要具有交互性。所谓交互性就是指人与计算机之间的一种交流,有两种最基本的交互设备,一是显示器,一是键盘。显示器是计算机用来与人进行交流的,计算机通过显示器来告诉人一些信息,而键盘是人用来与计算机进行交流的,人通过键盘将命令发送给计算机,计算机接受人通过键盘发来的命令,然后进行处理,最后将处理的结果通过显示器告诉人,这样就完成了一次最简单最基本的交互。在本篇中,笔才将从一个编写操作系统的角度去描述操作系统应当怎样处理键盘,让人可以通过键盘与计算机进行交互。在本篇中,我们

3、同样将以 pyos 做为我们的实验平台,在 pyos 上实验操作系统对键盘的控制,为了进行本次实验,笔者专门编写了一人非常简单的“推箱子”游戏,当 pyos 启动后,你可以输入“game(回车) ”命令,然后系统就会调入这个游戏,这时,你可以通过上下左右四个方向键进行游戏,游戏结束后,按“ESC”键,可以返回系统内核。所有的这一切你都会从本篇中了解到去怎样实现它。在本篇中,pyos 实现了类似 windows 的一个消息系统,换句话说,此处的 pyos 是由消息驱动的,如果你能 windows 的消息驱动很好奇,但又不知它是怎样实现的,那么,本篇中所介绍的 pyos 的消息驱动或许能对你理解

4、windows 的消息戏动有些许帮助:)本篇与前几篇实验报告是一脉相承的,特别是同保护模式下中断编程一篇有较为紧密的相关性,你可以在“纯 C 论坛”(http:/)上的“操作系统实验”专区找到它们,上面的内容对理解本篇会具有较大帮助。在 pyos 的编写过程中,得到了许多朋友的大力支持与帮助,中国安天实验室的张栗炜老师指出了 pyos 中存在的一些问题,并给出了怎样完全在windows 环境下进行 pyos 开发的方法,哈尔滨工业大学的 kylix,sun 为本实现中曾经出现的奇怪现象提出了非常好的意见,极大的扩展了笔者的思路及眼界,pineapple,lizhenguo 为本实验的调试花费了

5、许多精力还有许多朋友给我发来电子邮件及在 QQ 上留言,帮助并支持笔者进行实验,无法一一列举,仅在此对上述关心 pyos 的朋友致以最真诚的谢意与问候!Ok,言归正传,下面就让我们开始我们的实验,Lets Go!键盘驱动简介CPU 对外部设备的管理是通过中断程序进行的,键盘也是一种外部设备,因此,CPU对键盘的管理也是通过中断进行的。当你击打键盘的时候,键盘控制器会向 CPU 提出中断申请,CPU 响应此中断进行处理,这就完成了一次很简单与人之间通过键盘进行的交互。有关键盘的很详情的硬件控制说明,大家可以在纯 C 论坛上找到一篇名为PS/2 键盘控制的文章,这篇文章里非常详细描述了有关键盘的硬

6、件控制。由于本文旨在从操作系统的角度描述操作系统怎样通过键盘与人进行交互,因此,并不打算详细而完整的描述对键盘控制器的控制方法,如果你想了解对键盘的更多控制细节,比如设定键盘响应时间,重复键频率,键盘自检等,你会在PS/2 键盘控制中找到所有的内容。这里,仅就 pyos 所用到的一些细节进行简单的介绍,因为,pyos 是一个很简单的系统。?从上面的描述中我们可以看到,键盘有许多属性比如说响应时间,重复频率等需要进行设置,不过比较幸运的是,在计算机被引导后,BIOS 已经将这一切为我们做好了,如果你不需要很特别的应用,使用 BIOS 为我们设定的默认值对于 pyos 这样的系统来说是足够了,因此

7、,我很乐意在这里将 BIOS 进行的设置称之为键盘初始化,由于 BIOS 的运行是在操作系统运行之前进行的,因此,当操作系统被调入内存并运行时键盘已经完成了初始化,这个时候键盘就处于等待用户输入的状态。在前面几篇中我们知道,键盘中断是连结在计算机内部 8259A 中断控制器的 IRQ1 号线上,当有按键发生时键盘控制器将会在 IRQ1 号线上送出中断信号,8259A 中断控制器将此中断信号与其它外部设备通过其余的 IRQ 线送来的中断信号进行判优、排队,最后,将此信息送给 CPU。CPU 在一条指令运行结束后,会查询一下是否有中断信号送来,如果此时发现有中断信号送来,就会通过此中断信号的中断向

8、量在中断描述符表中查询应当使用哪一个中断处理程序。当找到中断处理程序后,CPU 将调用此中断处理程序进行中断处理,完成中断处理后,CPU 再返回到原来被中断的程序处继续执行。有关 8259A 的初始化,中断向量及中断向量表的初始化的问题在上一篇实验报告保护模式下的 8259A 芯片编程及中断处理探究 中已经详细描述过了,这里就不在多费口舌了。现在我们只需要知道,CPU 通过 8259A 发送来的键盘中断的中断向量号,在中断向量表中调入了键盘中断程序进行键盘中断的处理。下面我们将集中精力,来看看键盘中断程序到底都完成了些什么事情。键盘中断程序概述键盘中断程序到底要完成些什么事儿,这完全不是固定的

9、。不同的系统对它的各个功能模块所需要完成的工作有不同的划分,不过对于键盘中断程序,它所必须完成的任务就是要告诉系统键盘上到底什么键被按下了,这是通过读取键盘控制器的一个端口完成的。键盘上的每一个键都有两个唯一的数值进行标志。为什么要用两个数值而不是一个数值呢?这是因为一个键可以被按下,也可以被释放。当一个键按下时,它们产生一个唯一的数值,当一个键被释放时,它也会产生一个唯一的数值,我们把这些数值都保存在一张表里面,到时候通过查表就可以知道是哪一个键被敲击,并且可以知道是它是被按下还是被释放了。这些数值在系统中被称为键盘扫描码,而这张供查询用的表就被称为键盘扫描码集。最早的键盘键数较少,而现在的

10、键盘键数比以前多了不少,键盘键数的变化也引起了扫描码的变化,历史上产生过三种键盘扫描码集,分别标记为 Set 1,Set 2,Set 3,它们并没有什么本质的不同,而区别只在于:对于键盘上的同一个键,所带表的扫描码不一样罢了。现代键盘常常使用 Set 2,但是为了兼容以前的老式键盘,BIOS 在启动的时候自动将键盘控制器设置为工作在 Set 1 模式下,因此键盘控制器会自动翻译由键盘数据线送来的扫描码,将它有Set 2 中的码转换成 Set 1 中的码。因此,传给 CPU 或说操作系统的就是 Set 1 中的扫描码了,当然我们完全可以给键盘控制器发送命令,让它不进行这样的转换,不过这仿佛没有什

11、么必要。下面,我们就来看看 Set 1 中的键盘扫描码:Set 1 键盘扫描码键 按下码 释放码- 键 按下码释放码- 键 按下码 释放码A 1E 9E 9 0A 8A 1A 9AB 30 B0 29 89 INSERT E0,52 E0,D2C 2E AE - 0C 8C HOME E0,47 E0,97D 20 A0 = 0D 8D PG UP E0,49 E0,C9E 12 92 2B AB DELETE E0,53 E0,D3F 21 A1 BKSP 0E 8E END E0,4F E0,CFG 22 A2 SPACE 39 B9 PG DN E0,51 E0,D1H 23 A3 TA

12、B 0F 8F U ARROW E0,48 E0,C8I 17 97 CAPS 3A BA L ARROW E0,4B E0,CBJ 24 A4 L SHFT 2A AA D ARROW E0,50 E0,D0K 25 A5 L CTRL 1D 9D R ARROW E0,4D E0,CDL 26 A6 L GUI E0,5B E0,DB NUM 45 C5M 32 B2 L ALT 38 B8 KP / E0,35 E0,B5N 31 B1 R SHFT 36 B6 KP * 37 B7O 18 98 R CTRL E0,1D E0,9D KP - 4A CAP 19 99 R GUI E0

13、,5C E0,DC KP + 4E CEQ 10 19 R ALT E0,38 E0,B8 KP EN E0,1C E0,9CR 13 93 APPS E0,5D E0,DD KP . 53 D3S 1F 9F ENTER 1C 9C KP 0 52 D2T 14 94 ESC 01 81 KP 1 4F CFU 16 96 F1 3B BB KP 2 50 D0V 2F AF F2 3C BC KP 3 51 D1W 11 91 F3 3D BD KP 4 4B CBX 2D AD F4 3E BE KP 5 4C CCY 15 95 F5 3F BF KP 6 4D CDZ 2C AC F

14、6 40 C0 KP 7 47 C70 0B 8B F7 41 C1 KP 8 48 C81 02 82 F8 42 C2 KP 9 49 C92 03 83 F9 43 C3 1B 9B3 04 84 F10 44 C4 ; 27 A74 05 85 F11 57 D7 28 A85 06 86 F12 58 D8 , 33 B36 07 87PRNTSCRNE0,2A,E0,37E0,B7,E0,AA. 34 B47 08 88 SCROLL 46 C6 / 35 B58 09 89 PAUSEE1,1D,45E1,9D,C5当然,上面这张表并不完整,但是它包括了普通键盘上的绝大多数键,完

15、整的 Set 1 扫描码集可以在前面提到的PS/2 键盘控制这篇文章中找到。从上面我们可以看出每一个键的键盘扫描码都是不一样的,而且按下码与弹出码也是不一样的,而且它们只间并没有什么规律可言。噢,这里所说的规律是只它们同它们所对应键的 ASCII 码之间没有什么联系,并不是说其它联系也一点没有。看一下 A,S,D,F 这几个键的键盘扫描码值:1E,1F,20,21,再看一下 A,S,D,F 在键盘上的位置,呵呵,通过上面这张表,我们不难想像,远古的键盘上的键是怎样排列的。:P仔细再看看上面这张表,我们还能发现一些其它规律,比如,释放码都大于 0x80,且均为:按下码 + 0x80,有些键的扫描

16、码是多个字节,对于两字节的扫描码,第一字节均是E0。你也许还会发现其它更多的有意思的现象,不过,对于我们的实验来说,了解这些就足够了。这里你也许想问,为什么不直接用 ASCII 码,而要用单独的扫描码呢?我想这个问题一是由于扫描码对于键盘硬件更容易实现(从上面扫描码与键盘上键的排列方式之间的关系就可以看出) ;二是由于 ASCII 码数量是有限的,而且不能更改,但键盘上的键的个数却是不定的,随着键盘的发展,键可能增加也可能减少;第三,比如说“Alt”键,在键盘上就有左右两个,也许以后我们可能在程序中会实现“按左Alt,完成 A 功能” , “按右 Alt,完成 B 功能”的任务,如果使用 ASCII 码,左右 Alt 都会使CPU 收到同一个 ASCII 码,CPU也就无法分辩到底是“左 Alt”还是“右 Al”t 产生的了。呵呵,言归正转,继续我们的描述。当键盘按下一个键或释放一个键的时

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号