ubuntu内核list.h 的分析与应用

ubuntu22.04配置sources.list 阅读详情

内核list (双向循环链表)

类型:
struct list_head {

 struct list_head *next, *prev;
};


链表的初始化(两种方式):
1. LIST_HEAD 定义一个头,并且初始化为循环链表
2. INIT_LIST_HEAD(内联函数)初始化为循环链表

#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
 struct list_head name = LIST_HEAD_INIT(name)

static inline void INIT_LIST_HEAD(struct list_head *list)
{
 list->next = list;
 list->prev = list;
}


添加元素(两种方式):
1. 头插(list_add) :__list_add(new, head, head->next);
2. 尾插(list_add_tail) :__list_add(new, head->prev, head);
       两中方式本质相同往两个元素中间插入元素。
     (双向循环链表特点的体现)

删除元素(一种方式):
1. (list_del): __list_del(entry->prev, entry->next) 让两边元素相互指向
       让被删除元素指向LIST_POISON队列,让系统销毁
2. (list_del_init):将被删除元素初始化为新的双向循环列表

替换节点:
1. list_replace:修改新元素的指向即可
2. list_replace_init:修改新元素的指向即可,并将旧元素初始化为新的双向循环列表


list_move: 删除一个头部元素,在向头部插入一个新元素

判断是否为最后一个元素:list_is_last
判空:list_empty 和 list_empty_careful

list_entry(找到某个节点的起始位置): 分析
#define list_entry(ptr, type, member) \
 container_of(ptr, type, member)

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

// 将值赋值给变量,并且用const修饰,可以防止无意修改变量的值
// offset也做了改动
#define container_of(ptr, type, member) ({   \
 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
 (type *)( (char *)__mptr - offsetof(type,member) );})

之前版本使用的是:
#define list_entry(ptr, type, member) \
 ((type*)((char*)ptr – (unsigned long)(((type*)0)->member)))


 

一. 链表的for 循环头部:

0. 遍历时使用到的工具

    1. list_entry 通过节点的指针域找到节点的起始地址
      #define container_of(ptr, type, member) ({\
            const typeof( ((type *)0)->member ) *__mptr = (ptr);\
            (type *)( (char *)__mptr - offsetof(type,member) );})
    2. 

1. 向后遍历

    1. 普通的for 循环,只适合遍历,
        注意pos的类型是struct list_head
        list_for_each(pos, head) \
            for (pos = (head)->next; pos != (head); pos = pos->next)

    2. 在释放的时候使用,其中的n 可以指向已释放节点的下一个节点,
       注意pos 和n 的类型都是struct list_head
 list_for_each_safe(pos, n, head) \
            for (pos = (head)->next, n = pos->next; pos != (head); \
                  pos = n, n = pos->next)

    3. 普通的for 循环,只适合遍历,
        注意pos 的类型是用户定义的结构体
      list_for_each_entry (pos, head, member) \
 for (pos = list_first_entry(head, typeof(*pos), member);
                  &pos->member != (head);  \
                  pos = list_next_entry(pos, member))
    4. 继续遍历链表,从pos 的下一个开始</span>
        注意和3 中的一样pos 的初始值是链表中的某个节点
       #define list_for_each_entry_continue(pos, head, member)
     for (pos = list_next_entry(pos, member);
            &pos->member != (head);
            pos = list_next_entry(pos, member))


    5. 遍历链表从pos 开始
        和4 基本相似,
        #define list_for_each_entry_from(pos, head, member)
              for (; &pos->member != (head);
            pos = list_next_entry(pos, member))

    其他的就是给以上的加个safe
2. 向前遍历
    和上边的一样,实质将next 改成prev 即可

Linux系统升级及内核版本升级 一、背景 工作中有时会遇到系统版本过旧,无法满足安全扫描后的安全要求,系统漏洞数量多,处理难度较大,这时,我们就需要升级OS或Linux内核版本; 二、升级操作 2.1、 redhat/CentOS系统 三、附录:包升级命令 1)配置yum更新源 /etc/yum.repos.d目录下新建主机的yum源,.repos文件中,repositoryid:指定一个仓库,name指定仓库名称, baseurl:指定仓库的URL,mirrorlist指定仓库的镜像站点,enable是否启用本仓库,gpgcheck 阅读详情

相关推荐

Linux内核升级至7.2与NVIDIA驱动兼容性实战指南

