内核代码学习
list_entry()
作用:获取ptr所属结构体的首地址
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
// ptr:指向list_node类型的指针
// type:一个结构体
// member:结构type中的一个域
使用示例
- ptr为head.member
- ptr所属结构体为numlist
- 获取ptr所属结构体的首地址也就是获取head
// 链表
struct list_node
{
struct list *prev,next;
}
struct numlist
{
int num;
struct list_node member;
};
// 使用
struct numlist head;
struct numlist *p = list_entry(head.member,struct numblist,member)
// p 的地址就是 head 的地址
p.num;//相当于head.num
为什么这么做?
- 因为遍历的时候是用head.member在遍历,此时是赋值给某个变量例如pos,而没有head的首地址,因为要取出num所以需要首地址