内核链表
1 list_head 结构
为了使用链表机制,驱动程序需要包含<linux/types.h>头文件,该文件定义了如下结构体实现双向链:
struct list_head {
struct list_head *next, *prev;
};
2 链表的初始化
2.1 链表宏定义和初始化
可使用以下宏定义并初始化一个链表头部list_head,list_head 不包含数据部分。LIST_HEAD_INIT将链表头的 next 和 prev 指针都指向链表头部,从而形成一个循环结构,和下面介绍的INIT_LIST_HEAD函数一样。
#define LIST_HEAD_INIT(name) {
&(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
2.2 链表的初始化
INIT_LIST_HEAD 是一个用于初始化链表头的函数,它将链表头的 next 和 prev 指针都指向自己,从而形成一个循环结构。
static inline void INIT_LIST_HEAD(struct list_head *list)
{
WRITE_ONCE(list->next, list);
WRITE_ONCE(list->prev, list);
}
如下图所示,链表头的 next 和 prev 指针都指向自己。
3 list_add
在链表的头部添加新链表项,以下是实现:
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head