内核链表实现分析与使用(双向环形链表)
内核对链表进行了封装
理解本部分内容需要配合《整理–Misc类设备驱动》这一文中链表的相关使用示例以及基本链表的知识。使用内核链表需要定义一个链表头,然后在需要管理的结构体中内嵌链表节点(通常又叫做链表入口entry,我是觉得挺形象的,更易于理解)
以下内容位于include/linux/List.h
1.链表的初始化
分为链表头的初始化和需要添加的入口entry的初始化
2.入口entry的插入
这里有一些小插曲,一开始,直接把函数参数替换掉展开,头插入的时候发现没有问题,但是尾插入的时候发现有不对劲:
仔细分析**__list_add函数,函数形参struct list_head *prev
struct list_head *next
保存了相对于当前要处理的entry**的上一个和下一个的struct list_head变量的地址。
简化了问题,更易于理解,头插入和尾插入变成了只要给出对应前后节点对应的地址就能简便处理,和之前的接触过的链表不一样在于以前的链表没有连接成环
3.入口entry的删除
4.遍历链表
container_of宏:
https://github.com/TongxinV/oneBook/issues/17
5.还有其他方式不过多赘述