资讯动态

【重磅】Linus 亲自操刀!Linux 7.0 合并 20,000 行补丁,统治 34 年的 kmalloc 终于变了!

发布时间:2026/8/15 21:13:25 来源:尧图企业网站定制
兄弟们见证历史了最近 Linux 7.0 合并窗口发生了一件大事Linus Torvalds 亲自合并了一个涉及 8,000 多个文件、改动超过 20,000 行代码的超大 Pull Request。这次动刀的对象竟然是内核里最最最基础的内存分配 API ——kmalloc()。作为一个从 1991 年 Linux 0.11 版本那时候还叫malloc就存在的“活化石”kmalloc统治了内核开发者 34 年。但现在为了干掉那些折磨人的 BugLinus 决定是时候给它来场全方位的“降维打击”了 那些年我们被 kmalloc 坑过的日子大家知道经典的kmalloc原型长这样void *kmalloc(size_t size, gfp_t gfp);这典型的“20 世纪 C 语言风格”简直是 Bug 的温床。最经典的翻车现场莫过于struct foo *ptr; ptr kmalloc(sizeof(ptr), GFP_KERNEL); // ❌ 这里的 sizeof(ptr) 只是指针大小编译器不会报错程序能跑但内存分少了。等到溢出的那一刻你就等着看内核崩溃Kernel Panic吧。尤其是处理对象数组和**柔性数组Flexible Array**时那计算逻辑简直让人头秃。️ 新一代 API 登场类型安全拒绝盲猜为了终结这些低级错误Kees Cook 引入了一套全新的宏Linus 随后也加入了“战场”。1. 自动识别类型kmalloc_obj()再也不用手写sizeof了// ✅ 以前 ptr kmalloc(sizeof(*ptr), GFP_KERNEL); // 现在 ptr kmalloc_obj(*ptr, GFP_KERNEL);黑科技点如果你手抖写错了参数类型编译器现在会直接报错因为kmalloc_obj实现了返回值与目标指针的类型安全匹配。2. 批量分配神器kmalloc_objs()分配数组再也不用担心乘法溢出ptr kmalloc_objs(*ptr, count, GFP_KERNEL); // 简单、优雅、安全3. 柔性数组终结者kmalloc_flex()这是专门给带柔性数组的结构体准备的。如果你在结构体里定义了__counted_by()它甚至能自动初始化长度字段ptr kmalloc_flex(*ptr, flex_member, count, GFP_KERNEL);️ Linus 的灵魂一击GFP_KERNEL 也要“省”本来补丁到这就差不多了但Linus Torvalds在审代码时突然灵光一现“既然 90% 的调用都是GFP_KERNEL为什么还要天天写它”于是在合并后的 9 小时内Linus 亲自施展“宏魔法”把gfp参数变成了可选参数现在你可以直接这么写ptr kmalloc_obj(*ptr); // 默认就是 GFP_KERNEL爽Linus 对此表示“代码看起来真的顺眼多了The code really does look better。” 哪怕这会导致成千上万的合并冲突Merge ConflictLinus 也觉得值了 总结新旧 API 对比表特性传统 kmalloc7.0 新型 kmalloc_obj 系列类型检查❌ 无void *✅ 强类型安全内存大小计算 程序员手动sizeof 宏自动推导默认参数❌ 必须传GFP_KERNEL✅ 可省略代码更简洁柔性数组支持 极其痛苦且易错 专属kmalloc_flex支持 结语虽然这次改动让很多维护者面临“合代码合到吐”的窘境但从长远来看Linux 内核的安全性又上了一个台阶。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价