Chinaunix首页 | 论坛 | 博客
  • 博客访问: 190186
  • 博文数量: 76
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 831
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-31 00:52
文章分类

全部博文(76)

文章存档

2010年(58)

2009年(18)

我的朋友

分类:

2010-03-13 17:40:06


Linux设备驱动程序的结构

Linux的设备驱动程序大致可以分为如下几个部分:驱动程序的注册与注销、设备的打开与释放、设备的读写操作、设备的控制操作、设备的中断和轮询处理。

*驱动程序的注册与注销

   向系统增加一个驱动程序意味着要赋予它一个主设备号,这可以通过在驱动程序的初始化过程中调用 register_chrdev( )或者register_blkdev( )来完成。而在关闭字符设备或者块设备时,则需要通过调用unregister_chrdev( )或unregister_blkdev( )从内核中注销设备,同时释放占用的主设备号。
      
*设备的打开与释放

   打开设备是通过调用file_operations结构中的函数open( )来完成的,它是驱动程序用来为今后的操作完成初始化准备工作的。在大部分驱动程序中,open( )通常需要完成下列工作:
   1. 检查设备相关错误,如设备尚未准备好等。
   2. 如果是第一次打开,则初始化硬件设备。
   3. 识别次设备号,如果有必要则更新读写操作的当前位置指针f_ops。
   4. 分配和填写要放在file->private_data里的数据结构。
   5. 使用计数增1。

   释放设备是通过调用file_operations结构中的函数release( )来完成的,这个设备方法有时也被称为close( ),它的作用正好与open( )相反,通常要完成下列工作:
   1. 使用计数减1。
   2. 释放在file->private_data中分配的内存。
   3. 如果使用计算为0,则关闭设备。
        
* 设备的读写操作

   字符设备的读写操作相对比较简单,直接使用函数read( )和write( )就可以了。但如果是块设备的话,则需要调用函数block_read( )和block_write( )来进行数据读写,这两个函数将向设备请求表中增加读写请求,以便Linux内核可以对请求顺序进行优化。由于是对内存缓冲区而不是直接对设备进行操作的,因此能很大程度上加快读写速度。如果内存缓冲区中没有所要读入的数据,或者需要执行写操作将数据写入设备,那么就要执行真正的数据传输,这是通过调用数据结构blk_dev_struct中的函数request_fn( )来完成的。
     
* 设备的控制操作

  除了读写操作外,应用程序有时还需要对设备进行控制,这可以通过设备驱动程序中的函数ioctl( )来完成。ioctl( )的用法与具体设备密切关联,因此需要根据设备的实际情况进行具体分析。
   
* 设备的中断和轮询处理

    对于不支持中断的硬件设备,读写时需要轮流查询设备状态,以便决定是否继续进行数据传输。如果设备支持中断,则可以按中断方式进行操作。


Refer to
http://www.ibm.com/developerworks/cn/linux/l-pci/index.html
阅读(569) | 评论(0) | 转发(0) |
0

上一篇:PCI bus

下一篇:Linux 设备文件

给主人留下些什么吧!~~