Linux内核设计基础(八)之内核数据结构

【Kernel】内核数据结构之映射(v5.15.10) 【Kernel】内核数据结构之映射(v5.15.10) 内核源码快捷查看 一、概念 映射常称为关联数组,是一个由唯一键组成的集合,而每个键必然关联一个特定的值。键到值的关联关系称为映射。映射至少支持三个操作:add(key,value) remove(key) value = Lookup(key) 映射可以通过散列表和二叉搜索树实现。 二、IDR简介 系统许多资源都用整数 ID 来标识,如进程 ID、文件描述符 ID、IPC ID 等;资源信息 通常存放在对应的数据结构中 (如进程信息存放在 task 阅读详情

我个人比较喜欢学习数据结构,而Linux内核中实现的数据结构会是我们去学习、理解和应用数据结构的一个很好途径。这里介绍内核中广泛应用的四种数据结构:链表、队列、映射和二叉树。


链表:

Linux内核讲求高效精简,所以有时需要我们动态去创建和分配内存,这时就要借助链表,我们根据实际情况分配内存后,只需修改链表的指针,仍能索引到刚分配的内存区。链表分单向链表、双向链表和循环链表。

  • 单向链表
struct list_element {
	void *data;
	struct list_element *next; /* 指向下一个元素的指针 */
};

  • 双向链表
struct list_element {
	void *data;
	struct list_element *next; /* 指向下一个元素的指针 */
	struct list_element *prev; /* 指向前一个元素的指针 */
};

  • 循环链表
链表最后一个元素的next指针不为NULL,而是指向链表首元素。循环链表中也分单向和双向。


因为循环双向链表提供了最大的灵活性(没有具体例子的对比,暂时还看不出来,希望懂的朋友们留下评论:),所以Linux内核的标准链表就是采用循环双向链表。
另外,如果需要随机访问数据,一般不使用链表,使用链表的理想情况是需要遍历所有数据或需要动态加入和删除数据时。
不过Linux内核中的链表可不像上面例子那样简单和原始,它不是将数据结构塞入链表,而是将链表节点塞入数据结构。
struct list_head {
	struct list_head *next;
	struct list_head *prev;
};

其实这就是所谓的链表节点,那它是如何塞入数据结构的呢?当然是作为数据结构的成员:
struct fox {
	unsigned long tail_length;
	unsigned long weight;
	bool is_fantastic;
	struct list_head list;  /* 所有fox结构体形成链表 */
};

也就是list不再是指向一个fox结构体,而是用.next和.prev指向前后两个list_head结构体。真奇怪,这样的话我们需要知道所指向的两个list_head结构体分别属于哪两个fox结构体,这需要借助宏container_of(),这样我们可以找到这个list_head结构体的父结构(也就是所属的fox结构体)中包含的任何变量。为什么要这样构造链表,希望懂的朋友们留下评论:)

队列:

在内核编程中,我们经常遇到生产者——消费者模型,这时队列是最理想的数据结构,生产者将数据放入队列,消费者则随后取出,先到先得。

映射:

映射指的是一种做法:有一个由唯一键组成的集合,每个键关联一个特定的值,由键得到值得这种关系我们称之为映射。
但用什么数据结构来实现,一般采用散列表(Hash)和自平衡二叉搜索树。也许散列表是我们最熟悉的,构造散列函数,输入唯一键,得到对应值。但其实更多的时候采用二叉树,Linux内核就是如此。
Linux内核中用idr维护一个自定义的映射,用

int idr_get_new(struct idr *idp, void *ptr, int *id);

将id(键)和ptr(值)的映射注入到idr中。而查找操作如下:

void *idr_find(struct idr *idp, int id);

根据id找到对应的指针ptr。

二叉树:

具体红黑树的介绍参见我的博文

红黑树(RED-BLACK TREES)基本概念

内核中每个i节点都有自己的rbtree,以关联在文件中的页偏移,这是红黑树在Linux中的一个应用。





