-
-
[推荐]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进行类型转换。我不明白为设么这样做。
最近在学习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漏洞挖掘与利用;代码审计。
赞赏
他的文章
看原图