background image

Linux 下的 编程实战之五

1.引言

  设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细
节,一般来说,Linux 的设备驱动程序需要完成如下功能:

  (1)初始化设备;

  (2)提供各类设备服务;

  (3)负责内核和设备之间的数据交换;

  (4)检测和处理设备工作过程中出现的错误。

  妙不可言的是,Linux 下的设备驱动程序被组织为一组完成不同任务的函数的集合,
通过这些函数使得 Windows 的设备操作犹如文件一般。在应用程序看来,硬件设备只是
一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。本系列文章的第
2 章文件系统编程中已经看到了这些函数的真面目,它们就是 open ()、close ()、read 
() 、write () 等。

  Linux 主要将设备分为二类:字符设备和块设备(当然网络设备及 USB 等其它设备
的驱动编写方法又稍有不同)。这两类设备的不同点在于:在对字符设备发出读/写请求
时,实际的硬件 I/O 一般就紧接着发生了,而块设备则不然,它利用一块系统内存作缓
冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调
用请求函数来进行实际的 I/O 操作。块设备主要针对磁盘等慢速设备。以字符设备的驱动
较为简单,因此本章主要阐述字符设备的驱动编写。

  2.驱动模块函数

  init 函数用来完成对所控设备的初始化工作,并调用 register_chrdev() 函数注册字符

设备。假设有一字符设备 exampledev”,则其 init 函数为:

void exampledev_init(void)

{

 if (register_chrdev(MAJOR_NUM, " exampledev ", &exampledev_fops))

  TRACE_TXT("Device exampledev driver registered error");

 else

  TRACE_TXT("Device exampledev driver registered successfully");

   //设备初始化
}

  其中,register_chrdev 函数中的参数 MAJOR_NUM 为主设备号,“exampledev”为设
备名,exampledev_fops 为包含基本函数入口点的结构体,类型为 file_operations。当执
行 exampledev_init 时,它将调用内核函数 register_chrdev,把驱动程序的基本入口点指