你有没有想过,按下键盘按键后,相应的字符是怎么一步步显示在屏幕上的?
首先来看硬件部分,你至少应该能想到必须得有键盘和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:
这样,我们的程序就可以获得键盘按键了。
原创 码农的荒岛求生