linux内核第一宏:continer_of
c吧
全部回复
仅看楼主
level 5
1、continer_of概念
是Linux内核中用于根据结构体成员的指针反向获取整个结构体地址的宏,被称为"Linux内核第一宏",通过结构体成员的地址反向推导出包含该成员的结构体地址,常用于设备驱动、链表操作等场景。
2、continer_of使用和原理
接口:container of(ptr,type, member)
参数说明
·ptr:指向结构体成员的指针
·type:包含该成员的结构体类型
·member:结构体中该成员的名称
返回值:结构体地址
原理:
通过offsetof宏计算成员在结构体中的偏移量,再用成员地址减去偏移量得到结构体基址。
#define offsetof(TYPE,MEMBER) ((size t)&((TYPE *)0)->MEMBER)
#define container of(ptr,type, member)
({void * mptr = (void *)(ptr);
((type *)( mptr - offsetof(type, member)));
})
offsetof宏中计算成员member的偏移量
ptr减去偏移量就是结构体起始地址。
3、continer_of在开发中作用
(1)极其重要且广泛使用
container_of 是 Linux 内核中用于通过结构体成员地址反推结构体起始地址的核心宏。在面向对象风格的内核代码(如设备驱动、链表操作)中无处不在。
(2)历史悠久,地位稳固
自早期 Linux 内核版本就存在,几乎每个内核开发者都会用到或必须理解它
(3)面试/笔试高频题
在内核或驱动开发岗位面试中,containerof 的实现和原理几乎是必考题,因此被开发者戏称为“第一宏”。
2025年09月20日 13点09分 1
1