Linux字符设备驱动程序的设计字符设备驱动程序的设计
绍了Linux字符设备驱动程序中建立设备 ,初始化设备、设备的资源分配和如何访问设备的方法及相关函数的实
现.
设备驱动程序实质上是一组完成不同任务的函数的集合 ,通过这些函数所提供的功能可以使得从设备接受输入和将输出送到设
备就象读写文件一样 ,因此 ,Linux中的每一个设备都具有文件的外在特征 ,都能使用open() ,close() ,read() ,write()等系统调用.
Linux设备驱动程序的主要功能有:
a 初始化设备;
b 提供各类设备服务;
c 负责内核和设备之间的数据交换;
d 检测和处理设备工作过程中出现的错误.
1 命名规则
每个设备的驱动程序都有一组实质上相同的函数 ,并且都需添加至内核原码中以重新生成内
核 ,因此为了防止不同驱动程序之间函数名的冲突 ,必须确保名称的唯一性 ,最好的方法是在各驱
动程序的函数前加一以设备名为字符串的前缀.
本文约定要开发驱动程序的设备名为“mydev”.
2 设备文件的建立
为了使对设备的读写操作象文件的存取一样处理 ,Linux所有的设备在目录树中的适当位置都有相对应的文件名称 ,这样才能对
它们进行open() 、close()等系统调用;这些文件称为字符设备特殊文件或块设备特殊文件 ,一般存放在/ dev目录中 ,如主硬盘第
一分区的块设备特殊文件为/ dev/hda0 ,第一虚拟控制终端的字符设备特殊文件为/ dev/tty1.设备特殊文件的建立使用mknod命
令或mknod()系统调用(只有root 帐号才有权建立) ,命令格式为:mknod filename type major minor ,其中filename 为要建立的设
备特殊文件名(含路径) ,type 说明
设备类型(c 为字符设备 ,b为块设备) ,major 和minor 说明与该文件结合的主设备号和次设备号.
如: # mknod/ dev/mydev c 40 1 命令 ,用主设备号 40 和次设备号 1 建立了字符设备特殊文件/dev/mydev.
3 init 函数
init 函数用来完成对所控设备的初始化工作 ,以及调用 register- chrdev()函数来注册字符设备.
根据命名规则和本文约定 ,设备“mydev”的init 函数为:
void mydev- init(void)
{
if(register- chrdev(40“, mydev”,&mydev- fops))
TRACE- TXT“( Device(40) driver registered error”)
else
TRACE- TXT“( Device(40) driver registered successfully”)
∥以下为对设备进行初始化的代码 ,略
}
其中 ,register- chrdev函数中的参数40 为主设备号“, mydev”为设备名 ,mydev- fops 为以下所要介绍的包含基本入口点的结构 ,
类型为file- operations;当执行 myder- init 时 ,它将调用内核函数 reg2ister- chrdev,把驱动程序的基本入口点指针存放在内核的
字符设备地址表中 ,在用户进程对该设备执行系统调用时提供入口地址.
4 基本入口点
每个设备驱动程序都有一个称为file- operation 的数据结构 ,其中包含指向驱动程序内部大多数函数的入口(函数指针) ,完整结
构如下:
struct file- operations {