内核container_of(ptr,type,member) 解析

来源:互联网 发布:网络工程项目管理 编辑:程序博客网 时间:2024/06/05 19:21

container_of(ptr,type,member) 用于根据已知的结构体里面成员member指针ptr(就是地址) 返回该成员所在的结构体的指针(就是地址), 

其中:

member是结构体类型type的成员

 ptr是当前已知的member成员的指针


计算方法:

用ptr减去member在结构体type中的偏移=当前ptr指向的成员所在的结构体的起始指针


在内核中的实现:

view plain copy
 print?
  1. kernel.h  
  2. #define container_of(ptr, type, member) ({            \  
  3.     const typeof( ((type *)0)->member ) *__mptr = (ptr);    \  
  4.     (type *)( (char *)__mptr - offsetof(type,member) );})  
  5.   
  6. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)  
(1) 计算member在结构体type中的偏移量
  1. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)  

  假如从基地址0开始存放type类型的结构体,那么((TYPE *)0)->MEMBER的值就是member在结构体type中的偏移量

(2)用member的指针地址减去(1)中计算的偏移量

         这里,一定要注意一件事:ptr是member的指针地址,但其类型未知,

    所以,在进行计算之前,首先要将ptr类型强制转换为member在结构体type中的类型。

    ((type *)0)->member )  指向结构体type中的member,

       typedef(((type *)0)->member ))  求得member的类型,

        const typeof( ((type *)0)->member ) *__mptr 将__mptr定义为type中的member类型的一个指针

        const typeof( ((type *)0)->member ) *__mptr = ptr; 将ptr的值赋给__mptr,

    至此,我们得到的__mptr就是一个类型为type中的member类型的一个指针了。

       再结合第一步,用该指针减去member在type中的偏移,就得到了member所在的type类型结构体的指针了。


0 0
原创粉丝点击