01
字符设备驱动概述
什么是字符设备、字符设备与块设备的区别、驱动开发环境搭建(内核源码树、交叉编译链)。
基础环境
02
第一个字符设备驱动
模块初始化与退出、module_init/module_exit宏、LICENSE和作者信息。
入门模块
03
设备号管理
主设备号与次设备号、静态分配设备号、动态分配设备号(alloc_chrdev_region)。
核心设备号
04
cdev结构体
cdev_init、cdev_add、cdev_del,将设备与文件操作绑定。
对象绑定
05
file_operations结构体
open、release、read、write、ioctl等回调函数详解。
回调接口
06
用户态与内核态数据交互
copy_from_user、copy_to_user、put_user、get_user。
数据安全
07
驱动中的并发控制(上)
自旋锁(spinlock)的原理与使用场景。
并发自旋锁
08
驱动中的并发控制(下)
互斥体(mutex)与信号量(semaphore)的选择。
互斥信号量
09
等待队列
wait_event_interruptible、wake_up_interruptible,实现阻塞式读写。
阻塞唤醒
10
ioctl命令
命令码编码规则(_IO/_IOR/_IOW/_IOWR)、switch-case处理。
命令编码
11
驱动中的内存分配
kmalloc、kzalloc、vmalloc、GFP标志位选择。
内存GFP
12
procfs接口
创建/proc条目,导出驱动运行时信息供用户态查看。
proc调试
13
sysfs接口
kobject与attribute,通过/sys导出设备属性。
sysfs属性
14
设备树基础(上)
设备树语法、节点、属性、compatible匹配。
设备树语法
15
设备树基础(下)
在驱动中解析设备树(of_xxx系列API)。
解析of
16
platform驱动模型
platform_driver与platform_device的注册与匹配。
平台驱动模型
17
中断处理(上)
注册中断(request_irq)、中断处理函数上下文、上半部与下半部。
中断上半部
18
中断处理(下)
tasklet、工作队列(workqueue)、 threaded IRQ。
下半部workqueue
19
定时器与内核延时
timer_list、mod_timer、del_timer、msleep/udelay。
定时器延时
20
内核链表
list_head、list_add、list_for_each_entry,管理驱动内部对象。
链表遍历
21
debugfs接口
创建debugfs文件,动态调试驱动行为。
debugfs动态调试
22
驱动中的错误处理
IS_ERR/PTR_ERR、返回码规范、内核日志(printk等级)。
错误日志
23
电源管理基础
suspend/resume回调、系统休眠流程。
电源休眠
24
DMA基础
dma_alloc_coherent、dma_map_single、streaming与consistent映射。
DMA映射
25
字符设备驱动测试方法
编写用户态测试程序、使用dd工具、使用ioctl测试。
测试用户态
26
驱动热插拔
uevent机制、自动创建设备节点(class_create/device_create)。
热插拔uevent
27
驱动调试技巧
printk调试、动态调试(dynamic_debug)、kgdb入门。
调试kgdb
28
驱动性能优化
减少锁竞争、批量数据传输、使用DMA/MMIO。
性能优化
29
驱动安全
检查用户传入指针、避免缓冲区溢出、权限检查。
安全指针
30
综合实战:GPIO字符设备驱动
包含设备树、中断、sysfs、测试程序。
实战GPIO