注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学习笔记

正确的方法如同学习书法,开始的时候要临摹,临摹好了然后创造自己的风格。

 
 
 

日志

 
 

[Linux笔记]inode结构、open方法以及container_of含义  

2011-06-19 09:05:54|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

inode

       inode中包含了大量有关文件的信息,但是只有下面两个字段对编写驱动程序代码有用:

dev_t                   i_rdev;

       对于代表设备文件的inode结构, 这个成员包含实际的设备编号。

union {

       struct pipe_inode_info  *i_pipe;

       struct block_device     *i_bdev;

       struct cdev             *i_cdev;

};

       struct cdev是表示字符设备的内核的内部结构。当inode指向一个字符设备文件时,该字段包含了指向struct cdev结构的指针。

       可以使用两个宏来从一个inode中获得主设备号和次设备号,而不是直接操作i_rdev。

unsigned int iminor(struct inode *inode);

unsigned int imajor(struct inode *inode);



open和release

open方法

       open方法提供给驱动程序以初始化的能力,从而为以后的操作完成初始化做准备。在大部分的驱动程序中,open应该完成如下工作:

*      检查设备特定的错误(诸如设备未就绪或类似的硬件问题)。

*      如果设备是首次打开,则对其进行初始化。

*      如有必要,更新f_op指针。

*      分配并填写置于filp->private里的数据结构。

       然而,首先要做的是确定要打开的具体设备。注意,open方法的原型如下:

int (*open)(struct inode *inode , struct file *flip);

       其中的inode参数在其i_cdev字段中包含了我们所需要的信息,即我们先前设置的cdev结构。唯一的问题是,我们通常不需要cdev结构本身,而是希望得到包含cdev结构的其他结构。可以通过定义在<linux/kernel.h>中的container_of宏实现:

container_of(pointer, container_type, container_field);

       这个宏需要一个container_field字段的指针,该字段包含在container_type类型的结构中,然后返回包含该字段的结构指针。如下所示:

/*****************************************************************/

struct scull_dev *dev;      /*device information*/

dev=container_of(inode->i_cdev, struct scull_dev, cdev);

filp->private_data=dev;     /*for other methods*/

/*****************************************************************/

       一旦代码找到scull_dev结构之后,scull将一个指针保存到了file结构中的private_data字段中,这样可以方便今后对该指针的访问。

       或对于一个给定的kobject指针,获得它的结构指针。比如,对包含在cdev结构中的,名为kp的kobject结构指针进行转换的代码如下:

/*****************************************************************/

struct cdev *device = container_of(kp, struct cdev, kobj);

/*****************************************************************/

参考:
Linux设备驱动程序 3rd
  评论这张
 
阅读(1653)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018