LWN: 确保kmalloc()分配是对齐的

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

Implementing alignment guarantees for kmalloc()

October 18, 2019

This article was contributed by Marta Rybczyńska

kmalloc()是kernel中经常用到的针对小块目标进行内存分配的函数。在2019 Linux Storage, Filesystem, and Memory Management Summit上,Vlastimil Babka的演讲介绍了开发者在使用这个API时意外碰到的alignment(对齐)问题。几个月后,他提出了第二版的patch set,对kmalloc()实现了natural alignment(自然对齐,具体来说假如这个对象的字节数是2的指数的话,buffer应该是按同样size做过对齐的)。起初,大家强烈反对这个方案,看起来没可能合入kernel,不过最终Linus Torvalds还是合入了。我们一起来看看发生了什么。

Babka打算修复的问题是kmalloc()有时候返回的对象不是natually aligned的。通常,kmalloc()返回的buffer还是满足自然对齐要求的,因此不少驱动和内核子系统也依赖这个条件。但是如果打开了SLUB debugging功能,或者使用了SLOB分配器的话就可能得到不满足自然对齐的buffer。kmalloc()其实是对SLAB, SLUB或者SLOB分配器的一个封装接口,具体用得是那个,取决于kernel config的配置。感兴趣的读者可以回顾一下2007年的文章介绍为什么要引入SLUB分配器(https://lwn.net/Articles/229984/ ),还有看一下2014年LinuxCon会议上对三个分配器的介绍(https://events.static.linuxfound.org/sites/events/files/slides/slaballocators.pdf  )。如果返回的buffer没有满足对齐条件的话,可能就会出现数据损坏等错误。为了应对这个问题,Babka建议要确保分配的buffer(如果size是2的指数次方的话)能满足自然对齐的要求,这样就能满足所有的对齐需求了。

For and against kmalloc() alignment

在讨论patch set的时候,Christopher Lameter(SLUB分配器的作者)不赞同增加自然对齐的观点,他认为kmalloc()自己原有的对齐限制(KMALLOC_MINALIGN)是合理的,因为它能优化内存分配减少浪费的空间。SLOB分配器就是个例子,它主要的设计目标是小型的嵌入式系统,希望尽量减少内存浪费。Babka的patch会改变SLOB的行为,导致达不到预期目标。并且,今后新实现的分配器都不得不考虑这个强加的限制,这样就没法针对它们的目标场景进行深度优化了。

Matthew Wilcox比较支持Babka的方案,因为其实已经有很多内核子系统代码都依赖这个对齐特性了。他举了persistent-memory(pmem)和RAM-disk驱动的例子。XFS文件系统,本身没法保证对齐,所以针对512字节到PAGE_SIZE之间的对象,都需要slab cache(缓存),甚至可能会需要更多的slab cache,取决于kmalloc()本身能保证到什么程度的对齐。

Dave Chinner赞成对小buffer来确保对齐,而对大buffer(超过一个page size的)则直接按照page边界对齐。这是他在用KASAN处理pmem的时候看到的需求。不过他建议用一个GFP flag来通知分配器是否要返回一个自然对齐的buffer,如果分配器不能满足这个要求的话直接返回失败信息即可。这样就不需要让内核其他部分的代码来创建更多的cache了。Babka等更多开发者则建议用一个单独的flag来处理这个情况。

接着大家热烈讨论了一下这个问题的重要性。Lameter觉得这种不对齐的情况应该是很罕见的,甚至可能根本不会出现,因为在各个发行版的测试系统测试时,都是打开slab debug功能的,没看到哪个驱动出问题。Christoph Hellwig则指出,出错情况通常需要一些特殊条件,例如buffer刚好跨越了page边界。

From a private NAK to the mainline

在这些讨论之后,Babka问大家是否赞成合入这个patch set:“如果有人觉得这个主意不错,请说出来(最好用正式Acked-by等方式),否则的话,这个patch就到此结束了(因为收到了private NACK——私下表示反对)”。

David Sterba回复说,他此前就曾经针对这种未对齐的情况使用了一些workaround方法,如果能fix kmalloc(),那他很愿意把workaround删掉了。

Darrick J. Wong也表示赞同,并且强烈要求讨论应该公开进行:“噢,我还不知道,咱们中间有些人有权力能通过private NACK来组织一个patch的合入,都不需要经过繁琐的公开讨论啊!”

Andrew Morton把话题引回了技术讨论上,要求开发者们能验证确保这个patch本身的正确性。Lameter从技术角度确认是可行的,不过仍然坚持反对这个出发点。接下来又收到很多赞同意见(Acked-by:),这些内核开发者表示支持Babka的方案。

这些赞同意见之后,公开讨论没有再进行了,Babka也没有再提交第三版。看起来这里卡住了,因为有不少开发者支持这组patch set,但是受这组patch影响最大的SLUB allocator maintainer本人并不支持。不过,最终这个patch还是合入了Morton的代码库,然后在10月7日合入了mainline。

Summary

这组讨论很好的展示了内核社区如何处理这种会导致旧有行为被改变的patch。不出意料,并不是所有开发者都支持这个方案的,不过,在本例中,反对者是这个子系统的maintainer本人。最终接过来看,这类改动还是可以被接受到mainline的,毕竟有很多kmalloc()用户以及其他内存你管理代码开发者都支持这么改。

用AT7456E给监控摄像头加OSD?5步搞定时间水印和Logo叠加 本文详细解析了如何使用AT7456E视频字符叠加芯片为监控系统添加专业级OSD功能,涵盖硬件设计、字符库编程和系统集成等关键步骤。通过5步操作实现时间水印和Logo叠加,提升监控系统的可用性和专业性,特别适合安防和工业视觉应用。 阅读详情

相关推荐

QMT Python API 实战指南:从安装到策略开发的完整流程

本文提供了一份详尽的QMT Python API实战指南,涵盖从环境配置到策略开发的完整流程。文章深入解析了xtdata行情模块与xttrader交易模块的核心架构与协作方式,并通过一个双均线策略实例,手把手教你如何获取数据、计算信号并执行交易,是量化交易开发者快速上手QMT Python接口文档的实用教程。

butter的博客 1414

LWN: kmalloc( )确保对齐

点击上方蓝色字关注我们~Alignment guarantees for kmalloc()ByJonathan CorbetMay 8, 2019LSFMMkmall...

Linux News搬运工 1622

Agent测试框架Harbor指南

Harbor是一个AI Agent单元测试框架,用于自动化测试AI代理在容器环境中的任务执行能力。它支持18+种AI代理,通过沙箱隔离和自动验证机制评估任务完成情况。任务必须具有可编程验证的输出结果,适合代码、数据、系统等可量化任务,不适合创意写作等主观任务。Harbor采用CLI操作方式,核心架构包含Job管理、Trial执行和验证器三个层级,执行流程包括环境启动、Agent执行和结果验证。任务目录包含指令文件、配置文件、Docker环境定义和测试脚本等必需组件,通过测试脚本自动判断任务完成质量。

loo_Charles_ool的博客 1394

Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别

我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是 free()。注意:动态申请的内存使用完后必须要释放,否则会造成内存泄漏,如果内存泄漏发生在内核空间,则会造成系统崩溃。   那么,在内核空间中如何申请内存呢?一般我们会用到 kmalloc()、kzalloc()、vmalloc() 等,下面我们介绍一下这些函数的使

程序员「阿基米东」的编程之旅 4万+

Python实战:3步搞定视频去重,告别重复文件烦恼(附完整代码)

本文提供了一套基于Python的视频去重实战方案,通过三步流程(抽帧、生成内容指纹、相似度比对)高效识别重复视频文件。文章详细介绍了使用dHash算法生成视频指纹的核心原理,并提供了完整的代码实现,帮助用户快速构建自己的视频去重工具,告别重复文件管理烦恼。

weixin_29054245的博客 379

Day 01: 与Python的第一次亲密接触

环境搭建 、第一个程序 Hello, World!、以及Python之禅 (The Zen of Python) 的解读。

杨小扩的博客 220

kmalloc,vmalloc,malloc,mmap

无

qq_42693685的博客 809

【电机驱动与运动控制】期末重点问题集合

问题1 梯形曲线和S形曲线各自的特点和区别,比较梯形和S形曲线位置、速度、加速度、加加速度的区别。 问题2 总惯量的计算包含哪几个部分? 哪几个部分需要进行折算? 在齿轮箱的输出侧(2号轴)总惯量需要折算到齿轮箱的输入侧(1号轴) 为什么需要折算? 齿轮箱比的存在使2号轴的转速和电机的转速不同 问题3 指出每个部分的名称。 每个部分的功能。 主磁极的励磁绕组:绝大部分直流电机都是由励磁绕组通以直流电建立主磁场; - 电枢铁心:在两个主磁极内表面之间,由硅钢片叠成的圆

【人工智障 | 计算鸡视觉 | 机器孩】 5703

kmalloc/vmalloc获取memory的对齐方式

kmalloc对齐方式: 所用kernel使用slob: # CONFIG_SLAB is not set # CONFIG_SLUB is not set CONFIG_SLOB=y 在linux2.6.35/inclue/linux/slob_def.h中: /**  * kmalloc - allocate memory  * @size: how many bytes of

adaptiver的专栏 4007

YOLO26中 RepVGGBlock_OREPA 架构的设计与性能提升分析(mAP +4.89)

REPVGGOREPA模块代表了重参数化技术的最新发展,它通过巧妙的架构设计实现了训练时的丰富表达和推理时的高效计算。其核心创新包括多分支特征聚合、动态权重生成、频域先验知识融合等技术,为深度学习模型的效率优化提供了新的解决方案。这种设计理念不仅在技术上具有重要意义,在实际应用中也展现出了显著的优势,特别是在需要高精度和高效率的工业场景中表现突出。随着重参数化技术的不断发展,REPVGGOREPA为未来的网络架构设计提供了重要的参考和启发。

know_F0727的博客 66

[Python] 如何使用 Python 调用 Dify 工作流服务实现自动化翻译

本文介绍了如何使用Python调用Dify的API实现文本翻译自动化。Dify作为AI开发平台,其工作流功能可执行文本处理、翻译等任务。选择Python调用Dify的优势在于职责划分清晰:Dify专注AI服务,Python处理文件操作等非AI任务。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1095

LWN:让kmalloc() 更随机!

关注了就能看到更多这么棒的文章哦~Randomness for kmalloc()By Jonathan CorbetJuly 24, 2023ChatGPT assisted translationhttps://lwn.net/Articles/938637/内核的地址空间布局随机化(ASLR, address-space layout randomization)希望通过在每次启动时更改内核...

Linux News搬运工 1059

华为OD机考双机位C卷 - 采购订单 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 采购订单 。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 426

LWN:slab 分配器的sheaves以及任意上下文的分配功能!

总而言之,他说,来自 sheaves 层的初步结果是 promising(很有希望的),但它与 slab 调试的交互需要改进。(它是 slab 分配器的一部分)实现的工作会议,该版本期望可以从任何上下文中的 BPF 程序中调用。Hoang Nhat Pham 同意,他说他工作的系统具有大量的 CPU,但只有一个 NUMA 节点,从而导致大量的锁竞争,而 per-CPU 缓存可以改善这种情况。最后一个特性几乎是没有额外代价的,因为幸运的是,当请求到达时,分配器会有一个具有足够对象的 sheaf 存在。

Linux News搬运工 1708

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LWN:SLUB分配器的下一步计划!

关注了就能看到更多这么棒的文章哦~What's next for the SLUB allocatorBy Jonathan CorbetMay 20, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/974138/Linux 内核中存在两个级别的基本内存分配器:页分配器 (page allocator),以页为单...

Linux News搬运工 465

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LWN:针对每个调用点设置slab cache来防护heap-spray!

关注了就能看到更多这么棒的文章哦~Per-call-site slab caches for heap-spraying protectionBy Jonathan CorbetAugust 20, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/986174/攻击者经常使用的一种入侵系统的手段是堆喷射 (heap sprayin...

Linux News搬运工 1890

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LWN:7.0 合并窗口的后半部分

Qualcomm Kaanapali 时钟控制器、Qualcomm SM8750 摄像头时钟控制器、Qualcomm MSM8940 和 SDM439 全局时钟控制器、Google GS101 DPU 时钟控制器、SpacemiT K3 时钟控制器、Amlogic t7 时钟控制器、Aspeed AST2700 时钟控制器,以及 Loongson-2K0300 实时时钟。现在可用于 设置期望的超时时间,内核在发生软锁定(soft lockup)后,将按此时间(以 20 秒为倍数)触发恐慌(panic)。

Linux News搬运工 191

[lwn]Double kfree() errors

Double kfree() errors [Posted March 6, 2006 by corbet] http://lwn.net/Articles/174494/ Less than 24 hours after Coverity announced the availability of a new set of machine-detected pote

smile 898

LWN:magic 消失了!

关注了就能看到更多这么棒的文章哦~Losing the magicBy Jonathan CorbetDecember 5, 2022DeepL assisted translationhttps://lwn.net/Articles/915163/kernel 项目现在已经有三十多年的历史了。这期间不断有一些开发实践(development practice)出现和消失。曾几何时,人们认为用 "...

Linux News搬运工 8276

LWN:使用Rust进行Linux kernel开发!

Supporting Linux kernel development in RustAugust 31, 2020This article was contributed by Nel...

Linux News搬运工 1085

LWN:BPF程序可更灵活地访问内存!

关注了就能看到更多这么棒的文章哦~More flexible memory access for BPF programsOctober 21, 2022This article was contributed by David VernetDeepL assisted translationhttps://lwn.net/Articles/910873/BPF 程序中,所有内存访问都先要使用 v...

Linux News搬运工 711

android 内存管理 ion,android内存管理-ION/PMEM

ION debugION 在/sys/kernel/debug/ion/ 提供一个debugfs 接口。每个heap都有自己的debugfs目录,client内存使用状况显示在/sys/kernel/debug/ion/<>$cat /sys/kernel/debug/ion/ion-heap-1client pid sizetest_...

weixin_42519489的博客 290

linux内存管理笔记(十一)---CMA

在我们使用ARM等嵌入式Linux系统的时候,一个头疼的问题是GPU,Camera,HDMI等都需要预留大量连续内存,对于内核如果申请一块连续的内存空间该怎么处理呢? 首先向到的是利用内核提供的kmalloc申请,尽管kmalloc可以申请连续的内存空间,但是在长时间的测试中,会出现内存空间可能申请失败的情况,无法保证能成功分配。 使用memblock分配器中提供的方法,称为预留内存,但这么预留的内存只能被特定的Device驱动所使用,System不能分配这部分内容,会导致内存浪费 因此,内核设计者设..

oqqYuJi12345678的博客 1991

深入理解Linux网络技术内幕 P1-P2

细品

西门吹雪 539

手把手学Linux设备驱动:从字符设备到内核机制的完整路径

Linux设备驱动是嵌入式与物联网系统的基石,其开发涉及内核态编程、硬件交互与并发控制,学习门槛较高。驱动的核心在于理解字符设备、块设备与网络设备的框架差异,以及设备树如何描述硬件资源。内核提供的file_operations、中断机制、等待队列与锁机制,是驱动稳定运行的关键技术。掌握这些原理后,开发者可在开发板上实践GPIO、I2C、SPI等真实驱动,并借助动态调试、ftrace等工具定位问题。从基础内核模块到设备树解析,从并发安全到中断上下文,系统化的学习路径能帮助工程师快速上手。本文结合新书出版契机,

weixin_33796205的博客 453

Linux 内核 RCU 完全解析:从“读、复制、更新“思想到核心 API、玩具实现与生产级源码

RCU(Read-Copy-Update,读、复制、更新)是 Linux 内核中专为"读多写少"场景设计的同步机制,诞生于 2.5 内核开发周期。本文基于内核树中 [Documentation/RCU/whatisRCU.rst](https://link.gitcode.com/i/b66e239eb3bc40759780986b5191500f) 的完整内容,并结合 [include/linu

gitblog_00076的博客 551
上一篇: LWN: BPF和realtime patch的冲突
下一篇: LWN: Linus Torvalds下手修复了getrandom()
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值