最近在折腾 Linux 内核升级到 7.2 版本,整个过程可以说是“平平无奇”中带着点“小惊喜”。说它平平无奇,是因为内核编译、安装的流程早已是轻车熟路;说它有惊喜,则是在升级后,NVIDIA 显卡驱动的兼容性问题如期而至,以及一个之前自己都没太在意、却被 Gemini AI 辅助工具揪出来的潜在 Bug。这篇文章,我就把这次从内核升级、驱动适配到 Bug 排查的完整经历和解决方案整理出来,希望能帮到同样在 Linux 路上探索的你,特别是那些使用 NVIDIA 显卡进行开发或娱乐的朋友。 1. 背景与核心

weixin_33816300的博客 457

Ubuntu基本操作

基本操作 命令格式:命令 –选项 参数 如:ls –la /usr Ls:显示文件和目录列表(list) 常用参数 -l(long) -a(all) 包括隐藏文件,特殊目录 -t(time)详细信息   Cd 切换目录(change directory) Pwd 显示当前工作目录(print working directory) Help 帮助   Ls 显示文件和目录列...

测试开发工程师的学习经历 308

操作系统内核架构深度解析:从宏内核到微内核的技术演进与选型指南

在实际项目开发、运维、系统选型乃至日常工作中,我们常常需要面对一个基础但至关重要的问题:选择哪个操作系统?是 Windows 的生态便利,macOS 的设计美学,Linux 的开源自由,还是鸿蒙的万物互联?这个问题看似简单,但背后涉及的是内核架构、设计哲学、应用生态、开发体验和未来趋势等一系列深层次的差异。很多开发者或用户在选择时,往往只凭个人喜好或单一场景的体验,却忽略了不同系统在底层机制、工具链、部署环境和长期维护成本上的巨大区别。 本文旨在为开发者、技术决策者和对系统底层感兴趣的爱好者,提供一个从技术

weixin_30617737的博客 513

Ubuntu文件系统常用的命令

Ubuntu常用的命令以及解释:cd,pwd,ls,mkdir,rmdir,rm,cp,mv,tar,ln,man,help

旺旺的碎冰冰~的博客 1446

Ubuntu系统精简指南:彻底卸载不常用软件

Linux系统优化是提升工作效率的重要环节,其中软件包管理是核心机制。通过apt/dpkg等工具,系统可以精确控制软件组件的安装与卸载。合理精简系统不仅能释放300MB-1GB的磁盘空间,还能降低内存占用约30%,显著提升Ubuntu等发行版的运行效率。常见的可清理对象包括LibreOffice冗余组件、GNOME游戏和多媒体应用,通过Synaptic或命令行工具可实现深度卸载。定期执行`apt autoremove`和清理旧内核等操作,能有效维护系统健康状态。本文以Ubuntu 22.04为例,提供从图形

cnvdkx2837的博客 438

Linux内核升级后NVIDIA驱动失效:诊断、修复与AI辅助排查指南

这次我们来看一个 Linux 内核升级与 NVIDIA 驱动兼容性的经典问题。标题里提到的“kernel 7.2征程”可能是一个泛指,但核心矛盾点非常明确:当 Linux 内核大步向前更新时,老旧的 NVIDIA 闭源驱动往往会掉队,导致显卡无法正常工作。同时,标题还提到了一个有趣的插曲——一个被 Gemini AI 发现的 bug,这暗示了现代 AI 工具在代码审查和问题排查中的潜力。 对于依赖 NVIDIA 显卡进行机器学习、图形渲染或日常桌面使用的 Linux 用户来说,内核升级从来不是一件可以无脑进

weixin_30321709的博客 436

【ubuntu】Ubuntu 常用命令及使用举例

