找工作哪个网站好2022,制作企业网站怎么做,成都的设计院,网页打不开验证码图片以下内容源于朱有鹏嵌入式课程的学习与整理#xff0c;如有侵权请告知删除。 一、内核链表的设计思路
1、普通链表的数据区域的局限性 如果链表节点要存储一个int类型的数据#xff0c;可以在数据区域定义int data。但是实际编程中#xff0c;链表的节点不会这么简单#…以下内容源于朱有鹏嵌入式课程的学习与整理如有侵权请告知删除。 一、内核链表的设计思路
1、普通链表的数据区域的局限性 如果链表节点要存储一个int类型的数据可以在数据区域定义int data。但是实际编程中链表的节点不会这么简单而是复杂多样的。 实际项目中的链表往往把数据区封装为一个结构体。链表解决的问题是多样的因此数据区对应的结构体的构成也是多样的我们无法通过一套泛性的、普适的操作函数来访问所有的链表这意味着我们要给每个链表都写一套链表的操作函数节点创建、插入、删除、遍历等。 2、内核链表的设计思路 经过分析发现不同的链表的操作方法是相同的数据区域的操作有所不同而已。于是可以把所有链表操作方法里共同的部分提取出来用一套标准方法实现然后让具体链表的实现者去处理不同的部分。 内核在include/linux/list.h文件中定义了一个纯链表没有数据区域只有前后向指针以及纯链表的各种操作函数节点创建、插入、删除、遍历等。 这个纯链表本身没有任何用处它的用法是给我们具体链表作为核心来调用。 二、内核链表的操作函数 内核链表的节点创建、删除、遍历略。 三、内核链表的使用实践 内核链表只有纯链表没有数据区域怎么使用 使用方法是将内核链表作为结构体的一个成员内嵌进去。这类似于公司收购实现被收购公司的功能。这里面要借助container_of宏。 举例如下。 #include linux/list.hstruct driver_info
{int data;
};// driver结构体用来管理内核中的驱动
struct driver
{char name[20]; // 驱动名称int id; // 驱动id编号struct driver_info info; // 驱动信息struct list_head head; // 内嵌的内核链表成员
};struct driver2
{char name[20]; // 驱动名称int id; // 驱动id编号struct driver_info info; // 驱动信息//struct list_head head; // 内嵌的内核链表成员struct driver *prev;struct driver *next;
};分析driver结构体可知前三个成员都是数据区域成员之前简化为int data第4个成员是一个struct list_head类型的变量它就是一个纯链表。本来driver结构体没有链表也无法用链表来管理。但是driver结构体内嵌的head成员是一个纯链表所以driver结构体通过head成员扩展了链表的功能。 driver结构体通过内嵌的方式扩展链表成员其好处不只是有了一个链表成员关键是可以通过利用list_head本身事先实现的链表的各种操作方法来操作head。最终我们可以通过遍历head结构体变量来实现driver结构体的遍历。而且遍历head结构体变量的函数在list.h文件中已经写好内核去遍历driver结构体时就不用重复去写。 通过操作head来操作driver实质上就是通过操作结构体的某个成员变量来操作整个结构体变量。这要借助container_of宏具体见宏定义函数container_of的解释_天糊土的博客。