ZynqMP多核异构开发实战:Linux与裸机协同优化填坑指南 本文基于真实项目经验,分享了在Xilinx ZynqMP平台上实现Linux与裸机多核异构协同开发的实战指南。针对A53与R5核心,文章详细阐述了内存与外设资源规划、裸机多核工程搭建、Linux系统裁剪以及核间通信等关键步骤,旨在解决协同开发中的性能瓶颈与稳定性问题,帮助开发者充分发挥异构计算潜力。 阅读详情

相关推荐

内核漏洞利用实战:从KASLR绕过到ROP链构造的完整攻防解析

操作系统内核作为计算机系统的核心,负责管理硬件资源和关键服务。其安全性直接关系到整个系统的稳定。现代内核通过KASLR、SMEP、SMAP等机制,从地址随机化到执行权限控制,构建了多层防御体系。这些保护机制的技术价值在于大幅增加了漏洞利用的难度,迫使攻击者需要更系统的技术链。在CTF竞赛和真实攻防场景中,攻击者需要综合利用信息泄露、堆风水、ROP等技术,形成完整的利用链。本文聚焦内核漏洞利用中的KASLR绕过与ROP链构造,通过堆溢出等常见漏洞类型,演示如何在内核态完成权限提升并稳定返回用户态,为理解系统底

weixin_34133829的博客 359

Linux(内核剖析):18---内核数据结构总结(数据结构选择与算法复杂度分析)

一、数据结构以及选择 前面几篇文章主要介绍了Linux中比较重要的四种数据结构:链表、队列、映射和红黑树 要是上述数据结构都不能满足你的需要,内核还实现了一些较少使用的数据结构,也许它们能帮你,比如基树(trie类型)和位图。只有当寻遍所有内核提供的数据结构都不能满足时,你 才需要自己设计数据结构。经常在独立的源文件中实现的一种常见数据结构是散列表。因为散列表无非是一些“桶”和一个散列函数,而...

董哥的黑板报 1118

Linux内核IDR机制

内核IDR机制,linux操作系统的平台IDR机制的分析

30分钟搞懂Linux内核内存映射,(值得收藏)

一、内存映射基础知识 1、内核地址映射模型 比如:X86CPU采用段页式地址映射模型,进程代码地址为逻辑地址,经过段页式地址映射之后,才能够真正访问物理内存。32位Linux内核地址空间划分:0GB--3GB为用户空间,3GB--4GB为内核空间。32位和64位内核地址空间划分是不同的。具体空间表示如下: ​ 2、内核高端内存 比如:当内核模块代码或络访问内存时,代码中的地址为逻辑地址,而且对应到真正的物理内存地址,需要地址和它一对一的映射,假设:逻辑地址0xc0000003对应的物

youzhangjing_的博客 3017

Linux内核映射关系图

Linux 内核关系映射图,包含了HardwareInterfaces,DevicesControl,Functional,Bridges,Virtual,UserSpaceInterfaces,FunctionLayers各层次模块之间的关系映射图。

Visual Studio报错TRK0005找不到CL.exe?三步彻底解决环境变量问题

本文详细解析了Visual Studio报错TRK0005找不到CL.exe的根本原因,并提供了三步彻底解决环境变量问题的方案。从验证安装完整性到配置永久环境变量,再到注册表级修复,帮助开发者建立健壮的开发环境配置体系,确保编译链稳定运行。

weixin_30839881的博客 459

Linux(内核剖析):17---内核数据结构之二叉树(struct rb_root、struct rb_node)

一、二叉树 一个二叉树是每个节点最多只有两个出边的数 二叉树的内容不是本文重点,不再叙述 二、二叉搜索树 一个二叉搜索树(简称为“BST”)是一个节点有序的二叉树,其顺序通常遵循下列法则: 1.根的左分支节点值都小于根节点值 2.右分支节点值都大于根节点值 3.所有的子树也都是二叉搜索树 因此,一个二叉搜索树所有节点必然都有序,且左子节点小于其父节点值,而右子节点大于其父节...

董哥的黑板报 2767

车辆TBOX科普 第69次 TBOX行业发展趋势与就业前景深度解析