mv file.txt new_location/file.txt`:将`file.txt`移动到`new_location`目录下。`mv old_name.txt new_name.txt`:将文件`old_name.txt`重命名为`new_name.txt`。`cp file1.txt file2.txt`:将`file1.txt`复制为`file2.txt`。`cp r dir1 dir2`:递归复制`dir1`目录及其内容到`dir2`。

路过我的生活呀 539

Ubuntu零基础入门到精通【1.5讲】:Ubuntu LTS、普通版本与版本生命周期——你选的版本,决定了你踩坑的深度!

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 1552

Linux Ubuntu使用5.1 命令行: 文件列表

ls , 即 list, 列出目录下的所有项 示例: 查看当前目录 ls 查看 /home/shaofa 目录 ls /home/shaofa 以详细模式查看 ls -l /home/shaofa 其中,-l 为参数,参数一般以 - 开头 要点与细节 1 在输入命令和路径时,按 TAB 键可以自动补全 ls /ho ->ls /home 2 输入历史可以翻阅 按 ↑ ↓ 箭头键可以上下翻阅 3 宿主机 与 虚拟机之间可以拷贝粘贴 一般情况下,文本和文件都可以拷贝 ...

duansamve的博客 831

Ubuntu零基础入门到精通【5.7讲】:Flatpak 软件包管理:Ubuntu 上的沙箱应用生态完全指南!

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 1577

Ubuntu零基础入门到精通【3.3讲】:Ubuntu 最小化安装与完整安装的区别:从选择开始,就决定了你的系统走向

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 1342

linux内核list.h分析(一)

先说下我的环境是ubuntu16.04 list.h路径在 内容我放到了github上便于查看 list.h 这里是网页版源码版本是2.6的 从自己的学习时遇到的困惑来分析。宏定义list.h中充斥的大量的宏定义,在不理解这些宏定义的时候,可以尝试将宏替换一下,在看替换后的结果。 最开始看到的是 结构体的定义: struct list_head{ struct list_hea

辛明辉的专栏 5858

ubuntu国内镜像文件(sources.list)

ubuntu国内镜像文件(sources.list) 下载速度还是不错的. 使用方法:把下载下来的文件覆盖/etc/apt/sources.list(原来的可以备份一下),然后 sudo apt-get update

Ubuntu内核更换实战:从硬件兼容到性能优化的完整指南

Linux内核作为操作系统的核心,负责管理系统硬件资源并为应用程序提供运行环境。其工作原理是通过模块化设计管理CPU、内存、磁盘和网络等硬件驱动。内核版本更新带来的技术价值在于提升硬件兼容性、优化系统性能并引入新的安全特性。在应用场景上,当用户遇到新硬件无法识别、需要特定内核功能或追求更高系统性能时,手动更换内核成为必要操作。本文以Ubuntu系统为例,详细解析了内核更换的完整流程,涵盖了硬件兼容性检查、性能优化配置以及安全回滚方案,特别是针对5.15.0-71-generic版本的内核升级提供了具体操作指

weixin_34087307的博客 347

spring-ai学习(四)-MCP

创建一个springai项目1.依赖。

zql1455890112的博客 1384

从零到一:Ubuntu22.04下VSCode与中文输入法的深度整合指南

本文详细介绍了在Ubuntu22.04系统中如何深度整合VSCode与中文输入法,包括环境准备、安装方案对比、输入法配置及常见问题解决方案。通过fcitx框架优化中文输入体验,提供从基础设置到高级调试的全方位指南,帮助开发者提升在Linux环境下的开发效率。

weixin_29158047的博客 477

ubuntu20.04的5.15.139内核启动卡死问题解决过程

摘要:联想Y7000P2025笔记本在Ubuntu20.04LTS系统下,升级至5.15.0-139内核后出现启动卡死问题。经排查发现是内核与Intel13代平台的PCI/MSI中断存在兼容性问题,导致系统在根文件系统挂载后失去中断响应。通过GRUB添加pci=nomsi参数禁用MSI中断机制后问题解决,确认非NVIDIA驱动、snapd或initramfs等问题所致。该方案虽可能降低PCIe设备性能,但能保证系统稳定运行。建议锁定稳定内核版本并等待后续修复。

2603_95682895的博客 518

cpp中auto, auto &和const auto &的区别

笔者初学cpp,如有纰漏,请见谅并指正。 用在哪 auto用于推断类型,具体可用于声明变量时根据初始化表达式自动推断该变量的类型,也就是可用在for循环。 也可以用于声明函数返回值的占位符。 怎么用 这里主要讲for循环中三者的区别 直接说结论 auto auto用于copy一份集合中的数据,对于这种情况,在循环体中不论怎么修改copy的数据,是不会影响到原有集合中的数据的。 举个简单的例子 int arr[5] = {0, 1, 2, 3, 4}; cout << "使用auto" <&

NinoSun的博客 3175

Mac M1安装ubuntu踩坑记录(含Booting a command list和EFI stub等报错卡住与解决方法)

本文总结了Ubuntu安装过程中问题的解决方法:1. 黑屏问题可通过GRUB界面添加nomodeset、acpi=off noapic参数解决;2. Booting a command list卡住建议更换系统版本;3. Failed unmounting/cdrom需检查CD/DVD设置;4. EFI stub卡住需断开网络安装;5. 网络连接失败需手动启用网卡并配置DHCP;6. 桌面环境安装需确保网络正常后执行apt update/upgrade;7. 需注意Netplan配置文件的YAML语法规范

编程爱好者 544

YOLOv11改进策略【损失函数篇】| 通过辅助边界框计算IoU提升检测效果(Inner_GIoU、Inner_DIoU、Inner_CIoU、Inner_EIoU、Inner_SIoU)

为了弥补现有 IoU 损失在不同检测任务中泛化性弱和收敛速度慢的问题,·Inner-IoU·通过引入比例因子 “ratio” 来控制辅助边界框的尺度大小,利用不同尺度的辅助边界框来计算损失,从而加速边界框回归过程。

Limiiiing的博客 3890

学Simulink--基础微电网场景实例:基于Simulink的微电网黑启动过程建模与仿真

黑启动(Black Start)是指在全系统停电(无电压、无频率)状态下,微电网依靠内部电源自主恢复供电的能力。🌩️典型场景主网长时间故障自然灾害导致区域停电计划检修后重启❗挑战无参考电压/频率 → 逆变器无法锁相负荷逐级投入 → 需避免过流/过压多电源协调 → 防止环流或失步✅黑启动成功标准在30 秒内恢复关键负荷供电电压/频率稳定在范围内无设备损坏或保护跳闸🎯本文目标:手把手教你使用 Simulink + Simscape + Stateflow 搭建。

amy_mhd的博客 200

Ubuntu 20.04 LTS服务器升级指南与优化实践

Linux服务器操作系统的选择直接影响服务的稳定性和维护效率。Ubuntu LTS版本因其长期支持周期和丰富的软件生态,成为企业级部署的首选。以Ubuntu 20.04 LTS为例,其默认搭载Linux 5.4内核,支持exFAT文件系统和ZFS等先进特性,同时提供5-10年的安全更新保障。在服务器升级过程中,系统兼容性验证、数据备份和依赖管理是关键环节,通过`do-release-upgrade`工具可实现平滑过渡。升级后的性能调优包括内核参数调整、微码更新等操作,结合`bpftrace`等工具可进行深度

weixin_30608503的博客 841

基于FPGA的UDP 通信(六)

本文基于FPGA和MATLAB对千兆以太网通信模块UDP数据发送(FPGA发送)进行联合调试。

记录所学,分享知识,结识挚友 4729

Ubuntu 20.04 安装 Anaconda 的正确姿势与避坑指南

Anaconda 是面向数据科学的 Python 发行版,其核心价值在于提供预编译、预集成、带 conda 包管理器的可复现环境。不同于系统级 Python 或 pip/virtualenv 方案,Anaconda 通过独立路径绑定、shell 初始化和用户级权限控制,解决 Ubuntu 20.04 中常见的 PATH 冲突、glibc 版本不兼容、CUDA 依赖错配等环境一致性难题。它特别适用于需要跨机器复现科研流程、快速启动 Jupyter/PyTorch 等工具链,以及规避 apt 与 conda 生

weixin_34387468的博客 366

把 ABAP 接到外部世界的几条路, 从 Web Service 到 RFC、BAPI 与 IDoc 的完整理解

摘要: ABAP 的连接能力是其长期成为企业核心的关键,不仅支持通用协议(HTTP、SOAP、XML),还保留了 SAP 特有的技术(RFC、BAPI、IDoc)。Web Service 是跨系统通信的主轴,依赖 SOAP/WSDL 实现契约化协作,而 Enterprise Service 更强调业务语义的复用与治理。经典技术如 RFC 和 BAPI 因高效稳定仍广泛使用,尤其适合紧耦合场景。ABAP 通过分层工具箱(如代理生成、服务注册)实现灵活集成,平衡新旧技术,满足多样化的企业连接需求。 (字数:15

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 138

【系统分析师】写作框架:软件设计模式及其应用

本文围绕"软件设计模式及其应用"展开论述。首先介绍了近三年参与的某软件开发项目背景及个人承担的系统设计工作。其次系统阐述了设计模式的三大分类:创建型(如工厂方法、单例模式)、结构型(如适配器、装饰器模式)和行为型(如观察者、策略模式),重点分析了各类模式的特点和典型应用场景。最后结合项目实践,详细说明了采用的三种设计模式的具体实施过程及效果,包括提高代码复用性、降低耦合度等优势。文章还总结了项目经验,指出存在的不足及改进方向,强调合理运用设计模式对构建高质量软件系统的重要性。全文通过理论

数据知道的博客 5060
上一篇: Dijkstra算法描述
下一篇: atof函数的实现
lq.kr
博客等级 码龄14年 9粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值