file-fops-inode-dev_t之间一些关系
来源:互联网 发布:耳朵听力测试软件 编辑:程序博客网 时间:2024/06/04 18:37
本文为转载,仅作自己学习使用。
各种驱动形式本质还是把fops注册到inode中。
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);
[1]. 建立了设备号与inode名称的映射关系,这样通过文件名可以找到设备号,通过设备号就能找到dev结构,
[2]. 通过dev->device_private->driver_data就能解析出fops,从而给系统调用open时建立file operation
linux平台驱动其实不是真正的“驱动”它只不过做点初始化硬件的事情(在probe函数里)真正操作设备的函数在device结构里。
这里体现了C++类的影子
3.简单点说系统调用open会建立一个file结构体,并且通过文件名和路径找到inode结构,并提取i_fop给fops
4.至于提取的过程
</pre><pre name="code" class="html">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里导出到用户空间使用
- file-fops-inode-dev_t之间一些关系
- vfs的superblock、inode、dentry、file之间的关系
- dentry与inode节点之间的关系
- dev_t
- 简单理解 struct inode 和 struct file,cdev 和 inode的关系
- 简单理解 struct inode 和 struct file,cdev 和 inode的关系
- 一些重要的数据结构(file_operation,file和inode)
- File Offest和RVA之间的关系
- 浅析FILE和fd之间的关系
- FILE内容和fd之间的关系
- file_operation, inode, file
- inode,vnode,file
- file_operations file inode
- inode file 浅析
- struct file struct inode
- struct file& struct inode
- file inode 结构体
- struct file struct inode
- java证书加解密过程
- test
- 创建Cordova插件
- HDU 5768Lucky7-中国剩余定理+容斥原理
- ubuntu单机下安装多mysql 5.7.14
- file-fops-inode-dev_t之间一些关系
- 洛谷 P1064 [NOIP2006 T2] 金明的预算方案
- SCU 1685 Chopsticks
- Cordova 开发属于自己的插件(plugin)
- Filter的用法
- 双城记
- 2007---平方和,立方和
- SPOJ 7258 SUBLEX - Lexicographical Substring Search【SAM,我要报警x
- sql笔记