您的位置:首页 > 运维架构 > Linux

Linux字符设备驱动程序的设计

2008-01-21 16:28 302 查看
2007-12-25 09:23:28





摘 要  介绍了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 {
 int ( 3lseek) () ;
 int ( 3 read) () ;
 int ( 3write) () ;
 int ( 3 readdir) () ;
 int ( 3 select) () ;
 int ( 3ioctl) () ;
 int ( 3mmap) () ;
 int ( 3open) () ;
 void ( 3 release) () ;
 int ( 3fsync) () ;
 int ( 3fasync) () ;
 int ( 3check- media- change) () ;
 void ( 3 revalidate) () ;

};
大多数的驱动程序只是利用了其中的一部分(对于驱动程序中不提供的功能 ,把相应位置的值设为NULL) ,对于字符设备来说 ,要提供的主要入口有:open() 、release() 、read() 、write() 、ioctl() ,现分别说明如下:

open()函数  对设备特殊文件进行open()系统调用时 ,将调用驱动程序的open()函数:int open(struct inode 3inode ,struct file 3file) ,其中参数inode 为设备特殊文件的 inode(索引结点)结构的指针 ,参数file 是指向这一设备的文件结构的指针.open()的主要任务是确定硬件处在就绪状态、验证次设备号的合法性(次设备号可以用MINOR(inode -
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: