第六章 字符设备驱动
cdev结构体是描述一个设备,同时该结构体用于设备注册,进行设备注册有专门的接口
file_operations结构体是用来描述字符设备驱动提供的操作接口的集合,linux所有文件操作,open,read,write和close最终都会调用到file_operations结构体中
file_operations结构体是字符设备和linux内核之间的接口描述, 是用户空间对linux系统调用的最终落实者。
file_operations结构体一般的字符设备驱动需要实现的是write,read和ioctl函数
一般的字符设备驱动里面包含设备初始化,设备卸载和设备命令控制三个结构体
设备初始化函数的功能是申请设备号和注册设备
设备卸载函数的功能是释放设备号和注销设备
设备命令控制函数功能是实现预先设定好的命令功能,并返回命令执行以后的结果
在进行设备驱动的开发的时候,一般会在开始位置定义一个字符设备驱动相关的结构体,里面包含cdev参数,字符设备私有数据,相关信号量等。
下图表示字符设备驱动与设备,字符设备驱动本身结构,用户空间访问字符设备驱动的关系。
linux字符设备驱动结构:
1)实现设备结构体cdev
2)运行设备初始化函数,使用module_init()函数进行声明,同时在插入模块的时候调用初始化函数。在初始化函数中需要执行的操作如下:
a)申请设备运行所需的内存
b)注册设备
c)添加设备结构体cdev到系统中
3)实现file_operations结构体中的函数,read,write,ioctl,open,close等
4)实现设备退出函数,使用module_exit()函数声明,在这个函数中注销设备,同时释放申请的内存,删除添加的设备结构体。
linux字符设备驱动运行流程:
1.使用insmod命令插入驱动模块
2.使用mknod命令根据设备的主设备号(使用 cat /proc/devices命令查询)和次设备号建立设备节点
3.通过echo命令向设备节点中写字符信息
4.通过cat命令从设备节点中读取设备中的字符信息
5.使用rm -f 命令删除设备节点
6.使用rmmod删除模块