container_of用法

发布时间 2024-01-08 11:24:32作者: qsy_edt

在Linux内核源码中,实现和链表相关的接口list_entry()时,会调用container_of()宏定义,它的作用是:给定结构体中某个成员的地址、该结构体类型和该成员的名字获取这个成员所在的结构体变量的首地址。有点绕,没关系,接着往下看就能明白了。
container_of()宏定义实现如下所示

/**
* container_of - cast a member of a structure out to the containing structure
*
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})

例:

struct imx6uirq_dev *dev = container_of(work, struct imx6uirq_dev, taskwork);

字符设备结构体如下

//字符设备驱动结构体
struct imx6uirq_dev{
dev_t devid; /* 设备号 */
struct cdev cdev; /* cdev */
struct class *class; /* 类 */
struct device *device; /* 设备 */
int major; /* 主设备号 */
int minor; /* 次设备号 */
struct device_node *nd; /* 设备节点 */

struct irq_keydesc irqkey[KEY_NUM];//按键结构体 1个按键一个

struct timer_t tim;

atomic_t keyvalue;
atomic_t keyrelease;
struct work_struct taskwork; //任务队列的另一个形式

}imx6uirq;