Chinaunix首页 | 论坛 | 博客
  • 博客访问: 440147
  • 博文数量: 139
  • 博客积分: 106
  • 博客等级: 民兵
  • 技术积分: 613
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-24 16:03
文章分类

全部博文(139)

文章存档

2016年(1)

2014年(16)

2013年(23)

2012年(98)

2011年(1)

分类:

2012-04-01 10:45:08

    第一次看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类似。
   
 
阅读(760) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~