字符从键盘输入到在显示器显示出来的详细过程
2015-09-18 23:18
387 查看
曾经有一段时间,一直想搞清楚,当我敲下键盘时,os到底是做了些什么,让我能看到一个字符被显示出来。
现把过程总结一下,消除一下和我有同样感觉的孩子们。
1)首先知道一下键盘的构成;6位的计数器经过两个八选一译码器对键盘进行扫描 在键盘没有任何按键时,扫描随着计数器的循环计数反复进行。
可以这么想,扫描就是一束光线,当没有键被按下时,光线可以横穿过键盘的任何位置。
2)若有键按下,扫描会发现该信号(键被按下以后挡住了光线的横穿),该信号使计数器停止计数,将扫描码发送给 8042。
每一个键的位置都用一组数字表示,这组数字就是所谓的扫描码。
你可能好奇,扫描码怎么就传给8042了? 其实特简单,就是直接用电路联通的。
3)8042将该扫描码放在缓冲区中,并告诉8259A产生了中断。
缓冲区大小为1byte,如果此时键盘又有新的键按下,8042将不再接收,一直等到缓冲区被清理。
4)8259A识别出键盘中断,将cpu的中断寄存器的特定位置为1。
注意到目前为止cpu一直再执行其它程序或者空闲,根本还对键盘按下的事件没做任何反应。虽然描述的比较复杂,但这个过程其实特快。
5)接下来就是典型的中断处理过程了。 cpu执行完一条指令后,发现有中断存在,进入中断周期,通过IDT的映射将其处理交给键盘处理程序。
6)键盘处理程序第一步就是从8042的缓冲区(仅有一个字节)将该扫描码移动到键盘缓冲区(链表实现的 大小可调整,太大了也没什么用),此时可以接受下一个字符按键了。
7)若键盘缓冲区非空,则开始处理这些按键码,首先将扫描码转换为ASCII码
若是可打印字符如a 则将其显示
其他功能键做相应处理。
最后就是显示的过程了:
可通过bios调用或者写显存实现。
1 将该字符的ASCII码加上一些属性(如颜色控制,最简单的rgb,此时只有最纯的rgb三种颜色及其叠加的组合共8种),这些属性也是由01表示的,0代表无,1代表有 放入显存中(集显就是内存中的特定位置 )。
2 字符发生器,通过读这个特定位置的数据,将ASCII码及其属性信息转换为一个光点矩阵,1表示有光。
字符发生器实际是一个rom,用映射的功能实现这种转换。
如ASCII = 65, 字符发生器会把其转换为a的光点矩阵,颜色由后面的3把枪控制。
3 该光点矩阵可以作为显示器的输入信号。每个点都有3把电子枪发射(分别发rgb)的光叠加成的。
转载至:字符从键盘输入到在显示器显示出来的详细过程
参考:写一个支持键盘输入和屏幕输出的内核
现把过程总结一下,消除一下和我有同样感觉的孩子们。
1)首先知道一下键盘的构成;6位的计数器经过两个八选一译码器对键盘进行扫描 在键盘没有任何按键时,扫描随着计数器的循环计数反复进行。
可以这么想,扫描就是一束光线,当没有键被按下时,光线可以横穿过键盘的任何位置。
2)若有键按下,扫描会发现该信号(键被按下以后挡住了光线的横穿),该信号使计数器停止计数,将扫描码发送给 8042。
每一个键的位置都用一组数字表示,这组数字就是所谓的扫描码。
你可能好奇,扫描码怎么就传给8042了? 其实特简单,就是直接用电路联通的。
3)8042将该扫描码放在缓冲区中,并告诉8259A产生了中断。
缓冲区大小为1byte,如果此时键盘又有新的键按下,8042将不再接收,一直等到缓冲区被清理。
4)8259A识别出键盘中断,将cpu的中断寄存器的特定位置为1。
注意到目前为止cpu一直再执行其它程序或者空闲,根本还对键盘按下的事件没做任何反应。虽然描述的比较复杂,但这个过程其实特快。
5)接下来就是典型的中断处理过程了。 cpu执行完一条指令后,发现有中断存在,进入中断周期,通过IDT的映射将其处理交给键盘处理程序。
6)键盘处理程序第一步就是从8042的缓冲区(仅有一个字节)将该扫描码移动到键盘缓冲区(链表实现的 大小可调整,太大了也没什么用),此时可以接受下一个字符按键了。
7)若键盘缓冲区非空,则开始处理这些按键码,首先将扫描码转换为ASCII码
若是可打印字符如a 则将其显示
其他功能键做相应处理。
最后就是显示的过程了:
可通过bios调用或者写显存实现。
1 将该字符的ASCII码加上一些属性(如颜色控制,最简单的rgb,此时只有最纯的rgb三种颜色及其叠加的组合共8种),这些属性也是由01表示的,0代表无,1代表有 放入显存中(集显就是内存中的特定位置 )。
2 字符发生器,通过读这个特定位置的数据,将ASCII码及其属性信息转换为一个光点矩阵,1表示有光。
字符发生器实际是一个rom,用映射的功能实现这种转换。
如ASCII = 65, 字符发生器会把其转换为a的光点矩阵,颜色由后面的3把枪控制。
3 该光点矩阵可以作为显示器的输入信号。每个点都有3把电子枪发射(分别发rgb)的光叠加成的。
转载至:字符从键盘输入到在显示器显示出来的详细过程
参考:写一个支持键盘输入和屏幕输出的内核
相关文章推荐
- Vuforia SDK----从Unity的SD卡装入一个DataSet
- windows常用命令之NET命令
- 关于Swift2.0提供的try catch异常捕捉的使用方法
- Java并发编程:Callable、Future和FutureTask
- [leetcode127]Word Ladder Problem
- String,StringBuffer,StringBuilder
- 基于bootstrap的简单分页
- 缅怀
- 分享一个Swift语言的逆波兰表达式计算器的实现
- Java并发编程:如何创建线程
- select ... for update& lock in share mode加锁情况
- 按哪个穴位能防脱发
- raspberry pi2 智能小车源码及测试视频
- java 数组声明方法
- raspberry pi2 智能小车源码及测试视频
- Android 状态栏沉浸式的实现
- HDU_3998_Sequence(最长上升子序列 + 网络流)
- poj 2001(trie)
- android 禁止listview 的ITEM被点击
- 华为面试题 输入一个n,在屏幕上输出N*N的矩阵