文章目录
- container_of 宏
- container_of 宏的定义
- container_of 使用示例
- 应用场景
- 总结
container_of 宏
在Linux内核编程中,container_of
宏是一个非常有用的工具,它允许开发者从指向结构体中某个成员的指针反向获得包含它的完整结构体的指针。这在实现基于链表的数据结构和其他核心数据结构时非常常见,并且是驱动开发和内核模块中广泛使用的技术。
container_of 宏的定义
container_of
宏通常如下定义:
#define container_of(ptr, type, member) ({ \const typeof( ((type *)0)->member ) *__mptr = (ptr); \(type *)( (char *)__mptr - offsetof(type,member) );})
ptr
:指向结构体成员的指针。type
:包含该成员的结构体的类型。member
:ptr
指向的成员在type
中的名字。
container_of
宏的核心在于offsetof
宏,它计算成员相对于结构体开始位置的偏移。container_of
通过将成员的指针减去其偏移量来计算包含它的结构体的初始地址。
container_of 使用示例
假设我们有一个结构体my_struct
,其中包含一个int
类型的成员value
,以及一个list_head
成员用于将多个这样的结构体链接在一起。
struct my_struct {int value;struct list_head list;
};
现在,如果我们有一个指向list
成员的指针ptr
,我们希望找到这个ptr
所在的my_struct
结构体实例:
struct list_head *ptr; // 假设这个指针指向某个my_struct实例中的list成员
我们可以使用container_of
宏来获取指向包含ptr
的my_struct
实例的指针:
struct my_struct *parent = container_of(ptr, struct my_struct, list);
这样,parent
就是指向那个包含指定list_head
成员的my_struct
实例的指针。
应用场景
container_of
宏在Linux内核中的应用场景非常广泛,尤其是在实现和使用链表时。Linux内核提供了一个通用链表实现,即list_head
结构体,它常见于各种内核数据结构中。使用container_of
可以方便地从链表节点跳转到包含该节点的完整数据结构,极大地增加了数据处理的灵活性和效率。
总结
container_of
宏是Linux内核开发中一个强大的工具,它通过成员指针反向获得包含该成员的完整结构体的指针,广泛应用于链表和其他数据结构的实现中。理解和熟练使用这一宏对于深入Linux内核编程至关重要。