Linux 内核学习笔记: hlist 的理解

前言

  • 最近阅读 Linux 内核时,遇到了 hlist,这个 hlist 用起来像是普通的链表,但是为何使用 hlist,hlist 是怎么工作的?

在这里插入图片描述

  • 相关代码 hlist_add_head(&clk->clks_node, &core->clks);
/*** clk_core_link_consumer - Add a clk consumer to the list of consumers in a clk_core* @core: clk to add consumer to* @clk: consumer to link to a clk*/
static void clk_core_link_consumer(struct clk_core *core, struct clk *clk)
{clk_prepare_lock();hlist_add_head(&clk->clks_node, &core->clks);clk_prepare_unlock();
}
  • 越来越感到 Linux 内核真的是一个宝藏库,学习软件开发,阅读 Linux 内核代码,会受益匪浅。

hlist 定义

  • hlist 结构体定义所在的文件 `include\linux\types.h
struct hlist_head {struct hlist_node *first;
};struct hlist_node {struct hlist_node *next, **pprev;
};
  • 有的人理解 hlist 是 hash list 的简写,也就是 哈希链表,我不敢苟同,但 hlist 用在哈希桶上时,会由于 struct hlist_head 只有一个指针,比普通的 struct list_head 节省空间

  • 哈希表,由于哈希碰撞,即使哈希桶再大,都有可能多个数据拥有同一个哈希值,此时引入了链表,哈希值相同的元素,挂在链表上,此时由于 哈希桶的数量极大,比如 100万个,使用 struct hlist_head 会比 struct list_head 节省很大的【内存空间】

  • 由于 struct hlist_head 特殊的结构,造成 struct hlist_head 不能成为 【双向循环】链表,但是由于 struct hlist_node 有两个指针,因此可以享受 链表节点快速【插入】与【删除】的有点,这部分有点像 普通链表 struct list_head

  • struct hlist_head 只用于定义 链表的头部,链表的节点使用 struct hlist_node 定义。

  • 【重点理解】 struct hlist_node 中的 pprev 是二级指针,用于指向前一个 节点的 next,也就是前一个节点成员 next 指针的指针。这里不是 pprev = prev->next,而是 pprev= &prev->next ,一定要理解清楚,否则 pprev = prev->next 就是自身指针了,因为上一个节点的 next 就是指向下一个节点,这样获取不到上一个节点的指针。

hlist 的定义与初始化

  • 可以通过阅读 Linux 经典链表操作头文件 include\linux\list.h ,详细了解 链表的操作,比如 定义、 初始化、插入、删除、遍历等操作。

  • 如果链表嵌入在一个较大的数据结构中,双向链表的各个节点一般都是采用经典的前驱与后继相连,而通过链表成员,获取结构体的指针(地址),可以使用 container_of,比如 #define hlist_entry(ptr, type, member) container_of(ptr,type,member)

在这里插入图片描述

  • 初始化与定义,可以直接查看 include\linux\list.h ,一般定义方法为

  • 定义 hlist 头部 struct hlist_head children;

  • 定义 hlist 节点 struct hlist_node clks_node;

  • hlist head 定义后需要初始化,可以定义时初始化,也可以手动初始化

  • 定义并初始化 static HLIST_HEAD(clk_root_list);

  • 手动在初始化函数中初始化 INIT_HLIST_HEAD(&core->clks);

hlist 插入操作

  • 由于 hlist 特殊的结构,造成 hlist 插入操作分为两种: 头部的插入 hlist_add_head ,节点的插入 hlist_add_before hlist_add_behind 两种

  • hlist_add_head 操作: 知道 hlist 头部,插入到头部后面,新插入的节点,成为第一个hlist 节点

在这里插入图片描述

  • hlist_add_before ,两个 hlist_node 节点,前面插入节点

在这里插入图片描述

  • hlist_add_behind 两个 hlist_node 节点,插入到后面,类似于 after

在这里插入图片描述

删除节点 __hlist_del

  • 由于 hlist node 节点是双向的,双重指针 pprev 可以获取到前一个节点,而 next 可以获取到后一个节点,因此像常规双向链表一样,删除操作不依赖 链表头部

在这里插入图片描述

小结

  • 深入熟悉 hlist 的操作,感觉 Linux 代码阅读起来,更熟悉了,后面抽时间自己写驱动时用起来。

  • hlist 设计很巧妙,但使用起来由于区分 链表头与链表节点,没有 list_head 操作那么简单,但是用于哈希桶结构,可以用于节省空间(链表头部节点多、链表节点少的场合)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/307355.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ArcMap进行选址服务,适宜性分析

文章目录 题目分析技术步骤1,环境设置2,计算坡度:空间分析——表面分析——坡度,根据DEM求坡度4,距离计算3,坡度赋分4,对学校赋分5,娱乐设施赋分6,土地利用类型赋分7&…

Java日期工具类LocalDateTime

Java日期工具类LocalDateTime 嘚吧嘚LocalDateTime - API创建时间获取年月日时分秒增加时间减少时间替换时间日期比较 嘚吧嘚 压轴的来了,个人感觉LocalDateTime是使用频率最高的工具类,所以本篇像文章详细研究说明一下🧐。 如果看了Java日期…

【网络安全 | XCTF】2017_Dating_in_Singapore

正文 题目描述: 01081522291516170310172431-050607132027262728-0102030209162330-02091623020310090910172423-02010814222930-0605041118252627-0203040310172431-0102030108152229151617-04050604111825181920-0108152229303124171003-261912052028211407-0405…

Apache多后缀解析漏洞

漏洞描述: apahe解析文件时候有一特性,Apache默认一个文件可以有多个以点分割的后缀,apache会从最右边开始识别其后缀名,如遇无法识别的后缀名则依次往左进行识别 如果运维人员给.php后缀的文件添加了处理程序 AddHandler applic…

喜讯!九章云极DataCanvas公司顺利通过ITSS运维二级认证

近日,九章云极Datacanvas公司顺利通过中国电子工业标准化技术协会信息技术服务分会专家现场答辩评审,成功取得《信息技术服务标准(ITSS)符合性二级证书》。本次顺利通过认证,是对九章云极Datacanvas在信息运维服务整体…

软件测试/测试开发丨Windows Appium环境搭建

windows 版本 Appium 环境搭建 安装 nodejs 下载.msi文件 https://nodejs.org/en/download/ 注意: 1、下载12.*版本双击安装即可。 2、无须配置环境变量,直接重启一个 cmd 输入下面的命令,能够查看这两个版本号即安装成功。 安装 appium desktop 直…

openwrt的overlay扩容,再也不用担心磁盘不足了!

overlay扩容 1.准备好磁盘,先进行分区,也可以部分去,然后格式(可以使用windows的diskgenius格式化,需要知注意的是格式化为ext4格式)也可以通过ssh登录后台,命令行使用mkfs.ext4 /dev/sda1的方…

软件测试/测试开发丨Python常用数据结构-列表list

列表的定义 列表是有序的可变元素的集合,使用中括号[ ]包围,元素之间用逗号分隔;列表是动态的,可以随时扩展和收缩;列表是异构的,可以同时存放不同类型的对象;列表允许出现重复的元素。 列表的…

【小程序八股文】系列之篇章一 | 小程序基础及与其他产品区别

【小程序八股文】系列之篇章一 | 小程序基础及与其他产品区别 前言概览一、 微信小程序基础/背景小程序的理解微信小程序的优点及缺点简述一下微信小程序的相关文件类型简述一下小程序的开发流程?简述一下微信小程序的框架? 二、微信小程序与其他的区别&…

再传捷报!百望云荣登投资家网“2023年度企业服务领域创新企业TOP20”

近日,投资家网旗下投资家研究院重磅发布“投资家网2023中国价值企业榜”。经过层层严格评选,百望云荣登“2023年度企业服务领域创新企业TOP20”,再次说明了业界权威机构认可百望云的创新能力和市场价值。 本次评选,投资家网旗下投…

[鹏城杯 2022]简单包含

[鹏城杯 2022]简单包含 wp 题目代码如下&#xff1a; <?php highlight_file(__FILE__); include($_POST["flag"]); //flag in /var/www/html/flag.php; 直接 POST 传参&#xff1a; flag/var/www/html/flag.php 会触发 waf 。 尝试用伪协议读取&#xff1a; …

SV接口的驱动和采样_2023.12.27】

cb 使用cloking block进行信号的同步 在cloking block&#xff0c;所有信号的采样和驱动&#xff0c;都是和时钟同步的 clocking cb &#xff08;posedge clk&#xff09;; input grant; output request; endclocking接口同步 用和wait来同步测试平台中的信号 bus.cb; 接口…