Linux内核中的container_of浅析

785
2023/11/22 8:19:49
栏目: 编程语言
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

container_of是Linux内核中的一个宏定义,用于根据结构体中的某个成员变量的地址,找到该结构体的起始地址。

宏的定义如下:

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

宏的参数解释:

  • ptr:指向某个结构体成员变量的指针。
  • type:结构体的类型。
  • member:结构体中成员变量的名称。

该宏实际上是通过将指向成员变量的指针转换为结构体指针,来实现找到结构体起始地址的目的。它的实现思路是:

  1. 先定义一个指向成员变量的指针__mptr,类型为成员变量所属结构体的类型。
  2. 然后通过offsetof宏获取成员变量在结构体中的偏移量,再通过(char *)__mptr - offsetof(type, member)计算出结构体的起始地址。
  3. 最后将起始地址转换为结构体指针,并返回。

举个例子来说明,假设有如下定义的结构体和变量:

struct example_struct {
    int a;
    int b;
    int c;
};

struct example_struct example;
int *ptr = &(example.b);

可以使用container_of宏来找到结构体example的起始地址,示例如下:

struct example_struct *p = container_of(ptr, struct example_struct, b);
printf("%p\n", p);  // 输出结构体example的起始地址

总结来说,container_of宏是Linux内核中一个十分有用的宏定义,可以根据结构体中的成员变量的地址快速找到结构体的起始地址,进而方便地进行操作。在内核中,它常常被用于实现类似链表、队列等数据结构的遍历和操作。

辰迅云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读: linux怎么查看mysql安装路径