TBOX技术革新驱动汽车智能化发展 Telematics BOX(TBOX)正快速从车辆状态监控器进化为整车智能核心,市场年增速超25%,2025年规模将达150亿美元。技术呈现四大革新方向:5G与V2X集成实现多模通信网关,支持10-20Gbps高速传输;多模GNSS融合定位精度达厘米级,北斗系统提供独特优势;边缘计算架构使TBOX具备本地AI处理能力,减少95%数据上传;硬件安全模块(HSM)成为标配,满足EVITA标准的安全需求。这些技术突破正重塑TBOX架构,使其从单纯通信管道升级为智能网联汽车的关

IT深耕十余载,大道之简 1832

深入理解Linux内核

Linux内核学习笔记

qq_41975735的博客 2585

汽车工程师必看:从CAN到Ethernet,6种车载通信协议全解析(附应用场景对比)

本文全面解析了从CAN到Ethernet的6种车载通信协议,包括CAN、LIN、MOST、FlexRay等,并对比了它们的应用场景和技术特点。文章详细介绍了各协议的演进历程、技术优势及在现代汽车中的混合网络架构设计,为汽车工程师提供了实用的协议选型指南和未来通信技术发展趋势。

weixin_28683689的博客 493

手把手教你用MOS管设计双电源自动切换电路(附零压降方案)

本文详细介绍了使用MOS管设计双电源自动切换电路的完整方案,包括基础电路拓扑、零压降优化设计及实战调试技巧。针对外接电源与电池供电的无缝切换需求,提供低损耗MOS管选型建议和性能实测数据,帮助工程师解决传统二极管方案的压降与漏电问题。

h0i1j2k3l的博客 1451

Linux内核提权:通过篡改cred结构体实现权限提升的原理与实践

在操作系统安全模型中,进程权限管理是核心机制之一。Linux内核通过cred结构体来记录进程的身份与权限信息,包括用户ID、组ID和能力集等关键字段。其工作原理决定了进程能访问的资源范围,是系统安全的基础防线。从技术价值看,深入理解cred机制不仅有助于加固系统安全,也是评估内核漏洞危害性的关键。在渗透测试与安全研究中,当攻击者通过内存破坏类漏洞获得内核写原语后,篡改cred结构体便成为将漏洞转化为root权限的经典路径。这种利用方式常见于堆溢出、UAF等场景,通过精准定位并修改cred中的权限字段,可实现

weixin_33924220的博客 448

BEVFusion实战:从零搭建LiDAR-Camera融合的3D目标检测环境(附避坑指南)

本文提供了BEVFusion实战指南,详细讲解如何从零搭建LiDAR-Camera融合的3D目标检测环境。内容涵盖环境配置、数据预处理、模型训练与性能优化等关键步骤,并附有实用的避坑技巧,帮助开发者高效部署这一先进的BEV感知算法。

p4q5r6s7t的博客 515

x86_64 vs ARM64:Linux 内核栈与 pt_regs 结构差异对比与 2 种架构下的调试技巧

本文深入对比了x86_64与ARM64架构下Linux内核栈与pt_regs结构的关键差异,包括寄存器保存机制、系统调用处理等核心设计哲学。通过具体代码示例和调试技巧(如GDB查看内核栈、崩溃现场分析),帮助开发者掌握两种架构下的内核调试方法,并提供了性能优化与跨平台开发的实用建议。

weixin_29271263的博客 247

pytorch-cifar100学习资料汇总 - 基于PyTorch的CIFAR-100图像分类实践

pytorch-cifar100是一个基于PyTorch实现CIFAR-100数据集图像分类的开源项目。该项目实现了多种经典的深度学习网络模型,如ResNet、DenseNet、VGG等,为开发者提供了在CIFAR-100数据集上进行图像分类实验的代码范例。pytorch-cifar100项目为我们提供了在CIFAR-100数据集上进行图像分类实验的完整代码实现。无论你是想要学习PyTorch的使用,还是研究不同网络模型在CIFAR-100上的表现,这个项目都是一个很好的起点。

helloaiworld的博客 1125

OpenGL计算着色器工作组设置测试

先看看不同的显卡上工作组的数量情况。 glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, data); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, data + 1); glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, data...

qq_26328385的博客 1485

