【问题标题】:Inner-workings of Keyboard Event Handling under LinuxLinux下键盘事件处理的内部工作原理
【发布时间】:2011-04-17 02:29:06
【问题描述】:

当我在 Linux 下的某个 GTK 应用程序上按下键盘键时,究竟会发生什么?如何(从哪个设备)接收、解释、传递给程序并处理密钥?

【问题讨论】:

    标签: linux events keyboard operating-system gtk


    【解决方案1】:

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


    1. 键盘有一个二维矩阵键连接和它自己的微处理器或包含微处理器的门阵列。它不断地扫描矩阵以找出是否按下了任何键。 (为了节省引脚,按键没有单独测试。)键盘微型与 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,您将看到主要和次要设备号,而不是文件大小。主设备号标识设备驱动程序,次设备号是一种实例编号,它(在内核中)作为参数传递给驱动程序。

    【讨论】:

    • 哇,我对您对流程的理解深度感到惊讶。不过,我仍然不清楚在真实设备上与/dev/input/* 的关联。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多