| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> Linux内核数据结构之双向循环链表 list_head -> 正文阅读 |
|
[数据结构与算法]Linux内核数据结构之双向循环链表 list_head |
目录 概述Linux 内核中双向循环链表采用将抽象结构和数据分离的特殊方式实现,即将抽象链表 list_head 嵌入到储存具体数据的数据结构中,通过 list_entry 宏(下文有讲解)将链表结构与数据连接起来。 内核中 list_head 的实现list.h 文件实现了list_head 的所有功能,可在 .../include/linux 中找到(博主用的2.6版本内核) 1.list_head 结构体
list_head 的结构非常简单, 只储存其前后节点,这符合其抽象的特征。 2.list_head 实现的操作list.h 内部实现的对链表的操作都是对 list_head 链表自身的,包括初始化、插入、删除、移动等操作,但并不实现对其所嵌入数据结构的操作,篇幅原因这里仅简单例举初始化和插入操作. 初始化
需要注意的是因为是双向循环链表因此初始化后的头节点的 prev 和 next 均指向 head 自己 插入
list.h 中实现了三种插入操作,其中后两种操作便于实现队列。 list.h 中其他函数也并不复杂,请读者自行研究,下面我们来介绍一个重要的宏 list_entry?。 3.list_entry 宏list_head 结构和储存数据的结构联系起来的关键就是 list_entry 宏,这个宏一般是提供给与其绑定的数据结构使用的,首先我们看其定义:
可以看到 list_entry 宏重新封装了另一个宏 container_of ,这个宏在内核中经常用到,定义如下:
这个宏比较复杂,让我们来层层拆开来分析,首先我们看三个参数,ptr 为实例化结构体的 member 指针,type 为结构体的类型名称,member 为被嵌入在结构体中的 某成员的名称。 下面让宏的内容更整齐一些 { ????????const typeof( ((type *)0)->member ) *__mptr = (ptr); ????????(type *)( (char *)__mptr - offsetof(type, member) ); } 第一行巧妙的将0强制转换为 type?类型指针并指向其 member 成员然后再利用 typeof 获取此member 的类型即 typeof( ((type *)0)->member )? ,然后将 ptr 赋给此类型的临时指针 __mptr ,前置 const 防止 ptr 指向的内容被修改。【1.宏的参数中并未提供 member 的类型 2.宏 typeof 用于获取类型名称】 第二行 offsetof 用于获取 member 成员在数据结构中内存偏移,用 __mptr 指针减去偏移量即可获取 member 所嵌入数据结构的地址,即储存数据的结构的地址,之后将这个地址强转为 type 类型指针即可,宏返回的便是 type 类型的指针。【offsetof 由编译器提供用于计算元素相对于结构体头部的偏移】 下面的图将有助于理解: ? 用 list_node 的地址减去 data_size 即可取得 实例化的data_struct 的地址,注意图中所标识的地址是相对于结构体内部的。【注意这里的 data_size 为 指针 data 的da'xiao 使用如下:
list_head 的使用上面 data_struct 的例子便是使用 list_head 时数据的组织结构,list.h 中封装了对链表的很多操作使用时直接使用这些即可形成链表,而除 data 数据需要另行处理。
上面删除操作便很好的体现了数据和抽象链表的分离,当我们需要真正删除某一元素时需要自己定义删除函数来实现操作。
结语限于篇幅原因本文先写到这里,对于 list_head 的更多使用可以参考内核中 task 结构体及其相关功能,可以在 .../include/linux/sched.h 找到 task_struct 定义。 最后,非常感谢您能读到这里,有不妥之处敬请指正。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 17:32:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |