ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

【重磅】Linus 亲自操刀!Linux 7.0 合并 20,000 行补丁,统治 34 年的 kmalloc 终于变了! 兄弟们见证历史了最近 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 内核的安全性又上了一个台阶。
返回列表