LWN:MAX_ORDER 带来的麻烦!

【原】Linux内存管理相关—基础知识篇(一) 工作中遇到这样的问题,调用alloc_pages(GFP_KERNEL, 13),返回值为NULL,并且打印告警。使用cat /proc/buddyinfo 命令查看,最大为2的10次方,将13改为10,函数成功调用。 阅读详情

关注了就能看到更多这么棒的文章哦~

The trouble with MAX_ORDER

By Jonathan Corbet
January 1, 2024
ChatGPT translation
https://lwn.net/Articles/956321/

或许人们认为关于定义整数常量值的一个很简单宏可能没有太多可说的。但内核似乎不是这样。对 MAX_ORDER 定义的更改带来了许多随之而来的影响,清理这个改动的任务尚未完成。因此,也许有必要对 MAX_ORDER 进行一番了解。

与 Linux 内核最早的版本里其他部分一样,内存管理也是很简单的实现,主要用来做单个页面的跟踪和管理。然而,到了 1994 年左右,随着内存大小的增加和内核的复杂化,很明确需要能处理较大块的页面。1994 年 4 月的 1.1.0 发布包含了内核的“伙伴分配器(buddy allocator)”的雏形,它以二的幂次方 size 的 block 作为单位来跟踪和分配页面。

随之而来的是“order(阶)”的概念,它只是内存块中页面数的二进制对数。阶为 0 的块就是单一 page,阶为 1 的块包含两个 page,依此类推。在 1.1.0 中,不同阶的内存块被保存在单独的列表中,有一个宏(NR_MEM_LISTS)描述了有多少个这样的列表。最初它被赋值为 6,这意味着可以管理的最大内存块是 order 为 5 的 block,也就是 32 个页面。1997 年 1 月的 2.1.23 发布里增加了AP1000 CPU的特殊情况支持,该 CPU 需要能够分配 8MB(阶为 11)的内存块;如果内核为该体系架构来构建的话,则将 NR_MEM_LISTS 设置为 12。

在 2.3.27(1999 年 11 月)中, NR_MEM_LISTS 得到了一个新的名字 — MAX_ORDER — 并对除 AP1000 外的所有情况都设置为 10。对 AP1000 的支持最终在 2000 年 2.3.42 中被移除,但调整 MAX_ORDER 来适应特定体系架构的做法变得越来越普遍。MAX_ORDER 的默认值现在可以在不同体系结构之间有很大的变化;在大多数系统上默认为 11。因此,在这些系统上,页面可以以 order 为 0 到 10 的内存块作为分配单位。

MAX_ORDER 目前的一个有趣之处是,按照迄今为止的描述,它实际上并不是最大 order;如果 MAX_ORDER 为 11,则可以分配的最大阶为 10。2023 年 3 月,Kirill Shutemov 决定解决这个不一致性,因为他注意到 MAX_ORDER 的一些代码中存在误解含义而导致的 bug;于是生成了这一系列补丁,修复了九个不同地方的此类 bug,包括了一个长期存在的bug,位于软盘驱动程序中。

然而,工作并没有就此结束;在这一系列的最后,Shutemov 重新定义了MAX_ORDER的含义:分配可以达到的最大 order。因此,MAX_ORDER 现在通常默认为十就导致内核(仍然)维护 11 个空闲块列表。当时,对于这一变化大部分反馈都积极接受,尽管 Mel Gorman 担心这一改动可能会导致 stable kernel 分支出现问题。David Laight 建议更改 MAX_ORDER 的名称将有助于防止这些问题,但是这个建议被忽略了,Shutemov 的一系列补丁在 2023 年 6 月的 6.4 版本中合并。

当时似乎问题已经解决。然而,在接下来的九月底,Paolo Bonzini 指出三个改动都是与 MAX_ORDER 改动同时开发的,它们仍在使用旧的含义。这些改动在编写时是正确的,但在 MAX_ORDER 更改后就出现问题了,但没有人注意到。近两个月后,Mike Snitzer 发送了一个拉取请求,其中包含了对其中一个 bug 的修复,该错误是由于为 6.5 合并的 dm-crypt 目标更改引入的。人们发现那些 out-of-tree 的代码比如 backport 代码就可能会被这一改动悄悄地破坏 — 这是在考虑 MAX_ORDER 改动时没有人提出的一个担忧。

