linux字符设备驱动
字符驱动设备相关的数据结构
cdev结构体
1 | struct cdev { |
以上结构体是对字符设备的抽象,其结构非常简单,包含了sysfs相关的kobj,驱动相关的owner,操作结构相关的ops,设备号dev和次设备号count,同时有一个双向链表用于链接所有此类字符设备。
字符设备相关操作接口
1 | MAJOR(dev_t dev) |
以上宏用于从设备号获得主设备号与次设备号、从主设备号与次设备号或的设备号。
1 | /* 参数:字符设备指针,文件操作指针 |
file_operations结构体
1 | struct file_operations { |
file_operations相当于一个接口类,定义了一个文件所应具备的所有操作接口,不同的文件或设备通过继承来实现对应的接口函数,就能够通过这种统一标准的接口向上层通过系统调用来提供服务。
字符设备驱动的组成
字符设备驱动的加载和卸载
任何设备驱动都必须要实现加载和卸载函数,其实现的具体过程可能不同,但这两个接口是必须要有的,这是将设备驱动投入内核和从内核中离开的统一接口。
1 | struct xxx_dev_t { |
字符设备驱动的file_operations接口实现
file_operations结构体中的成员函数是字符设备驱动于内核虚拟文件系统的接口,是用户空间进行文件相关系统调用的最终落实者,其中read(),write(),ioctl()是三个最常见的接口,也是大多数字符设备都会实现的。在驱动中实现这些接口的形式如下。
1 | ssize_t xxx_read(struct file *filp, char __user *buf, size_t count, loff_t *f_ops) |
以上这些接口的实现中,关键部分是内核空间于用户空间的界面,这儿包含了两种不同内存空间的数据交换和合法性检查。
其中包含合法性检查的内存数据交换接口包括:
1 | get_user(x, ptr) |
不包含合法性检查的接口:
1 | __get_user(x, ptr) |
对于不包含合法性检查的接口在使用前必须进行合法性检查,即如下所示:
1 | ... |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yxhlfx@163.com
文章标题:linux字符设备驱动
本文作者:红尘追风
发布时间:2016-05-07, 17:53:18
原始链接:http://www.micernel.com/2016/05/07/linux%E5%AD%97%E7%AC%A6%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。