/******************** * 内核中链表的应用 ********************/ (1)介绍 在Linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据组织...这些链表大多采用在include/linux/list.h实现的一个相当精彩的链表数据结构。...和next,内核的数据结构通常组织成双循环链表。...和以前介绍的双链表结构模型不同,这里的list_head没有数据域。在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点。...内核提供了一组函数来操作链表。
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...new, struct list_head *head) { __list_add(new, head, head->next); } 在尾部插入,在最后一个元素间和头指针间插入, 因为是循环链表嘛...head); } list_entry宏 按之前说的, 这个list_head都有要嵌入到用户定义的struct中,这个宏就是由这个list_head ptr来获取当前所处的struct对象的指针, 用了linux
printf("num = %d, math = %d\n", temp->num, temp->math); } printf("\n"); return 0; } 运行效果: 内核双链表效果图...其实关于内核中链表的操作还有很多的函数,目前就分析这几个。其余留给自己尝试。
描述 在linux内核中封装了一个通用的双向链表库,这个通用的链表库有很好的扩展性和封装性,它给我们提供了一个固定的指针域结构体,我们在使用的时候,只需要在我们定义的数据域结构体中包含这个指针域结构体就可以了...传统的链表结构 struct node{ int key; int val; node* prev; node* next; } linux 内核通用链表库结构 提供给我们的指针域结构体...在上面有定义 { //list_entry用来提取出内核链表节点对应的实际结构节点,即根据struct list_head来提取struct student //第三个参数list...就是student结构定义里的属性list //list_entry的原理有点复杂,也是linux内核的一个经典实现,这个在上面那篇链接文章里也有讲解 tmp_student = list_entry...内核提供的这个通用链表库里面还有很多其他的接口,这里没有详细的一一举例,有兴趣的可以自己去看看,在源码包 include/linux/list.h 文件里面,不过通过阅读一些源代码确实对我们也有很大的提高
概要 本文对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法。其中,也会涉及到Linux内核中非常常用的两个经典宏定义offsetof和container_of。...这两个宏最初是极客写出的,后来在Linux内核中被推广使用。...1.offsetof 1.1 offsetof介绍 定义:offsetof在linux内核的include/linux/stddef.h中定义。...内核的include/linux/kernel.h中定义。...list_del(entry) 和 list_del_init(entry)是linux内核的对外接口。 list_del(entry) 的作用是从双链表中删除entry节点。
应要求分享一下内核链表结构,故写了本blog。本文对内核链表做一个简单介绍,以及引出内核中大量使用的分离思想和数据结构的定义。...传统链表的困境 内核中数据结构千变万化,采用传统的链表结构形式,需要为各种数据都定义出一个链表。...内核链表 内核链表正是采用了如上的思想进行设计的,内核链表位于内核代码的include/linux/list.h中,该链表定义为双向循环链表,所有的相关操作都定义在该头文件中,该文件中每个函数极为简洁。...void list_add(struct list_head *new, struct list_head *head) { __list_add(new, head, head->next); } 使用内核链表的方式...*fops; struct list_head list; /* 用内核链表管理所有注册在内核中的misc设备 */ struct device *parent; struct
在 Linux 内核中使用最多的数据结构就是链表了,其中就包含了许多高级思想。 比如面向对象、类似C++模板的实现、堆和栈的实现。 1....如果去掉前驱指针,就是单循环链表。 ? 2. 内核链表 在Linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据组织。...这些链表大多采用在[include/linux/list.h]实现的一个相当精彩的链表数据结构。事实上,内核链表就是采用双循环链表机制。 内核链表有别于传统链表就在节点本身不包含数据域,只包含指针域。...这个结构本身意义不大,不过在内核链表中,起着整个衔接作用,可以说是内核链表的核心不为过。...总结 本文详细分析了 linux 内核 中的双链表结构,以图文的方式旨在帮助大家理解。
前言: 在上期文章中,已经给大家分享过offsetof()和container_of两个宏函数,这两个宏函数在Linux内核链表里面有大量的应用,对于我们平时工作写代码有很大的帮助。...下面是Linux内核链表的内容分享。...做内核驱动开发经常会使用linux内核最经典的双向链表 list_head, 以及它的拓展接口(或者宏定义): list_add , list_add_tail, list_del , list_entry...; }; 然后就开始围绕这个结构开始构建链表,然后插入、删除节点 ,遍历整个链表等等,其实内核已经提供好了现成的接口,接下来就让我们进入 kernel/include/linux/list.h中: 一...那接下来让我们揭开她的面纱:此宏在内核代码 kernel/include/linux/kernel.h中定义(此处kernel版本为3.10;新版本4.13之后此宏定义改变,但实现思想保持一致) /**
每日福利 “你,听过双向链表吗?”...“恩恩,最简单的线性数据组织……” “装逼,知道它的优缺点吗” “恩恩,插入删除快速,遍历比较慢,而且……” “行了,知道内核链表吗” “恩恩,传统链表没有实现逻辑分离,因此操作接口……” “喂!...“……”一脸懵逼的面试官 废话少讲,传统链表如下: ? 特点: 节点既包含了后续节点的指针,也包含了前趋节点的指针,而且一般都设计成循环,这样就可以非常方便地从链表的任意一个位置开始遍历整个链表。...内核链表如下: ? 特点: 把传统链表中的“链”抽象出来,使之成为一条只包含前后指针的纯粹的双循环链表,这样的链表由于不含有特殊的数据,因此它实质上就是链表的抽象。...最后将这样的标准链表镶嵌到具体节点里面。 内核链表通过将数据与逻辑分离,实现了统一管理Linux内核中成千上万种节点的操作,这种抽象方法在内核各个子系统中都有应用,比如设备模型管理,比如网络子系统等。
文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org...参考 【错误记录】解压 Linux 内核报错 ( Can not create symbolic link : 客户端没有所需的特权 | Windows 中配置 7z 命令行执行解压操作 ) 博客 ;...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用
文章目录 一、下载 Linux 内核源码 二、使用 VSCode 阅读 Linux 内核源码 一、下载 Linux 内核源码 ---- 参考 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的...Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 ) 博客 , 下载 Linux 5.6.18 版本的内核源码 ; 5.x 内核源码下载地址...: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ Linux 内核 5.6.18 版本 : https://mirrors.edge.kernel.org...不同版本的 Linux 内核 区别 : 系统调用 : 其系统调用是相同的 , 新的版本可能会增加新的系统调用 ; 设备文件 : 各内核版本的设备文件都是相同的 , 但是 内部接口 可能不同 ; 二、使用...按钮 , 此时就可以在 VSCode 中阅读 Linux 内核源码 ;
内核——操作系统的内在核心 设备驱动程序 启动引导程序 命令行shell 其他种类的用户界面—-操作系统的外在表象 基本的文件管理工具和系统工具 Linux内核的组成 Linux内核源代码目录结构是什么...Linux内核的有哪些组成部分? 进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC) Linux内核的的组成部分之间有什么关系?...Makefile:分布在Linux 内核源代码中的Makefile,定义Linux 内核的编译规则。 配置文件(Kconfig):给用户提供配置选择的功能。...记录哪些部分被编译入内核、哪些部分被编译为内核模块。 在Linux 内核中增加程序需要完成哪些工作? 将编写的源代码复制到Linux 内核源代码的相应目录。...次引导加载程序加载Linux内核和可选的初始RAM 磁盘,将控制权交给Linux内核源代码。 运行被加载的内核,并启动用户空间应用程序。
一、Linux内核2.6特点: 1.新的调度器 2.内核抢占 3.改进线程模型 4.虚拟内存 5.文件系统 6.音频:音频体系结构ALSA.支持USB音频和MIDI设备,并支持全双工重放功能。...二、LINUX内核的组成 1.LINUX内核源代码目录结构 1)arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。如i386,arm,powerpc,mips等。...4)Documentation:内核各部分通用解释和注释。...模块 16)sound:ALSA,OSS音频中设备的核心代码和常用设备驱动 17)usr:实现了用于打包和压缩的CPIO等 2.LINUX的内核组成部分 2.1 LINUX主要用进程调度,虚拟文件系统,...3.Linux内核空间与用户空间 Linux只能通过系统调用和硬件中断来完成用户空间到内核空间的控制转移
failled\n"); return NULL; } p->data = 0; p->next = p; p->prev = p; // 2.返回 return p; } 二.内核链表...1.kernel_list.h #ifndef __DLIST_H #define __DLIST_H /* This file is from Linux Kernel (include/linux...head); \ pos = n, n = list_entry(n->member.next, typeof(*n), member)) #endif 2.内核链表...#include #include #include "kernel_list.h" // 内核链表节点结构体(大结构体) typedef struct node...内核链表_奇升偶降重排 #include #include #include "kernel_list.h" // 内核链表节点结构体(大结构体) typedef
让我们了解和熟悉基本的Linux内核相关的信息,Linux内核我们主要从以下几个方面来讲解: Linux内核-什么是内核(本章节) Linux内核-内核参数 Linux内核-proc文件系统 Linux...他们都基于安卓(Linux内核)开发自己的OS系统。 虽然我们用安卓来比喻内核,不是很恰当,毕竟安卓系统也是基于Linux内核,我们这里也不用纠结这个问题,我们只需要理解这个比较抽象的概念即可。...什么是Linux内核 Linux 内核是Linux操作系统的核心部分,它是一个自由和开放源代码的类Unix操作系统内核。...以下是Linux内核的一些关键特点和功能: 开源:Linux内核的源代码是公开的,任何人都可以查看、修改和发布自己的版本。...Linux内核的官方网址就是https://www.kernel.org/ 本地内核文件 我们在Linux基础-linux目录介绍过/boot目录就是内核相关的的目录,这个是未升级内核之前的目录结构,可以和上面的内核版本进行对应
标准内核版本信息 看下图 (截自https://www.kernel.org/) 第一列,版本性质:主分支(mainline),稳定版(stable),长期维护版(longterm) 第二列,版本号。...标准内核与Linux发行版(如redhat)内核的区分 见下面的描述(摘自:https://www.kernel.org/releases.html) Distribution kernels Many...Linux distributions provide their own “longterm maintenance” kernels that may or may not be based on
文章目录 一、解压内核源码 二、查询当前 Linux 内核版本号 三、进入并查看 linux 内核源码目录 一、解压内核源码 ---- 将 下载的 Linux 内核源码 linux-5.6.14.tar.gz...拷贝到 Ubuntu 虚拟机中 , 执行 tar xvf linux-5.6.14.tar.gz 命令 , 解压 Linux 内核源码 ; 解压完毕后 , linux-5.6.14 目录中就是解压后的...Linux 内核源码 ; 二、查询当前 Linux 内核版本号 ---- 执行 uname -a 命令 , 查询当前 Ubuntu 系统的 Linux 内核版本号 , 执行过程如下 : root@ubuntu...x86_64 x86_64 x86_64 GNU/Linux root@ubuntu:~/kernel# root@ubuntu:~/kernel# 当前的内核版本号是 4.13.0 ; 三...、进入并查看 linux 内核源码目录 ---- 进入之前解压的 linux-5.6.14 内核源码目录 ; root@ubuntu:~/kernel# ls linux-5.6.14 linux-5.6.14
1.对双向链表的具体操作如下: list_add ———向链表添加一个条目 list_add_tail ———添加一个条目到链表尾部 __list_del_entry ———从链表中删除相应的条目...将链表一分为二 list_splice———将两个链表进行合并 list_splice_tail———将两个链表进行合并为一个链表 list_splice_init———将两个链表进行合并为一个链表并初始化为空表...———反向遍历链表 list_for_each_safe———遍历链表并删除链表中相应的条目 list_for_each_prev_safe———反向遍历链表并删除链表中相应的条目 list_for_each_entry...———继续遍历链表并删除链表中相应的条目 list_for_each_entry_safe_from———从当前点遍历链表并删除链表中相应的条目 list_for_each_entry_safe_reverse...———遍历指定类型的单指针表头链表并删除链表中相应的条目 2.字符串相关 内核中经常会有字符串转换的需要, 其接口如下: simple_strtoull———变换一个字符串为无符号的long long
对于服务器使用的操作系统基本上都是 Linux,而且内核源码也是开源的,任何人都可以下载,并增加自己的改动或功能,Linux 最大的魅力在于,全世界有非常多的技术大佬为它贡献代码。...操作系统核心的东西就是内核,这次我们就来看看,Linux 内核和 Windows 内核有什么区别? ---- 内核 什么是内核呢?...完成第一版 Linux 后,Linux Torvalds 就在网络上发布了 Linux 内核的源代码,每个人都可以免费下载和使用。...Monolithic Kernel Monolithic Kernel 的意思是宏内核,Linux 内核架构就是宏内核,意味着 Linux 的内核是一个完整的可执行程序,且拥有最高的权限。...,内核中抽象出了微内核的概念,也就是内核中会有一个小型的内核,其他模块就在这个基础上搭建,整个内核是个完整的程序; Linux 的内核设计是采用了宏内核,Windows 的内核设计则是采用了混合内核。
领取专属 10元无门槛券
手把手带您无忧上云