这个错误导致 Linus Torvalds 质疑是否应该进行这个更改。他建议在没有强力理由需要保持这一改动的情况下,干脆撤销掉;他后来补充道:

啊。我看了一下引出这个改动的 commit,我真的认为“如果这是 24 年历史的结果,那么它并不是一件大事”。

与语义变更对 backport 的必然出现的问题相比(在这个合并窗口已经导致了问题),我仍然认为这一切很可能是一个错误。

他还说,与 MAX_ORDER 相关的错误通常不容易通过测试发现,因为很少会分配最大尺寸的内存块。

Shutemov 回应道,他在那个系列中修复的 bug 只是进入主线的并且从未被发现过的 bug;“我个人因 MAX_ORDER-1 的事情花了一些时间调试”。 Shutemov 接着说,真正的错误在于(正如 Laight 所指出的)保留了 MAX_ORDER 名称而改变其语义:“只要将其重命名为 MAX_PAGE_ORDER 或类似的东西就会提醒那些尚未推到 upstream 的代码”。他随后提交了另一个补丁,添加了一个新的符号 NR_ORDERS ,定义为 MAX_ORDER+1 。Torvalds 同意这一更改,但坚持认为 MAX_ORDER 的名称需要改掉以避免将来出现问题。

在十二月底,Shutemov 发布了两个新的补丁进行这些更改。其中第一个引入了新名称(现在是 NR_PAGE_ORDERS ),描述了页面分配器支持的分配 order。第二个然后将 MAX_ORDER 重命名为 MAX_PAGE_ORDER ,结果是任何使用 MAX_ORDER 的外部代码现在将无法编译。这一变更应该防止 dm-crypt bug 的重复;它还应该防止 MAX_ORDER 的错误进入稳定的内核。

这些补丁似乎可能在 6.8 合并窗口打开后被合入,这将结束内核中 MAX_ORDER 的漫长存在历史。这个故事的教训是名称确实很重要;错误的名称可能导致产生不正确的代码。同样重要的是,名称的含义不应该在没有引起可能受影响代码的注意的情况下被更改。如果一个名称不对,它可能也完全应该继续保留。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png

Kernel: MAX_ORDER,fol,first-order-logic 文章目录讲解的比较清楚的文档是相关循环相关参数 实现伙伴算法的一个重要参数,相当于空余内存大小数列个数的限制。 /* free areas of different sizes */ struct free_area free_area[MAX_ORDER]; 讲解的比较清楚的文档是 /Documentation/networking/packet_mmap.txt These memory regions are allocated with calls to the __get_free_page 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第二百三十三篇 信号量与进程调度、磁盘/SSD调用、内存管理及I/O工作方法的系统设计理论与方程式 第六章节01

设存储系统对外暴露逻辑对象标识集合 K,对内映射到物理资源集合 P。索引函数定义为文件系统:k=(inode,offset) 或 (path),P 为数据块/extent;对象存储:k=(bucket,key,version),P 为分片/EC chunk/副本节点;块存储:k=lba 或 lba 区间,P 为磁盘/SSD 物理页、RAID 成员、卷映射项。

weixin_49199313的博客 147

内存管理 | 伙伴系统

内存在进行申请和释放内存的情况下,难免会产生碎片。Linux采用伙伴系统解决外部碎片的问题,采用slab解决内部碎片的问题。 什么是碎片 内部碎片是由于采用固定大小的内存分区,即以固定的大小块为单位来分配,采用这种方法,进程所分配的内存可能会比所需要的大,这多余的部分便是内部碎片。 外部碎片是由于未分配的连续内存区域太小,以至于不能满足任意进程所需要的内存分配请求,这些小片段且不连续的内存空间被称为外部碎片。 伙伴系统 有两种方法可以有效的避免外部碎片: 方案一:采用分页技术将不连续的空闲页面映射

