linux驱动之--fops的关联
来源:互联网 发布:唯一网络王宇杰简介 编辑:程序博客网 时间:2024/04/30 18:26
转自http://blog.csdn.net/zssmcu/article/details/6746770
1.各种驱动形式不过是表象,本质还是把fops注册到inode中。
2.一直没有找到确实的“证据”不过还是有点线索的:
device_create->device_create_vargs-> dev_set_drvdata(dev, drvdata)把fops设置到了dev->p->driver_data中 device_register->device_add->devtmpfs_create_node->vfs_mknod这里应该就是终点了
注:前半部分把fops函数数组放到了dev->device_private->driver_data中,后半部分vfs_mknod(nd.path.dentry->d_inode,dentry, mode, dev->devt);建立了设备号与inode名称的映射关系,这样通过文件名可以找到设备号,通过设备号就能找到dev结构,通过dev->device_private->driver_data就能解析出fops,从而给系统调用open时建立file operation
Linux平台驱动其实不是真正的“驱动”它只不过做点初始化硬件的事情(在probe函数里)真正操作设备的函数在device结构里。
这里体现了C++类的影子
3.简单点说系统调用open会建立一个file结构体,并且通过文件名和路径找到inode结构,并提取i_fop给fops
4.至于提取的过程
static int chrdev_open(struct inode *inode, struct file *filp)
{
struct cdev *p;
struct cdev *new = NULL;
int ret = 0;
spin_lock(&cdev_lock);
p = inode->i_cdev;
if (!p) {
struct kobject *kobj;
int idx;
spin_unlock(&cdev_lock);
kobj = kobj_lookup(cdev_map, inode->i_rdev, &idx);
if (!kobj)
return -ENXIO;
new = container_of(kobj, struct cdev, kobj);
spin_lock(&cdev_lock);
/* Check i_cdev again in case somebody beat us to it while
we dropped the lock. */
p = inode->i_cdev;
if (!p) {
inode->i_cdev = p = new;
list_add(&inode->i_devices, &p->list);
new = NULL;
} else if (!cdev_get(p))
ret = -ENXIO;
} else if (!cdev_get(p))
ret = -ENXIO;
spin_unlock(&cdev_lock);
cdev_put(new);
if (ret)
return ret;
ret = -ENXIO;
filp->f_op = fops_get(p->ops);
if (!filp->f_op)
goto out_cdev_put;
if (filp->f_op->open) {
ret = filp->f_op->open(inode,filp);
if (ret)
goto out_cdev_put;
}
return 0;
out_cdev_put:
cdev_put(p);
return ret;
}
注:貌似只有 open(!/dev/testchar!, O_RDWR) 打开才是这样的,因为/dev目录下都是字符的驱动,是不是使用cdev的都不在sysfs内呢?
在linux设备模型浅析之设备篇中有段描述:device_add定义在drivers/base/core.c中
int device_add(struct device *dev)
{
................
if (MAJOR(dev->devt)) {
error = device_create_file(dev, &devt_attr); //如果存在设备号则添加dev_t属性,这样udev就能读取设备号属性从而在/dev/目录下创建设备节点,这样kobj和cdev也关联了
if (error)
goto ueventattrError;
注:所以我一直追求的目标貌似在这里,是udev把device里包含的fops关联到cedv里,然后chrdev_open就顺理成章了!!
补充点内容:device结构有个device_private用来放一些不想对外开放的东西,其中还有个driver_data。所以是这样的device->p->driver_data
一般情况下这里放的是file_operations但是也未必,对于platform来说有2个函数void *dev_get_drvdata(const struct device *dev)
和void dev_set_drvdata(struct device *dev, void *data)
注册的时候set,至于以后怎么用就不一定了,比如LED的驱动,使用get函数又取出数据,放在了attr里导出到用户空间使用
- linux驱动之--fops的关联
- linux驱动之--fops的关联
- linux驱动之--fops的关联
- linux驱动之--fops的关联
- Linux驱动关联丢失处理
- linux设备与驱动关联的全过程分析
- Linux中总线、设备、驱动是如何关联的?
- 浅谈linux驱动之-驱动的使用
- 关于设备模型、设备与驱动关联的过程分析 - linux设备/驱动
- 设备驱动----Linux中总线、设备、驱动是如何关联的?
- 设备驱动模型----Linux中总线、设备、驱动是如何关联的
- 0723 linux中设备与驱动关联
- Linux 4.0的驱动开发读书笔记之驱动的概述
- linux设备驱动之pci设备的驱动架构
- linux 驱动学习之scull驱动的安装
- linux NAND驱动之六:NAND驱动的probe流程
- linux NAND驱动之六:NAND驱动的probe流程
- Linux的input输入子系统:设备驱动之按键驱动
- Three.js 添加阴影
- (一)Liferay-可配置portlet
- python学习记录--元组
- 洛谷 P1056 排座椅
- Python学习(三)——map和reduce函数
- linux驱动之--fops的关联
- OAuth2授权原理
- HOW--如何评估线程池线程的个数(79)
- HDU 1016 Prime Ring Problem (dfs)
- Meteor学习路程(三)之数据库的例子(1)【查询】
- 视频电商网站实战 - 开始编写会员中心脚手架代码
- Influxdb-官方文档摘录
- Android之改变状态栏的颜色使其与APP风格一体化
- 抽象类基本语法