Linux字符设备驱动中container_of宏的作用

Linux字符设备驱动中container_of宏的作用

首先看看这个宏的原型:

container_of(ptr,type,member)

功能:根据一个结构体变量中的一个成员变量的指针来获取指向整个结构体变量的指针。

参数:

          ptr:已知的结构体成员的首地址(指针);

          type:要获取的结构体变量的类型

          member:要获取的结构体变量中成员的名字,而不是类型

返回值:要获取的结构体变量的首地址

驱动中常用的用法:

struct hello_device

{

          struct cdev cdev;

          char  data [128];

}hello_device[2];

hello_device[0]   //对应 设备0

hello_device[1]   //对应 设备1

int hello_open(struct inode * inode,struct file * file)
{

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

      file->private_data = dev;

}

ssize_t hello_read(struct file*,char __user *buff,size_t count,loff_t*)

{

        struct hello_device * dev = file->private_data;

        //dev指向打开的设备结构体

        copy_to_user(buff,dev->data,count);

}

      当我们成功insmod一个设备驱动的时候,我们会通过mknod创建一个设备节点和一个具体的设备(驱动)关联,这个节点就对应这个inode结构体的一个实例,这个实例有一个struct cdev类型的字段i_cdev,它会指向hello_device中的cdev结构体(初始化cdev时候完成的)。最终获取到hello_device结构体的首地址,其cdev已经被实例化,对应一个具体的设备。

       所以我们可以根据dev->cdev.dev就可以获得当前这个设备的设备号。然后包含具体设备信息的dev结构体就可以通过file中的private_data成员在open,read,write,ioctl之间传递。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值