操作系统是怎样一步步接收键盘按键的?

系统 其他OS
在类Unix系统中,驱动程序会把字母a写到device file中,也就是设备文件,你可以像访问普通文件那样直接访问设备文件,但它并不是真正的文件。

大家好,我是岛主小风哥,你有没有想过,按下键盘按键后,相应的字符是怎么一步步显示在屏幕上的?

首先来看硬件部分,你至少应该能想到必须得有键盘和CPU:

图片图片

之后呢,cpu是怎么知道有键盘按下呢?

为了让键盘按下按键后能通知到CPU,需要借助键盘控制器,keyboard controller,这当然也是硬件:

图片图片

当按下按键时,键盘控制器能检测到键盘按键:

图片图片

接着键盘控制器向CPU发出中断:

图片图片

当CPU接收到中断信号后暂停当然正在执行的代码,在此之前也许CPU正在执行应用程序的代码,表现出来的就是你的程序就在运行:

图片图片

当然也有可能CPU正在执行操作系统代码,但不管怎样,CPU接收到中断信号后将暂停执行当前的指令然后跳转到一个提前配置好的地址,这个地址指向的就是内核中的处理函数,假设这个函数叫做do_irq()。

图片图片

中断处理函数do_irq发现中断来自键盘,因此开始调用能处理键盘按键的内核代码,这段内核代码就是所谓的驱动,driver。

图片图片

驱动程序处理键盘按键后发现按下的是字母a,然后呢?

在类Unix系统中,驱动程序会把字母a写到device file中,也就是设备文件,你可以像访问普通文件那样直接访问设备文件,但它并不是真正的文件。

图片图片

现在,键盘按键已经从硬件世界来到的了软件世界,也就是内核中。

还是以Unix系统为例,在Unix中负责窗体管理的叫做X Window System,该系统由X server以及X client组成,图形应用程序就是x client,接收来自x server的键盘消息,那么x server又是从哪里知道键盘消息呢?答案就是刚才提到的设备文件:

图片图片

接下来X server会把键盘按键消息发送给正在获取焦点的窗体,怎么发送呢?利用的就是进程间通信技术,IPC:

图片图片

这样,我们的程序就可以获得键盘按键了。

责任编辑:武晓燕 来源: 码农的荒岛求生
相关推荐

2024-09-30 09:56:59

2024-09-12 10:04:06

内存程序系统

2024-06-27 08:30:36

内存扩容堆区

2024-08-30 08:30:29

CPU操作系统寄存器

2017-01-19 21:08:33

iOS路由构建

2024-08-06 09:29:54

程序机器指令字符串

2018-07-13 15:36:52

2019-03-05 14:09:27

Docker存储容器

2019-07-09 15:23:22

Docker存储驱动

2018-12-24 10:04:06

Docker存储驱动

2021-03-15 09:20:15

微软IBM研究院

2010-03-04 16:28:17

Android核心代码

2017-12-25 11:50:57

LinuxArch Linux

2016-11-02 18:54:01

javascript

2011-05-10 10:28:55

2020-12-24 11:19:55

JavaMapHashMap

2018-06-11 15:30:12

2018-04-23 14:23:12

2019-04-01 10:15:02

2017-01-06 15:13:25

LinuxVim源代码
点赞
收藏

51CTO技术栈公众号