关于lld3例子open中filp->private_data = dev;这一句的理解
2011-03-10 09:30
375 查看
ldd3中说到open应完成以下工作:
1.检查设备特定的错误(注入设备未就绪或类似的硬件问题)。
2.如果设备是首次打开,则对其进行初始化。
3.如有必要,更新f_op指针。
4.分配并填写置于filp->private_data里的数据结构。
关于第4点,一直心存余虑,不明白是什么意思,看网上写的很多其他的例子,也没有做第4点的操作。
其实ldd3上面已经在release方法里面做了说明,“并不是每个close系统调用都会引起对release方法的调用,只有真正释放设备数据结构的close才会调用release方法的调用。内核对每个file结构维护其被使用多少次的计数器。对于dup/fork等系统调用,并不会创建新的数据结构(仅由open创建,在open函数中通过申请并初始化的cdev结构,运用container_of求出包含cdev的scull_dev结构,并赋值给filp->private_data,从而分配一个新的数据结构),他们只是增加对数据结构的计数。当file结构的计数减为零时,才会调用close,执行release.”
我觉得这样设计有两个目的,一是节省系统资源,二是可以与进程的设计理念相一致。
1.检查设备特定的错误(注入设备未就绪或类似的硬件问题)。
2.如果设备是首次打开,则对其进行初始化。
3.如有必要,更新f_op指针。
4.分配并填写置于filp->private_data里的数据结构。
关于第4点,一直心存余虑,不明白是什么意思,看网上写的很多其他的例子,也没有做第4点的操作。
其实ldd3上面已经在release方法里面做了说明,“并不是每个close系统调用都会引起对release方法的调用,只有真正释放设备数据结构的close才会调用release方法的调用。内核对每个file结构维护其被使用多少次的计数器。对于dup/fork等系统调用,并不会创建新的数据结构(仅由open创建,在open函数中通过申请并初始化的cdev结构,运用container_of求出包含cdev的scull_dev结构,并赋值给filp->private_data,从而分配一个新的数据结构),他们只是增加对数据结构的计数。当file结构的计数减为零时,才会调用close,执行release.”
我觉得这样设计有两个目的,一是节省系统资源,二是可以与进程的设计理念相一致。
相关文章推荐
- *dev=filp->private_data;这一句的理解
- *dev=filp->private_data;这一句的理解
- 关于su - oracle -c /data/bakup/exp.sh > /dev/null 2>&1的解释
- openGPS.cn - 关于手机号定位方面的个人理解
- 关于vim的:w !sudo tee % > /dev/null 命令
- 关于java的public,private,protect,以及默认权限的理解
- 关于目录/etc@ -> private/etc
- 关于<lable></lable>标签的理解
- 关于lua元表和元方法的例子 自己理解了并加了一些注释
- 方法重载(overload)的例子分析(摘自<深入理解Java虚拟机>)
- 关于AsyncTask<Params, Progress, Result>中三个参数的理解
- 关于Spring事务<tx:annotation-driven/>的理解。
- Android关于attempt to re-open an already-closed object: SQLiteDatabase: /data/data/
- 关于Spring-Data-Jpa的一些理解
- 前端中关于HTML标签<label>的属性for的理解
- 第三十篇:关于( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) )报错
- 关于SendMessage和PostMessage的理解的例子
- 关于 DataSnap的认识与例子
- 关于ASP中用Repeater数据填充,<%#Eval() %>和<%#Container.DataItem()%>等方法的区别
- 纠错 : 关于书籍<java核心技术 卷I 基础知识 第八版> 第五章 Employee/Manager 两个例子