Linux内核宏container_of的示例分析

2023-04-18 09:08:00 linux 内核 Container

Linux内核宏 container_of 是一个用于获取指定结构体指针的宏,它通过成员变量的地址来计算指定结构体的地址。它的定义如下:

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

container_of 宏的第一个参数 ptr 是指向成员变量的指针,第二个参数 type 是结构体的类型,第三个参数 member 是结构体中的成员变量名称。它的作用是通过成员变量的地址计算指定结构体的地址。下面通过一个示例来说明 container_of 的用法:

struct foo {
    int a;
    char b;
    int c;
};

int main()
{
    struct foo foo;
    foo.a = 10;
    foo.b = 'a';
    foo.c = 20;

    char *ptr = &foo.b;
    struct foo *foo_ptr = container_of(ptr, struct foo, b);

    printf("foo_ptr->a = %d\n", foo_ptr->a);
    printf("foo_ptr->b = %c\n", foo_ptr->b);
    printf("foo_ptr->c = %d\n", foo_ptr->c);

    return 0;
}

上面的代码定义了一个名为 foo 的结构体,结构体中包含三个成员变量,分别为 a、b 和 c。在 main 函数中,我们创建了一个 foo 结构体的实例,并且设置了其成员变量的值。然后,我们定义了一个指向 b 成员变量的指针 ptr,并使用 container_of 宏来获取 foo 结构体的指针 foo_ptr。最后,我们通过 foo_ptr 来访问 foo 结构体中的成员变量。

container_of 宏的实现原理是通过成员变量的地址和结构体的大小来计算结构体的地址。首先,它使用 typeof 宏来获取成员变量的类型,然后使用 offsetof 宏来获取成员变量在结构体中的偏移量,最后,它将成员变量的地址减去偏移量,就可以计算出结构体的地址了。

container_of 宏是 Linux 内核中一个非常有用的宏,它可以帮助我们快速获取指定结构体的指针,在许多场景下都可以使用到它。

相关文章