Linux input 子系统是一个强大且高度专业化的用于处理输入设备的框架,于 2024 年 9 月 19 日的当下,在众多 Linux 系统应用场景中发挥着至关重要的作用。它为各种输入设备,诸如常见的键盘、鼠标、触摸屏,以及不太常见的摄像头等,提供了一种标准且统一的接口来进行高效处理。
该子系统精心设计的架构主要由两个层次组成:
一、输入核心层:
- 此层稳居于内核空间,犹如整个子系统的中流砥柱。其主要职责在于对设备驱动程序进行精准的注册和科学的管理。
- 其中包含了设备的抽象层,这一抽象层能够将不同类型的输入设备进行合理抽象,使得上层处理更加便捷。
- 高效的中断处理机制确保了输入事件的及时响应,不会让用户在操作过程中感受到明显的延迟。
- 还负责设备节点的创建,为输入事件的传输搭建起必要的通道。
二、输入事件层:
- 位于用户空间,扮演着输入事件传递者的关键角色。
- 它通过读取输入设备的设备节点,精准地获取各类输入事件。这些事件涵盖了从键盘按键的按下与释放,到鼠标的移动与点击,再到触摸屏的触摸与滑动等各种操作所产生的信号。
- 随后,将这些事件迅速传递给应用程序,使得应用程序能够依据这些事件来响应用户输入,为用户提供丰富多样的交互体验。
该子系统的强大之处不仅在于其支持多种不同类型的输入设备,例如 USB 和 PS/2 键盘、USB 和 PS/2 鼠标、触摸屏、摄像头等,还在于它对输入设备热插拔的完美支持。这意味着在系统运行时,可以随时添加或删除输入设备,而子系统能够迅速识别并做出相应的处理,极大地提高了系统的灵活性和可扩展性。
Input 子系统由以下组件组成:
- 输入硬件(Input HW):表示正在处理事件的底层设备。这可以是一个物理设备,如鼠标、键盘或触摸屏幕,也可以是虚拟设备,如软件仿真器等。
- 输入驱动程序(Input Driver):负责将底层输入设备的数据转换为通用的 Linux 输入事件类型,并将其发送到内核输入核心(Input Core)中。每个输入驱动程序通常对应于一个特定的硬件设备。
- 输入核心(Input Core):负责管理输入驱动程序和输入设备之间的通信,接收并维护添加/删除输入设备的请求,以及将输入事件发送到适当的应用程序。它还提供了一套 API,使用户空间应用程序可以访问输入子系统服务。
- 事件子系统(Event Subsystem):表示传递给用户空间的输入事件。这是一个回调驱动系统,它将在触发的输入事件后执行特定的用户定义函数,然后返回该事件的状态报告。
- 字符驱动程序(Character Driver):允许在文件系统中呈现输入子系统的属性。用户从文件读取输入事件或向文件写入控制命令。用户可以使用自己熟悉的 List I/O、Poll/Select 等等方法请求状态或数据。
用户空间应用程序可以通过输入子系统提供的接口与底层硬件交互,并通过订阅输入事件来完成不同的用户输入任务,例如鼠标移动、键盘操作以及触摸手势识别等行为。最终,这些输入事件将被送往运行在用户空间的应用程序,例如窗口管理器、桌面环境、游戏引擎等,以响应用户的交互需要。