摘要:当用户按下Linux键盘组合键时,硬件会检测到此输入并产生中断。中断信号被操作系统捕获后,会触发相应的处理程序。程序通过扫描码识别组合键的具体按键,并将其转换为相应的字符或命令。操作系统将处理结果以信号的形式发送给相应的应用程序或窗口系统,完成整个键盘组合键信号的发送过程。这一过程涉及硬件、操作系统和应用程序之间的紧密协作,确保键盘输入得到准确处理。
对于熟悉Linux的人来说,都知道Ctrl+C组合键能够终止一个进程,当我们深入了解进程和信号的知识后,会发现一个进程被终止通常有以下三种情况:代码运行完毕,结果正确;代码运行完毕,结果不正确;代码运行异常,进程收到了信号而被强制终止,Ctrl+C组合键可以发送SIGINT信号给进程,导致进程终止,对于这一机制,我们不禁好奇其背后的原理,本文旨在探究这一现象的详细过程。
Ctrl+C是Ctrl键和C键的组合,我们要了解计算机是如何知道按键被按下的。
键盘上的每个按键下方都配备了一个开关,这些开关通过硬件电路以矩阵形式相互连接,在正常情况下,这些开关处于断路状态,当按键被按下时,开关所在的电路就会连通,从而产生电信号。
我们要探究计算机是如何知道哪些按键被按下的。
键盘内部配备了一个键盘编码器(如i8048芯片)来检测按键的按下和弹起,该芯片通过轮询的方式监控按键的状态,并将相关信息报告给键盘控制器,这些信息被称为键盘扫描码,它们代表了按键的具体位置和状态。
关于键盘扫描码,存在三种编码方式,对应的也有三套键盘扫描码,现今的键盘大多默认使用第二套键盘扫描码,但也不排除使用第一套和第三套的可能性,键盘控制器通常会将来自键盘编码器的扫描码统一转换为第一套扫描码。
每个按键的通码(按下时的编码)和断码(弹起时的编码)都是用字节来表示的,一些特殊键,如控制键(ctrl、alt)、附加键(Insert)以及小键盘区的一些键的扫描码可能是多字节的,这些多字节的扫描码通常以特定的字节开头,例如0xE0。
这里我们再来了解一下另一个与键盘相关的芯片——键盘控制器(i8042),键盘控制器并不位于键盘内部,而是集成在主板的南桥芯片上,其主要任务是接收来自键盘编码器的扫描码,解码后保存到其寄存器中,并通过中断控制器向CPU发送中断请求。
南桥芯片是主板芯片组的一部分,主要负责系统的输入输出功能,早期的计算机架构中,为了由主板芯片组承担大量功能,分为北桥和南桥两部分,北桥负责内存、图形处理以及PCIE数据交换,而南桥则负责系统的输入输出功能,但随着CPU制造工艺的进步和集成度的提高,许多原本由北桥负责的功能现在已经被集成到CPU内部,现在的Intel芯片组只保留了南桥芯片,而AMD也只有早期的主板还保留了北桥和南桥。
键盘控制器内部拥有4个8位的寄存器,它们的作用如下:
1、状态寄存器:一个只读寄存器,CPU可随时读取其数据,该寄存器各位的定义中,如果为1表示键盘未被禁用等。
2、控制寄存器:用于设置键盘控制器的各种参数,如是否禁用键盘、是否将第二套扫描码翻译为第一套等。
3、输出缓冲器:一个只读寄存器,键盘驱动程序从这个寄存器中读取数据,包括扫描码等。
4、输入缓冲器:一个只写寄存器,用于存放发往键盘控制器的命令等。
了解了这些后,键盘控制器的工作过程就清晰了,当键盘编码器检测到按键被按下或弹起时,会产生相应的扫描码并发送给键盘控制器,键盘控制器将收到的扫描码解码并转换为第一套扫描码,然后放到输出缓冲器中,同时状态寄存器的某一位会被设置为1,表示键盘数据输入就绪,等待读取,键盘控制器会向中断控制器发送一个中断请求信号。
中断控制器是计算机系统中的另一个硬件组件,负责管理各种设备控制器(如键盘控制器、鼠标控制器等)发送的中断请求,当键盘控制器发出中断请求时,中断控制器会检测内部的一个叫做IMR的寄存器,查看这个中断信号是否被屏蔽,如果没有被屏蔽,中断控制器就会向CPU发送中断请求。
CPU在收到中断请求后,会暂停当前正在执行的线程,保存其上下文数据,并向中断控制器获取中断向量号,CPU会根据中断向量号在中断向量表中索引到处理该中断的中断处理程序的入口地址,然后执行该程序,这就是中断处理的大致流程。
在操作系统内核中存在着一张中断向量表,这张表存储的是各种硬件设备的中断处理程序入口地址,CPU会根据中断向量号在这张表中找到相应的处理程序入口地址,对于键盘来说,其对应的处理程序就是键盘驱动程序。
接下来我们来谈谈键盘驱动程序的工作流程,当驱动程序从键盘控制器的输出缓冲器中读取到一个字节大小的扫描码时,它会首先检查这个扫描码是否表示一个按键的按下或释放,然后驱动程序会进行一系列的转换和检测来确保按键的稳定性和准确性,最后根据扫描码判断是普通字符数据还是命令(如Ctrl+C等
还没有评论,来说两句吧...