第一次看linux设备驱动程序时候,觉得第一章和第二章内容没什么重要,就略
过而已,或许当时那对设备驱动程序不怎么了解的原因吧!学到了一半,说要写下
总结才重新看了一下:发现第一、二章是概述了本书的重点思想,而要写一个完
整、漂亮的device driver必须得遵循这些思想。那我接下来就唠叨一下这些:
1、驱动程序的角色(提供机制而非策略)
大部分的编程问题其实可以划分为 2 部分:"提供什么能力"(机制) 和 "如何
使用这些能力"(策略).如何理解这句话?eg、以S3C2440开发板上的4个leds为例来
我对这句话的理解:在编写驱动内核代码来存取硬件时,不能强加策略给用户,因
不同的用户有不同的功能要求;内核代码在让硬件可用的情况下,把如何操作硬件
的事情就交给用户去操作。比如说,用户可以对 4 leds进行如下操作:(1)让4 leds
一起亮或者一起灭;(2)指定特定的 led 的亮灭;(3)让 4 个 leds中任意几个亮
灭;and so on 。 而内核代码应该都要实现这些功能的机制,而不是去指定或约
束用户你应该怎么去做,只能这样做,不能那样做等等。这样的话:一个驱动,它
就开始变得"灵活"了,对硬件的存取能力,没有约束。值得一提的还有一个问题是
如何做到策略透明?
2、驱动程序 VS 应用程序
值得强调的几点:
1)系统资源申请回收:用户程序资源申请忘了回收,最多导
致本身进程崩溃,而不会引起其他进程甚至系统崩溃,而驱动程序就会导致整个系
统的崩溃。
2)堆栈特点:用户空间(0~3G)堆栈(栈)比较大,可以申请到足够的空间来存放
数据,而内核空间堆栈很小,一般申请超过 1k(512 bytes)就采用动态申请,记得
申请之后要记得释放。
3)同步问题:驱动程序时刻要注意并发问题、程序的可重入问题。驱动程序必须
能够在进程上下文、中断上下文中进行;数据结构必须小心设计,多个执行线程分
开,并且避免使用全局变量,以防对数据结构造成损坏。
4)内核的并发问题:Linux 系统中, 在同一时间, 不止一个进程能够试图使用你
的驱动. 大部分设备能够中断处理器==>中断处理异步运行, 并且能在你的驱动试图
做其他事情的同一时间被调用.而且, 当然, Linux 可以在对称多处理器系(SMP)上
运行, 结果是你的驱动可能在多个 CPU 上并发执行. 最后, 在 2.6, 内核代码已经
是可抢占的了; 这个变化使得即便是单处理器会有许多与多处理器系统同样的并发
问题.[摘自linux设备驱动程序第二章]。
3、如何去实现一个完整的device driver?
这就是涉及到上面所说的内容了,我是初学者,如果各位大侠读到,希望可以
帮忙指正和指导,我将不胜感激。
1)数据结构如何去定义或者在哪里声明?
2)数据结构的内存申请采用动态还是静态方式?why?
3)内核初始化时失败后应如何处理?采用goto语句最好,why?
4)如何去避免竞态事件的产生?应如何处理?
5)如何做到程序的可重入?==>尽量避免使用全局变量。
6)内核数据如何与用户空间数据进行交互?/proc文件系统(虚拟文件系统) 系
统调用、socket网络
7)如何调试问题?最常用的方法:printk 与 用户空间的printf类似。
阅读(1608) | 评论(1) | 转发(2) |