gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:18:18 26 4
gpt4 key购买 nike

当我在 Linux 下的某个 GTK 应用程序上按下键盘上的键时,到底发生了什么?如何接收 key (从哪个设备)、解释、传递给程序,然后进行处理?

最佳答案

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


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

我掩盖了语言映射、控制台多路复用和其他一些事情...

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

关于linux - Linux 下键盘事件处理的内部工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3792733/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com