首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux内核源码 -- list链表

linux kernel中list估计已经被各位前辈们写烂了,但是我还是想在这里记录一下; linux kernel里很多数据结构都很经典, list链表就是其中之一 本篇要介绍内容: list...定义 list提供操作方法 注意事项 使用实例 ---- List 所在文件: List所有操作可以在 include/linux/list.h找到; List head定义可以在 include.../linux/types.h找到; 定义 实际上这就是一个双向循环链表, 且有一个头指针 list head定义: struct list_head { struct list_head *next..., *prev; }; 这个定义中只有前向和后向指针,没任何数据部分, 那我们基本上就知道了, 它不是被单独使用,而是把它嵌入到用户定义struct中, 将用户定义数据结构串起来,作成list;...struct中,这个宏就是由这个list_head ptr来获取当前所处struct对象指针, 用了linux经典宏定义 container_of #define list_entry(ptr,

2.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux 内核通用链表学习小结

    描述 在linux内核中封装了一个通用双向链表库,这个通用链表库有很好扩展性和封装性,它给我们提供了一个固定指针域结构体,我们在使用时候,只需要在我们定义数据域结构体中包含这个指针域结构体就可以了...传统链表结构 struct node{ int key; int val; node* prev; node* next; } linux 内核通用链表库结构 提供给我们指针域结构体...//pos在上面有定义 { //list_entry用来提取出内核链表节点对应实际结构节点,即根据struct list_head来提取struct student //第三个参数...list就是student结构定义里属性list //list_entry原理有点复杂,也是linux内核一个经典实现,这个在上面那篇链接文章里也有讲解 tmp_student...内核提供这个通用链表库里面还有很多其他接口,这里没有详细一一举例,有兴趣可以自己去看看,在源码包 include/linux/list.h 文件里面,不过通过阅读一些源代码确实对我们也有很大提高

    1.3K21

    工作当中非常实用Linux内核链表

    前言: 在上期文章中,已经给大家分享过offsetof()和container_of两个宏函数,这两个宏函数在Linux内核链表里面有大量应用,对于我们平时工作写代码有很大帮助。...下面是Linux内核链表内容分享。...做内核驱动开发经常会使用linux内核最经典双向链表 list_head, 以及它拓展接口(或者宏定义): list_add , list_add_tail, list_del , list_entry...; }; 然后就开始围绕这个结构开始构建链表,然后插入、删除节点 ,遍历整个链表等等,其实内核已经提供好了现成接口,接下来就让我们进入 kernel/include/linux/list.h中: 一...做linux驱动开发同学是不是想到了LDD3这本书中经常使用一个非常经典宏定义呢!

    1K10

    Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

    文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本内核源码 ; 5.x 内核源码下载地址.../pub/linux/kernel/v5.x/linux-5.6.18.tar.gz 下载完 Linux 源码后 , 如果在 Windows 系统中解压 , 需要使用管理员权限在 命令行终端 中解压 ,...参考 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;...不同版本 Linux 内核 区别 : 系统调用 : 其系统调用是相同 , 新版本可能会增加新系统调用 ; 设备文件 : 各内核版本设备文件都是相同 , 但是 内部接口 可能不同 ; 二、使用

    23.4K32

    Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

    文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本内核源码 ; 5.x 内核源码下载地址.../pub/linux/kernel/v5.x/linux-5.6.18.tar.gz 下载完 Linux 源码后 , 如果在 Windows 系统中解压 , 需要使用管理员权限在 命令行终端 中解压 ,...参考 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;...不同版本 Linux 内核 区别 : 系统调用 : 其系统调用是相同 , 新版本可能会增加新系统调用 ; 设备文件 : 各内核版本设备文件都是相同 , 但是 内部接口 可能不同 ; 二、使用

    21.4K30

    内核链表介绍

    应要求分享一下内核链表结构,故写了本blog。本文对内核链表做一个简单介绍,以及引出内核中大量使用分离思想和数据结构定义。...传统链表困境 内核中数据结构千变万化,采用传统链表结构形式,需要为各种数据都定义出一个链表。...内核链表 内核链表正是采用了如上思想进行设计内核链表位于内核代码include/linux/list.h中,该链表定义为双向循环链表,所有的相关操作都定义在该头文件中,该文件中每个函数极为简洁。...void list_add(struct list_head *new, struct list_head *head) { __list_add(new, head, head->next); } 使用内核链表方式...,内核做法是可以放在任意位置,解析时使用了一个很强大宏来进行获取。

    30220

    一文搞懂 Linux 内核链表(深度分析)

    Linux 内核使用最多数据结构就是链表了,其中就包含了许多高级思想。 比如面向对象、类似C++模板实现、堆和栈实现。 1....如果去掉前驱指针,就是单循环链表。 ? 2. 内核链表Linux内核使用了大量链表结构来组织数据,包括设备列表以及各种功能模块中数据组织。...这些链表大多采用在[include/linux/list.h]实现一个相当精彩链表数据结构。事实上,内核链表就是采用双循环链表机制。 内核链表有别于传统链表就在节点本身不包含数据域,只包含指针域。...这个结构本身意义不大,不过在内核链表中,起着整个衔接作用,可以说是内核链表核心不为过。...总结 本文详细分析了 linux 内核链表结构,以图文方式旨在帮助大家理解。

    8.2K77

    如何移植并使用Linux内核通用链表(附完整代码实现)

    在实际工作中,我们可能会经常使用链表结构来存储数据,特别是嵌入式开发,经常会使用linux内核最经典双向链表 list_head。...本篇文章详细介绍了Linux内核通用链表是如何实现,对于经常使用函数都给出了详细说明和测试用例,并且移植了Linux内核链表结构,在任意平台都可以方便调用内核已经写好函数。...Linux内核链表   上面介绍了普通链表实现方式,可以看到数据域都是包裹在节点指针中,通过节点指针访问下一组数据。...但是 Linux内核链表实现可以说比较特殊,只有前驱和后继指针,而没有数据域。链表头文件是在include/list.h(Linux2.6内核)下。...在实际工作中,也可以将内核链表拷贝出来供我们使用,就需不要造轮子了。 链表定义   内核链表只有前驱和后继指针,并不包含数据域,这个链表具备通用性,使用非常方便。

    1.5K20

    使用EBPF追踪LINUX内核

    前言 我们可以使用BPF对Linux内核进行跟踪,收集我们想要内核数据,从而对Linux程序进行分析和调试。...与其它跟踪技术相比,使用BPF主要优点是几乎可以访问Linux内核和应用程序任何信息,同时,BPF对系统性能影响很小,执行效率很高,而且开发人员不需要因为收集数据而修改程序。...下面是一个使用kprobebcc程序示例,功能是监控内核函数kfree_skb函数,当此函数触发时,记录触发它进程pid,进程名字和触发次数,并打印出触发此函数进程pid,进程名字和触发次数: #...使用命令perf list 也可以列出可使用tracepoint点: ?...内核观测技术 BPF》 本文来源于陈莉君老师“Linux内核之旅”。

    1.6K51

    数据算法(内核链表

    “恩恩,最简单线性数据组织……” “装逼,知道它优缺点吗” “恩恩,插入删除快速,遍历比较慢,而且……” “行了,知道内核链表吗” “恩恩,传统链表没有实现逻辑分离,因此操作接口……” “喂!...“你,明天过来找人事部张小姐签……” “签你妹!每次打断我说话,滚!” “……”一脸懵逼面试官 废话少讲,传统链表如下: ?...特点: 节点既包含了后续节点指针,也包含了前趋节点指针,而且一般都设计成循环,这样就可以非常方便地从链表任意一个位置开始遍历整个链表内核链表如下: ?...特点: 把传统链表“链”抽象出来,使之成为一条只包含前后指针纯粹双循环链表,这样链表由于不含有特殊数据,因此它实质上就是链表抽象。最后将这样标准链表镶嵌到具体节点里面。...内核链表通过将数据与逻辑分离,实现了统一管理Linux内核中成千上万种节点操作,这种抽象方法在内核各个子系统中都有应用,比如设备模型管理,比如网络子系统等。

    45120

    使用GDB调试Linux内核

    类似的,Linux内核开发者可以使用GDB远程模式,与调试应用程序几乎相同方式来调试Linux内核。...KGDB是Linux内核源代码级调试器,你可以使用GDB作为KGDB前端,在我们熟悉且功能强大GDB调试界面中调试内核。...本文将介绍如何在本机搭建Linux内核调试环境,步骤比较繁琐,还会涉及到编译内核。作为内核小白,我会尽量写详细些,毕竟我折腾了很久才成功。...下载Linux内核源码 在虚拟机上下载Linux内核源码: $ sudo apt install linux-source-5.4.0 ubuntu-20.04.2对应内核版本是5.4。...写在最后 在本机搭建Linux内核调试环境步骤有点繁杂,但使用GDB能调试内核,会成为我们学习内核利器,进程管理、内存管理、文件系统,对源码有什么困惑就可以debug一下。 Enjoy it!

    1.4K10

    使用eBPF追踪Linux内核

    前言我们可以使用BPF对Linux内核进行跟踪,收集我们想要内核数据,从而对Linux程序进行分析和调试。...与其它跟踪技术相比,使用BPF主要优点是几乎可以访问Linux内核和应用程序任何信息,同时,BPF对系统性能影响很小,执行效率很高,而且开发人员不需要因为收集数据而修改程序。...本文将介绍保证BPF程序安全BPF验证器,然后以BPF程序工具集BCC为例,介绍常见BPF程序,具体为kprobes和tracepoints类型BPF程序使用及程序编写示例。2....下面是一个使用kprobebcc程序示例,功能是监控内核函数kfree_skb函数,当此函数触发时,记录触发它进程pid,进程名字和触发次数,并打印出触发此函数进程pid,进程名字和触发次数:#!...4.2 tracepoint可用跟踪点系统中所有的跟踪点都定义在/sys/kernel/debug/traceing/events目录中:图片使用命令perf list 也可以列出可使用tracepoint

    1.4K20

    linux内核字符串转换 ,链表操作常用函数(转)

    1.对双向链表具体操作如下: list_add ———向链表添加一个条目   list_add_tail ———添加一个条目到链表尾部   __list_del_entry ———从链表中删除相应条目...———从一个列表中删除并加入为另一个链表尾部   list_is_last———测试是否为链表最后一个条目   list_empty———测试链表是否为空   list_empty_careful—...———反向遍历链表   list_for_each_safe———遍历链表并删除链表中相应条目   list_for_each_prev_safe———反向遍历链表并删除链表中相应条目   list_for_each_entry...———反向遍历链表并删除链表中相应条目   list_safe_reset_next———获得下一个指定类型条目   hlist_for_each_entry———遍历指定类型单指针表头链表  ...———遍历指定类型单指针表头链表并删除链表中相应条目  2.字符串相关 内核中经常会有字符串转换需要, 其接口如下: simple_strtoull———变换一个字符串为无符号long long

    2.3K20
    领券