首页
社区
课程
招聘
[推荐]container_of 宏
2009-6-24 14:56 5410

[推荐]container_of 宏

2009-6-24 14:56
5410
内核中的container_of宏
最近在学习c语言。不小心碰到了内核头文件中的一段宏,觉得非常精辟。拿来跟大家分享,同时也有点疑问,
请大家不吝指教哈!

#define container_of(ptr, type, member) ({                      \
          const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
          (type *)( (char *)__mptr - offsetof(type,member) );})
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

container_of宏,用来根据结构体成员的地址,来获得结构体首地址。
ptr为结构体成员的地址,type为结构体变量类型,member为结构体成员。

第一个宏有个特别的地方是 typeof. 内核头文件中,并没有typeof这个宏,网上查资料,typeof 是在编译期间gcc自动支持的。
用来分析变量名的类型。
第二段宏(TYPE *)0也比较特别。理解是,(TYPE*)0的起始地址为0,而&((TYPE *)0)->MEMBER)的地址,也就是成员变量相对与首地址的偏移。

对这段宏,我有个不完全理解的地方是,
#define container_of(ptr, type, member) ({                      \
          const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
          (type *)( (char *)__mptr - offsetof(type,member) );})
如果改为
#define container_of(ptr, type, member) ({                      \
          (type *)( (char *)ptr - offsetof(type,member) );})
我在测试过程中,是能正常工作的。而实际宏的编写,避免直接对ptr进行类型转换。我不明白为设么这样做。

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回