Linux下键盘事件处理的内部工作原理

9
当我在Linux下的某个GTK应用程序上按下键盘上的按键时,究竟发生了什么?按键如何被接收(来自哪个设备),解释,传递给程序,然后进行处理?
1个回答

17

这其实是一个相当复杂的过程...


  1. 键盘具有2D矩阵的按键连接和自己的微处理器或门阵列,它不断扫描矩阵以查找是否有按键按下。(为了节省引脚,按键不被逐个测试。) 键盘微处理器与您CPU中的键盘控制器进行通信并传输指示按键按下的消息。
  2. 键盘控制器记录代码并中断CPU。
  3. 键盘驱动程序接收中断,从控制器寄存器读取密钥代码,并将密钥代码放入缓冲区,将中断端链接到进程线程。 它标记等待键盘输入的线程为“可运行”。
  4. 该线程唤醒。 原来,这是X服务器。 X服务器从内核读取关键代码。
  5. 服务器将检查哪个窗口具有键盘焦点。 窗口将连接到各种客户端。
  6. 服务器向显示特定窗口的客户端发送事件。(请注意,对于服务器而言,每个文本框等都是“窗口”,而不仅仅是整个应用程序。)
  7. 客户端中的事件循环正在等待下一个服务器事件消息。 此连接可以通过TCP连接,也可以是本地Unix特性。 它使用read(2)或套接字操作实际获取下一个事件消息。
  8. 低级别的xlib例程将按键传递给更高级别的小部件,最终到达某种类型的GTK函数。
  9. GTK API元素将字符交给您的程序。

我略过了语言映射,控制台多路复用和其他一些事情...

更新: 所以,/dev/input/* 以及所有的 /dev/* 实际上都是称为块设备或字符设备的特殊文件。重要的是它们在文件系统中没有存储数据,只有一个主设备号和次设备号,在内核中查找驱动程序的表中使用。就是这么简单。如果你 ls -l /dev/input,你会看到一个主设备号和次设备号,而不是文件大小。主设备号标识设备驱动程序,次设备号是一种实例编号,作为参数传递给驱动程序(在内核内部)。


2
哇,我对你对流程的理解深度感到惊讶。但是我仍然不清楚真实设备与/dev/input/*之间的关联。 - OTZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接