当前位置:首页 > 嵌入式 > 嵌入式云IOT技术圈
[导读]/********************  * 内核中链表的应用  ********************/ (1)介绍 在Linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据组织。这些链表大多采用在include/linux/list.h实现的一个相当精彩的链表数据结构。 链表数

/********************
 * 内核中链表的应用
 ********************/
(1)介绍
在Linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据组织。这些链表大多采用在include/linux/list.h实现的一个相当精彩的链表数据结构。

链表数据结构的定义很简单:
struct list_head {
  struct list_head *next, *prev;
};

list_head结构包含两个指向list_head结构的指针prev和next,内核的数据结构通常组织成双循环链表。

和以前介绍的双链表结构模型不同,这里的list_head没有数据域。在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点。
如:
struct my_struct{
  struct list_head list;
  unsigned long dog;
  void *cat;
};

linux中的链表没有固定的表头,从任何元素开始访问都可以。遍历链表仅仅需要从某个节点开始,沿指针访问下一个节点,直到又重新回到最初这个节点就可以了。每个独立的节点都可以被称作是链表头。

(2)链表的初始化
a.静态
如果在编译时静态创建链表,并且直接引用它,如下:
struct my_struct mine={
  .lost = LIST_HEAD_INIT(mine.list);
  .dog = 0,
  .cat = NULL
};
static LIST_HEAD(fox);
/*等于struct list_head fox = LIST_HEAD_INIT(fox); */

b.动态
struct my_struct *p;
p = kmalloc(GFP_KERNEL, sizeof(my_struct));
p->dog = 0;
p->cat = NULL;
INIT_LIST_HEAD(&p->list);

(3)操作链表
内核提供了一组函数来操作链表。
注意!这些函数都使用一个或多个list_head结构体指针作参数。定义在<linux/list.h>

a.增加节点
list_add(struct list_head *new, 
          struct list_head *head);
向指定链表的head节点后面插入new节点
          
b.把节点增加到链表尾
list_add_tail(struct list_head *new, 
          struct list_head *head);
向指定链表的head节点前面插入new节点
          
c.从链表删除一个节点
list_del(struct list_head *entry);
将entry从链表中移走


d.把节点从一个链表移到另一个链表
list_move(struct list_head *list, 
          struct list_head *head);
从一个链表中摘除list项,然后将其插入head的后面


e.list_empty(struct list_head *head);
链表为空返回非0值,否则返回0


f.合并链表
list_splice(struct list_head *list, 
            struct list_head *head);
注意!新的链表不包括list节点

(4)遍历链表
链表本身不重要,访问到那个包含链表的结构体才重要

a.从链表指针获得包含该链表的结构体的指针
list_entry(struct list_head *ptr,
           type_of_struct, 
           field_name);
ptr: list_head指针
type_of_struct: 包含ptr的结构体类型
field_name: 结构体中链表字段的名字
如:
my_struct *p = (list_head *ptr, my_struct, list);

b.遍历链表
list_for_each(struct list_head *cursor,
              struct list_head *list);
常常和list_entry配套使用
注意!用list_for_each遍历时,不包括头节点

c.遍历的同时获得大结构体指针
list_for_each_entry(type *cursor, 
           struct list_head *list,
           member);

d.遍历链表的同时释放每个被遍历到的节点
list_for_each_entry_safe(type *cursor, 
          type *tmp;
          struct list_head *list,
          member);

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