phmatthaus的专栏 3447

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 272

dma_alloc_coherent DMA内存申请学习笔记

dma_alloc_coherent 相关的知识网络上有很多,将相关的知识收集汇总以便于后续遇到问题方便查找。这一次对dma_alloc_coherent进行学习的原因是在使用rapidio驱动时申请大于64M的DMA内存时,遇到多次申请无法申请到内存的情况(加大预留DMA内存不能解决)。进而学习一下相关知识看是否有方法能解决相关问题。遇到的问题DMA无法申请大于32M的内存,MAX_ORDER 这个宏设置的太小,这个宏限制了一次请求所能分配的最大物理页数。如果申请5MB内存,MAX_ORDER 需要不小于

qq_42254853的博客 8689

LLC谐振变换器恒压恒流双竞争闭环控制simulink仿真(附说明文档)

内容概要:本资源是一套面向电力电子与智能控制领域的综合性科研仿真资料合集,核心聚焦于LLC谐振变换器的恒压恒流双竞争闭环控制策略设计与Simulink建模仿真实现,涵盖半桥LLC、双向全桥LLC等拓扑结构的调频闭环仿真,并提供详尽的说明文档与PPT辅助材料。资源体系不仅深入呈现LLC变换器的动态响应与控制逻辑,还扩展至双有源桥(DAB)变换器的软开关协同优化、最小应力控制、EPS调制策略及新扩展移相角优化等前沿技术,同时集成三相PWM整流器在电网不平衡条件下的功率平衡控制、VOC+SVPWM双闭环控制等典型应用场景。此外,资源包涵盖状态估计(如EKF、UKF、PF)、微电网经济调度、卡尔曼滤波融合、神经网络控制、PID优化、储能系统管理等多个交叉方向,特别强调对顶级EI期刊研究成果的高精度复现,旨在帮助科研人员快速掌握先进控制算法的核心思想与仿真实现方法。; 适合人群:电气工程、自动化、电力电子、新能源科学与工程等相关专业的硕士博士研究生、高校科研人员,以及从事新能源变换器、智能电网、电动汽车、微电网系统研发的工程技术人员。; 使用场景及目标:① 深入理解LLC与DAB变换器的闭环控制机理,掌握恒压恒流切换、软开关实现与损耗优化方法;② 利用Simulink平台构建复杂电力电子系统模型,开展动态性能分析与控制器参数整定;③ 复现高水平期刊论文中的先进控制策略,提升科研创新能力与论文发表竞争力;④ 支持毕业设计、科研课题、项目申报及工程原型开发中的仿真验证环节。; 阅读建议:建议结合提供的完整资源目录循序渐进学习,优先研读标注“顶级EI复现”的案例以获取权威方法参考,配合MATLAB/Simulink动手搭建模型,重点关注控制框图设计、调制逻辑实现与仿真结果对比,深入理解算法背后的物理意义与数学推导过程。

攻防世界 misc题GFSJ1129-【您看我还有机会吗?】

我们发现了隐藏内容,一开始我以为那个英文就是flag,提交后发现不对,然后我想只有一张图片然后图片上的隐写内容又不是flag,那必定还有什么文件被隐藏了,于是我们打开VMware并启动Ubuntu,使用binwalk分析一下有没有隐藏文件,我们要在Terminal中分析,如下。我们发现里面有一个flag.txt文件,我们尝试提取里面内容,但发现又要密码,我们想起了之前图片上的隐藏内容,我们将那段英文输入(包括空格和符号,在VMware中输入密码不会有显示,你看到的就像没输入一样),然后我们看到如下。

大数据专业,关注 AI 安全与数学建模。记录 Web 安全、对抗攻击、隐私保护等安全实践,以及从经典模型到智能方法的建模思考。用数学思维理解 AI,用 AI 方法反哺安全与建模。 1092