Linux 内核/sys 文件系统介绍2

Linux 统一设备模型     在 Linux 2.5 内核的开发过程中,人们设计了一套新的设备模型,目的是为了对计算机上的所有设备进行统一地表示和操作,包括设备本身和设备之间的连接关系。这个模型是在分析了 PCI 和 USB 的总线驱动过程中得到的,这两个总线类型能代表当前系统中的大多数设备类型,它们都有完善的热挺拔机制和电源管理的支持,也都有级连机制的支持,以桥接的 PCI/USB 总线控

heyustudent的专栏 582

UG二次开发之 三面摆正体代码分析

CIUGUIBlock 是一个从UIBlock 派生的一个类,为什么要从UIBlock 派生出CIUGUIBlock,这是为了兼容低版的UG。如果我们不从的UIBlock 派生控件类对象指针,在UG 8.5以下的版本,会出现编译错误的问题。这是一个简单的入门功能,包括了不少的常用的UF函,下面我们将结合成品代码一起分析一下常用的函数,这对初学者是必要的。根据创建好的UI控件,在 initialize_cb 中创建控件的指针对象。//根据选定的面,指定 X,Y坐标系轴。//根据变换的矩阵,平移实体。

u014657217的博客 351

【Linux系统】如何证明进程的独立性

本文讲解:如何证明进程具有独立性?内核数据结构独立 + 代码数据独立

从不依靠,从不寻找,非常沉默,非常骄傲。 你必须非常努力,才能看起来毫不费力。 613

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

i.MX8核间通信实战:手把手教你用RPMSG实现A核与M核数据交换

本文提供了在NXP i.MX8异构多核处理器上实现Cortex-A核与Cortex-M核间通信的实战指南。文章详细解析了基于RPMSG与VirtIO框架的核间通讯原理,并手把手指导开发者完成从设备树配置、M核固件开发到Linux用户空间应用调试的全流程,帮助嵌入式工程师快速构建稳定高效的数据交换通道。

lstm7chronicler的博客 333

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

linux 统一设备模型,Linux 统一设备模型

在 Linux 2.5内核的开发过程中,人们设计了一套新的设备模型,目的是为了对计算机上的所有设备进行统一地表示和操作,包括设备本身和设备之间的连接关系。这个模型是在分析了 PCI 和 USB 的总线驱动过程中得到的,这两个总线类型能代表当前系统中的大多数设备类型,它们都有完善的热挺拔机制和电源管理的支持,也都有级连机制的支持,以桥接的 PCI/USB 总线控制器的方式可以支持更多的 PCI/US...

weixin_42107561的博客 219

Linux container of()宏介绍

最近在学习《Linux内核设计与实现》,在内核数据结构一章中,对container_of() 宏的解读有点疑惑。 本文仅用于学习记录,感谢博主的讲解。转载于 https://blog.youkuaiyun.com/s2603898260/article/details/79371024 /-------------------------------------------------------------...

u012270356的博客 144

linux 统一设备模型 pci,Linux 统一设备模

在 Linux 2.5内核的开发过程中,人们设计了一套新的设备模型,目的是为了对计算机上的所有设备进行统一地表示和操作,包括设备本身和设备之间的连接关系。这个模型是在分析了 PCI 和 USB 的总线驱动过程中得到的,这两个总线类型能代表当前系统中的大多数设备类型,它们都有完善的热挺拔机制和电源管理的支持,也都有级连机制的支持,以桥接的 PCI/USB 总线控制器的方式可以支持更多的 PCI/US...

weixin_35828255的博客 162

alarm系统调用的一次性原理揭秘

alarm 系统调用的一次性特性是其核心设计机制,该特性直接源于其作为软件定时器的实现原理与信号(SIGALRM)的发送规则。其本质在于,操作系统内核为每个进程维护一个独立的单次定时器,该定时器在触发并发送 SIGALRM 信号后即自动失效,不会自动重置或循环,除非进程显式地再次调用 alarm。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1055
上一篇: 阵列处理机
下一篇: Linux内核设计基础(九)之进程管理和调度
刘秋杉
博客等级 码龄14年 1233粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值