Linux Driver Development Overview
作者: 刘鹏
本文对 Linux 设备驱动开发涉及的知识点做了一一梳理,通过阅读这个提纲读者可以很快了解 Linux 设备驱动程序的整体结构及其关键技术。
当一个 Linux 设备启动时,内核发生了什么
- 总线上有个信号
- 查找设备列表,是否有此设备
- 若有,则装载相应的驱动
- 若没有,则 probe 相应的驱动
- 加载驱动后进行初始化,设备进入 ready 状态
驱动程序基本结构
- 头文件
- 版本
- init/exit
设备号
- Major number:一个 major number 对应一个 driver (一个 driver 可能控制多个设备)
- Minor number: 一个 minor number 对应一个 driver 控制的多个设备中的一个 (若是有多个的话)
内核怎样调试
- printk:打印变量值;
- oops info:使用 dmesg 命令或查看 /var/log/messages 文件
- kdb:调试工具
并发与同步
- mutex/semaphore : 若得不到,则引起调用者睡眠,把进程从运行队列拖出去; 任何时刻只有一个保持者;适用于保持时间较长的情况;
- spinlock : 若自旋锁已被别人保持,调用者一直循环查看锁是否可得,不会引起调用者睡眠;任何时刻只有一个保持者;适用于保持时间短的情况;
- atom 数据类型:原子数据类型
中断
- 前半步 top half: 即 interrupt handler,用于完成时间短的操作;
- 后半步 bottom half:用于时间长的操作。
- 与Linux中断息息相关的一个重要概念是Linux中断分为两个半部:上半部 (tophalf)和下半部(bottom half)。上半部的功能是"登记中断",当一个 中断发生时,它进行相应地硬件读写后就把中断例程的下半部挂到该设备的 下半部执行队列中去。因此,上半部执行的速度就会很快,可以服务更多的 中断请求。但是,仅有"登记中断"是远远不够的,因为中断的事件可能很复 杂。因此,Linux引入了一个下半部,来完成中断事件的绝大多数使命。下半 部和上半部最大的不同是下半部是可中断的,而上半部是不可中断的,下半 部几乎做了中断处理程序所有的事情,而且可以被新的中断打断!下半部则 相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运 行时机,不在中断服务上下文中执行;2
- Linux实现下半部的机制主要有tasklet和工作队列。
内存分配
- kmalloc
- vmalloc, 分配较大的内存
- get_free_page
- look aside cache
操作硬件
- I/O 端口
- I/O 内存
mmap
将设备内存映射到进程虚拟地址空间,直接访问
DMA (Direct Memory Access)
Reference
- http://linux.chinaunix.net/bbs/thread-904034-1-6.html
- http://blog.chinaunix.net/u2/62910/showart_492765.html
- Linux Device Driver, 3rd Edition.