Linux 下的 C 编程实战之五
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,把驱动程序的基本入口点指