Linux 输入子系统
Linux 输入子系统是一个专门处理输入类设备的框架,通过提取共同功能、规范接口,简化驱动开发并提高兼容性。它支持通用和专用设备节点,可通过设备名、试探性操作或查看 /proc/bus/input/devices 文件确定设备与节点的对应关系。子系统框架包含事件处理层,负责处理输入事件并传递给上层应用。
Linux GPIO子系统
Linux GPIO 子系统是通用输入输出接口的驱动框架,支持软件动态配置引脚模式、电平、上下拉、驱动强度和中断功能。以 RK3568 为例,其 152 个 GPIO 分布于 5 组 bank,通过公式 bank×32+group×8+X 计算引脚编号。用户可通过 sysfs 或 libgpiod 在用户空间控制 GPIO,核心操作包括导出引脚、设置方向和读写电平。
Linux pinctrl 子系统
Linux pinctrl 子系统统一管理 SoC 引脚,通过设备树将 GPIO 控制器作为 pin controller 子节点,定义引脚组(groups)和功能(function)。驱动基于 platform 总线,使用 pinctrl_desc 结构体提供引脚控制、复用和配置操作接口,实现引脚的分组管理与功能切换。
Linux热插拔
Linux热插拔允许在系统运行时安全插入或拔出硬件设备(如USB、硬盘、扩展卡),通过内核与用户空间程序(mdev或udev)的交互实现。内核使用kobject_uevent()函数生成uevent事件并通过netlink发送给用户空间,用户空间的udev(常用于PC)或mdev(用于嵌入式)根据事件动态创建设备节点或加载驱动。udevadm是管理和调试udev事件的主要命令行工具。
Linux设备模型
Linux设备模型是内核为应对复杂设备(如电源管理和热插拔)提供的高级框架,通过统一API和机制处理设备注册、资源管理、热插拔事件等,支持代码复用、动态资源分配和驱动的面向对象设计,其核心由kobject和kset构成,每个kobject对应sysfs下的一个目录。
Linux设备树
设备树是一种硬件描述机制,用于在嵌入式系统中描述硬件设备特性、连接关系和配置信息,降低内核与硬件的耦合度,提高可移植性和可维护性。它由DTS源文件、DTSI包含文件、DTB二进制文件和DTC编译器组成,存放于Linux内核源码特定目录(如ARM64的arch/arm64/boot/dts)。设备树支持编译与反编译,其基本语法包括根节点、子节点、节点标签、单元地址和属性定义(如reg属性)等。
Linux Memory Management
Linux内存管理通过分段和分页机制实现进程地址空间隔离与按需分配,虚拟地址空间分为用户空间(0-3G)和内核空间(3G-4G),内核使用mm_struct、vm_area_struct、page、zone等数据结构管理虚拟和物理内存,页表支持多级映射(如ARM32的四级映射和ARM64的四级/三级映射),TLB加速地址转换,物理内存通过伙伴系统管理并初始化线性映射与高端映射。
Linux平台总线
Linux内核中的平台总线用于管理和连接直接集成在SoC或主板上的平台设备与驱动,通过分离设备与驱动提高代码重用性。平台设备和驱动作为独立对象,设备名称与ID唯一标识,struct platform_device需实现release方法,struct resource描述资源的起始地址、结束地址、名称和标志位。
Linux中断
Linux中断机制允许CPU快速响应外部或内部事件,提高并发处理能力。中断处理分为上半部(紧急任务)和下半部(耗时任务)。中断子系统框架包括用户层、通用层、硬件相关层和硬件层,GIC(通用中断控制器)是硬件相关层的关键组件,支持多核和管理大量中断源。
Linux高级字符设备进阶
阐述Linux内核中高级字符设备驱动开发的关键技术,包括container_of宏的实现原理、循环双链表的管理与遍历、以及基于等待队列的进程睡眠唤醒机制。
