2026/10/8 7:15:59
网站建设
项目流程
一、开发基础与内核模块
- 开发环境:基于ARM交叉编译工具链,配套U-Boot、Linux内核、根文件系统的编译与烧录全流程。
- 内核模块是驱动的最小载体
- 支持动态加载/卸载,无需重新编译内核
- 核心要素:模块入口函数、模块出口函数、模块参数、模块符号导出
- 是Linux驱动开发的基础代码组织形式
二、字符设备驱动核心框架
- 核心数据结构
struct cdev:内核中描述一个字符设备的结构体struct file_operations:驱动的操作接口集合,封装open/read/write/ioctl/release等对应用层的操作
- 设备号管理
- 主设备号:标识驱动类型
- 次设备号:标识同驱动下的不同硬件设备
- 支持静态申请、动态分配两种方式
- 用户态与内核态数据交互
- 内核空间与用户空间不能直接访问,必须通过
copy_from_user()、copy_to_user()完成安全拷贝
- 设备节点
- 可通过
mknod手动创建/dev下的设备文件 - 也可结合udev/设备模型自动创建设备节点
三、设备树(Device Tree)机制
- 核心作用:剥离硬件描述与驱动代码,不再硬编码硬件信息,以树形结构描述板级硬件资源。
- 文件形态:源码为
.dts,编译后生成.dtb,内核启动时读取解析。 - 核心要素:节点、属性(
compatible匹配属性、reg寄存器地址范围、interrupts中断信息等)。 - 驱动接口:内核提供
of_系列函数,驱动代码可通过接口读取设备树中的硬件参数。
四、中断处理机制
- 中断注册:通过中断号绑定硬件中断与中断处理函数,支持中断共享。
- 顶半部+底半部 分层设计
- 顶半部:快速响应硬件、关闭中断,只处理紧急事务
- 底半部:延后处理耗时事务,常见实现方式为tasklet、工作队列
- 平衡中断响应实时性与系统整体效率
五、并发与同步机制
- 并发来源:多进程调度抢占、中断上下文抢占、SMP多核并行访问,会引发竞态问题。
- 常用同步手段
- 原子操作:针对简单变量的无锁保护,开销最小
- 自旋锁:忙等待机制,适用于中断上下文等不可睡眠的场景
- 信号量/互斥体:支持睡眠,适用于进程上下文的临界区保护
六、常见IO模型
- 阻塞IO:基于等待队列实现,设备无数据时进程休眠,数据就绪后唤醒,是最常用的IO模型。
- 非阻塞IO:应用层设置
O_NONBLOCK标志,无数据时驱动立即返回错误,由应用层轮询访问。 - 多路复用IO(select/poll):同时监控多个设备文件,统一等待事件,适合多设备并发场景。
- 异步通知:驱动主动向应用层发送
SIGIO信号,应用层注册信号处理函数响应事件,无需主动轮询。
七、平台总线驱动模型
- 分层思想:总线(bus)、设备(device)、驱动(driver)三者分离,通过名称或设备树
compatible属性自动匹配。 - 核心结构
struct platform_driver:描述平台驱动,实现probe函数,匹配成功后执行硬件初始化- 实现驱动与硬件描述解耦,大幅提升驱动的可复用性与可移植性
八、Linux设备模型
- 底层核心:以
kobject、kset为内核对象基础,向上派生出总线、设备、驱动三大类。 - sysfs文件系统:以
/sys目录树的形式,向用户空间呈现内核中总线、设备、驱动的拓扑关系。 - 设备类(class):更高层的设备抽象,可自动在
/dev目录创建设备节点,简化应用层操作。