LINUX INPUT SYSTEM(一)框架模型

本文深入探讨了Linux输入子系统的三层结构:设备驱动层、核心层和事件处理层。介绍了关键数据对象Input_dev、Input_Handler、Input_Handle和Client的作用,以及它们之间的关系。通过解析关键数据结构,阐述了Linux如何统一处理多种输入设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LINUX INPUT SYSTEM(一)框架模型

概述

内核的输入子系统是对分散的,多种不同类别的输入设备(如键盘,鼠标,跟踪球,操纵杆,触摸屏,加速计和手写板)等字符设备进行统一处理的抽象模型

框架模型

LINUX 的 input子系统分为三层结构,如下:
分别为:event handler ,input core ,input drvier.
在这里插入图片描述
设备驱动层(input drvier)
和硬件相关,直接捕捉和获取硬件设备的数据信息等(包括触摸屏被按下、按下位置、鼠标移动、键盘按下等等),然后将数据信息报告到核心层,提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件。

核心层
对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口。

事件处理层
为我们用户空间的应用程序提供了统一访问设备的接口和驱动层提交来的事件处理

关键数据对象

Input_dev: 代表着具体的输入设备,它直接从硬件中读取数据,并以事件的形式转发
Input_Handler: 代表接收某一类事件的上层接口,对应于一类事件设备文件
Input_Handle : 用于将input_device 和 handler 连接起来的胶水,对应于某1个具体的设备文件。
Client: 对应于用户程序对文件的访问接口,每open一次事件驱动,就创建一个client.
两条重要的链表
static LIST_HEAD(input_dev_list);
记录着系统中所有的输入设备
static LIST_HEAD(input_handler_list);
记录着所有的事件驱动
在这里插入图片描述

关键数据结构

struct input_handle { 
    ... 
    struct input_dev *dev;
    struct input_handler *handler;
    struct list_head    d_node;//链入input_dev的h_list代表的链表 
    struct list_head    h_node;//链入input_handler的h_list代表的链表 
}; 

struct input_dev { 
    ...//detailed info of this device 
    struct list_head        h_list;//这是与input_dev相关联的input_handle的链表的表头 
    struct list_head 	node;//链入全局链表 input_dev_list
};

struct input_handler { 
    ... 
    void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);//important 
    bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value); 
    bool (*match)(struct input_handler *handler, struct input_dev *dev); 
    int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id); 
    void (*disconnect)(struct input_handle *handle); 
    void (*start)(struct input_handle *handle); 
    ... 
    const struct input_device_id *id_table; 
    struct list_head    h_list;//这是与input_handler相关联的input_handle的链表的表头 
    struct list_head    node;//链入全局链表  input_handler_list
}; 

在这里插入图片描述

### Linux 中 TC 框架与 Netfilter 框架的比较 #### 区别 Netfilter 和 Traffic Control (TC)Linux 网络子系统的两个重要组成部分,各自负责不同的网络处理任务。 - **功能定位** - Netfilter 主要用于包过滤和地址转换等功能。它允许内核模块在数据包通过网络堆栈的不同位置进行操作,支持防火墙、NAT(Network Address Translation)、IPSec 等安全特性[^1]。 - TC 则专注于流量整形和带宽管理,在发送方向上控制数据流的速度以及优先级调度策略,确保不同类型的业务能够获得合理的资源分配[^2]。 - **工作阶段** - Netfilter 处理的是进入或离开主机的数据报文,在 OSI 参考模型中的第三层(网络层)到第七层(应用层)之间运作;而 TC 更多关注于第二层之后至传输层之前的部分,即链路层以上的部分,并且主要作用是在输出路径上的队列管理和速率限制等方面发挥作用。 - **配置工具** - 对应这两个框架有不同的命令行工具来进行设置:`iptables`, `nftables` 常被用来定制 netfilter 的行为模式;对于 tc,则有专门设计好的 iproute2 工具集下的 `tc` 命令来完成相应参数调整。 #### 联系 尽管两者有着明显的分工差异,但在实际部署过程中往往相辅相成: - 当需要对特定应用程序产生的流量实施精确调控时,可以先利用 netfilter 定义匹配条件筛选目标连接对象,再交由 tc 执行具体的 QoS (Quality of Service,服务质量)措施; - 同样地,在某些复杂环境中可能既存在对外部访问权限的安全管控需求又涉及到内部服务间通信效率优化的要求——此时便可以通过组合运用这两种技术手段达到理想效果。 #### 应用场景 根据不同侧重点,两种机制适用于不同类型的应用场合: - **Netfilter 场景** - 实现企业级网络安全防护体系,如入侵检测系统IDS(Intrusion Detection System),防止恶意攻击者未经授权获取敏感资料; - 构建虚拟专用网(VPN,Virtural Private Network),使得远程工作者能安全接入公司内部网络环境; - 提供负载均衡解决方案,提高服务器集群的整体性能表现并增强可用性和可靠性。 - **TC 场景** - 面向 ISP(Internet Service Provider)/运营商提供差异化服务水平协议SLA(Service Level Agreement),保障高价值客户享有更优质的互联网体验; - 支持多媒体实时交互类应用例如 VoIP/VoLTE(voice over IP/Long Term Evolution)通话质量不受拥塞影响保持清晰流畅; - 协助大型数据中心有效规划计算节点间的通讯带宽配额,促进资源共享最大化的同时减少延迟现象发生概率。 ```bash # 示例:使用 iptables 设置简单的入站规则 sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT # 示例:创建 HTB 类型的 qdisc 并为其根节点指定默认 classid sudo tc qdisc add dev eth0 root handle 1: htb default 10 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值