Linux内核中的链表浅析

本文详细介绍了双向链表的底层定义、常用的list_first_entry,list_next_entry等宏以及container_of宏的使用,还涉及typeof操作符在类型获取中的应用,重点讲解了Linux内核中的相关概念。
摘要由CSDN通过智能技术生成

一、双向链表的定义:

一般有很多不同的宏但是最底层还是由下面来定义的,假如我先定义一个list双向链表kmalloced_params:

static LIST_HEAD(kmalloced_params); 
->struct list_head name = LIST_HEAD_INIT(kmalloced_params) //所以默认的话头指针和尾指针都是变量本身 
->struct list_head name = { &(kmalloced_params), &(kmalloced_params) } 

//结构体原型 
struct list_head { struct list_head *next, *prev; }; 

//链表头初始化原型 
#define LIST_HEAD_INIT(name) { &(name), &(name) }

二、双向链表常见的宏

1、获取链表项里面的第一个元素list_first_entry:

list_first_entry(head, typeof(*pos), member);

->list_entry(head->next, typeof(*pos), member)

->container_of(head->next, typeof(*pos), member)

2、获取链表项里面的下一个元素list_next_entry

list_next_entry(pos, member)

->list_entry(pos->member.next, typeof(*(pos)), member)

->container_of(pos->member.next, typeof(*pos), member)

宏本身的最底层实现还是由container_of实现的。

3、判断是否为头结点

list_next_entry(pos, member)

->list_entry(pos->member.next, typeof(*(pos)), member)

->container_of(pos->member.next, typeof(*pos), member)

注:此宏定义常用于判断链表是否遍历结束。因为双向链表最终都是头尾相连的。

三、相关的宏定义

1、typeof解释:

typeof 是一个特殊的操作符,用于获取一个表达式的类型。typeof 可以用于变量声明中,以便声明一个与另一个变量相同类型的新变量,或者用于宏定义以实现泛型编程的某些方面。

比如:

int a = 10; 
typeof(a) b = 100;

2、container宏的使用方法:

这个宏定义是通过一个结构体类型的成员地址,获取到整个结构体类型的成员地址

container_of 是 Linux 内核中提供的一个宏,它的作用是反推出包含某个成员的结构体的地址。具体来说,当你有一个指向结构体中某个成员的指针,而你想获得这个成员所在的结构体的地址时,container_of 就非常有用了。

宏定义原型如下:

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

用法:

struct my_struct {  
    int some_data;  
    struct list_head my_list;  
};

struct list_head *my_list_ptr; // 假设这个指针已经初始化并指向了某个 my_struct 中的 my_list 成员  
struct my_struct *my_struct_ptr = container_of(my_list_ptr, struct my_struct, my_list);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值