linux内核中宏container_of是干什么的?

Linux Kernel Version 4.14

1. container_of是干什么的?

  已知一个结构体中某个成员的首指针,那么就可以通过宏container_of来获得此结构体的首指针

2 先看看container_of是如何定义的吧

#define container_of(ptr, type, member) 
    (type *)((char *)(ptr) - (char *) &((type *)0)->member)

  解析一下各参数:

  ptr: 结构体成员的指针

  type: 结构体的类型

  member: 结构体成员的名字

2. 举一个例子

  2.1 有两个结构体如下:

    struct element1 {

      struct element2 struct_element2;

      int element3;

    }

    struct element2 {

      int element4;

    }

  2.2 定义一个struct element1变量element

    struct element1 element

  2.3 已知结构体变量element中成员element3的地址为0x2d,通过结构体struct element1中的成员element3来获取结构体变量element的地址

    container_of(element3_ptr,struct element1,element3)

  2.4 拆开

    (struct element1 *)((char *)(&element3) - (char *) &((struct element1 *)0)->element3)

    从已知可得:

    &element3=0x2d;

    (char *)(&element3)=0x2d;

    (struct element1 *)0=地址为0x0,指向的内容为一个struct element1结构体;

    ((struct element1 *)0)->element3=结构体中element3的内容;

    &((struct element1 *)0)->element3=取结构体中element3的地址,这是偏移地址,为0x04;

    (char *)&((struct element1 *)0)->element3=0x04;

    最终:

    ((char *)(&element3) - (char *) &((struct element1 *)0)->element3)=0x2d - 0x04) = 0x29

    (struct element1 *)0x29 = 0x29,0x29这个地址指向的是一个结构体struct element1,那么这就是element变量的地址

    

    可以结合下图观看:

  

    

    

原文地址:https://www.cnblogs.com/dakewei/p/10537095.html