【Linux 内核 内存管理】分区伙伴分配器 ① ( 分区伙伴分配器源码数据结构 | free_area 空闲区域数组 | MAX_ORDER 宏定义 | 空闲区域的页最大阶数 )

一、分区伙伴分配器、 二、分区伙伴分配器源码数据结构、 1、free_area 空闲区域数组、 2、MAX_ORDER 宏定义 ( 空闲区域的页最大阶数 )

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2429

SDU CS 期末考回忆版合集

删除原有分散的版本,合订起来画个。包括:机器学习、算法、图形学、操作系统、编译原理、软件工程、大数据分析管理、计算机体系结构等。

https://github.com/ZhaoyungZhang 6648

LWN:NVIDIA在追求能一次分配1GB的连续内存空间

点击上方蓝色字关注我们~Improving access to physically contiguous memoryByJonathan CorbetMay 8, ...

Linux News搬运工 265

别再用MounRiver了!在VSCode里用PlatformIO搞定CH32V208开发(附完整配置流程)

本文详细介绍了如何在VSCode中使用PlatformIO进行CH32V208开发,替代传统的MounRiver Studio。通过完整的配置流程和优化技巧,开发者可以构建高效、现代化的RISC-V开发环境,显著提升编译速度和开发效率。

weixin_28711397的博客 533

YOLO十年演进:从CNN到Transformer再到MoE,我看懂了2026年目标检测的落地风向标

技术永远是为业务服务的,能解决真实问题的技术,才是有价值的。YOLO的十年演进,从CNN到Transformer再到MoE,从来都不是学术上的炫技,而是一步一步解决工业落地的痛点:从让实时检测成为可能,到解决复杂场景的漏检误检,再到打破精度和算力的死局,每一步都踩在了工业落地的真实需求上。很多新入行的朋友,总喜欢追新,今天换Transformer,明天堆MoE,觉得模型越新、参数越大,就越厉害。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 748

Linux内核中分配4M以上大内存的方法

在Linux内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= MAX_ORDER))        return NULL;"), page的大小一般是4K bytes, MAX_ORDER缺省定义为11, 所以如果不修改内核, kmalloc能够分配的最大...

铁匠Smith先生的专栏 4089

22、自动化地图制作与Pandas数据处理

本文介绍了在ArcGIS Pro中使用arcpy.mp模块进行自动化地图制作的关键技术,涵盖地图元素的访问、移动与文本修改,以及将布局批量导出为JPEG、PNG和PDF格式的方法。同时,文章深入探讨了Pandas在数据处理和地理空间分析中的应用,特别是Spatially Enabled DataFrames(SEDFs)的使用。通过综合案例展示了地图更新与数据清洗、分析的结合,提升了地图制作与数据处理的效率,为GIS自动化工作流提供了实用指南。

w8x9y0z1的博客 78

linux 高效分配大内存,【转】Linux内核中分配4M以上大内存的方法

在Linux内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order >= MAX_ORDER)) return NULL;"), page的大小一般是4K bytes, MAX_ORDER缺省定义为11, 所以如果不修改内核, kmalloc能够分配的最大连续...

weixin_42116604的博客 486

【图像去噪】论文复现:超分思想助力荧光显微图像自监督去噪!N2SR的Pytorch源码复现,图文详细教程跑通源码,框架结构原理示意图与代码对应,注释详细,补充三个实用功能代码!

论文题目:Noise2SR: Learning to Denoise from Super-Resolved Single Noisy Fluorescence Image —— Noise2SR:从超分辨率单噪声荧光图像中学习去噪【图像去噪】论文精读:Noise2SR: Learning to Denoise from Super-Resolved Single Noisy Fluorescence Image(N2SR)N2SR框架结构和原理都比较简单,创新点是加入超分,有很多类似的自监督框架;

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 631

【Windows Server 2019】DNS服务器的配置与管理——DNS正向解析

博文介绍了如何使用正向解析区,包括创建和添加并验证,以及术语 主机记录,别名,邮件交换记录的解释。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 1万+

解析Linux内核内存管理与漏洞利用

网上已经有很多关于Linux内核内存管理的分析和介绍了,但是不影响我再写一篇:) 一方面是作为其他文章的补充,另一方面则自己学习的记录、总结和沉淀。所谓条条大路通罗马,本文只作为其中一条路,强烈建议想去罗马的朋友看完文末所列举的参考文章。在我们平时学习相对复杂的系统时,仅仅了解实现文档只能算是走出第一步;阅读代码并且上机调试可以将理解加深一个层次,知道“what's inside“;不过,如果能从攻击者的角度去分析和利用(滥用),那理解又会加深一个层次,真正做到”inside out“。...

Chinese_big_boy的博客 734

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

基于 transformer、lstm、LSTM多特征的交通流量预测 完整数据代码 超全项目 本科硕士毕设卓卓有余

4655

【Linux内核】kmalloc分配内存大小(非常详细)

基于linux-5.15分析。

1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深入linux内核架构--内存管理(伙伴系统)

伙伴系统   伙伴系统承担内核初始完后的物理内存管理工作,负责管理各个zone中的物理内存分配,释放。其基本工作原理如下: 把内存按照页划分成很多阶,最大阶为MAX_ORDER,一般设置为11,每个阶内存区的内存块数为2^n,我们称之为内存区。 当进程申请一段内存时,总是从适合大小的阶中分配指定内存区,比如当分配7k(4k * 2^1,7k离8k最近)内存的时候,会从第1阶分配对应的内存区。...

jinking01的专栏 1610

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

内存管理六 伙伴系统管理内存

首先要做的就是找到指定的分配管理区,管理区的编号保存在high_zoneidx中然后就是尝试第一次分配,流程是从指定的管理区开始扫描管理区-->找到充足的管理区-->从指定的迁移类型链表中分配内存-->如果在指定迁移类型中找不到则到其他的迁移类型中去寻找如果第二步在各个区域都找不到可以满足分配的内存了,那么说明管理区的内存已经确实不够了,于是开始启用一条慢速的途径来分配,包括尝试去换出一些不经常使用的页等等,内核会在这

frank_zyp的博客 1705

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

linux内核内存管理学习之二(物理内存管理--伙伴系统)

linux使用伙伴系统来管理物理内存页。 一、伙伴系统原理 1. 伙伴关系 定义:由一个母实体分成的两个各方面属性一致的两个子实体,这两个子实体就处于伙伴关系。在操作系统分配内存的过程中,一个内存块常常被分成两个大小相等的内存块,这两个大小相等的内存块就处于伙伴关系。它满足 3 个条件 :  两个块具有相同大小记为 2^K 它们的物理地址是连续的 从同一个大块中拆分出来 2. 伙

浩海拾贝 1万+

深入理解linux内核架构(内存管理)

1:在内核使用高端内存页之前,必须使用下文讨论的kmap和kunmap函数将其映射到内存虚拟地址空间中。 2:UMA计算机(一致内存访问,uniform memory access)将可用内存以连续方式组织起来。 3:NUMA计算机(非一致性内存访问,non-uniform memory access)系统的各个CPU都有本地内存,可支持特别快速的访问,各个处理器之间通过总线连接起来,以支持其

xueli1991的博客 8496

linux内核中分配4M以上大内存的方法

在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= MAX_ORDER))        return NULL;"), page的大小一般是4K bytes, MAX_ORDER缺省定义为11, 所以如果不修改内核, kmalloc能够分配的最大连续内存一般是4M

kevin1078的专栏 7084

CONFIG_FORCE_MAX_ZONEORDER 定义最大申请的内存

#ifndef CONFIG_FORCE_MAX_ZONEORDER #define MAX_ORDER 11 #else #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER #endif #define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1)) __alloc_pages_slowpath中检查的code如下:如果没

jason的笔记 2692
上一篇: LWN:Rust 的近期重要改动!
下一篇: LWN:在email里面伪造另一封email!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值