张大妈

1.1万行C被一次性删除:Linux 7.4让Rust独挑Binder大梁,内核"生锈"这一刻把底牌全亮出来了

源自130位全网作者

10-28 17:27

今年10月的合并窗口里,一个"删除"commit比所有"新增"都更有分量。

Linus主线下的C版Android Binder驱动,约1.1万行,被全部删除,Rust版从此成为唯一实现。 不知道Binder是什么的话,一句话:每一台Android手机上,从你点图标到应用拿到焦点,进程之间说的每一句话都要经过这个内核子系统。全球最大移动设备盘子的通信命脉,就这么换了语言,没有发布会。知乎

更有意思的是数字的对照:同一个7.4窗口,还有约1.7万行新增Rust代码在涌入。一边删、一边加,内核社区把未来十年押在了Rust上。而就在删除动作落地前,内核里的Rust刚被打脸一次——首个源自Rust实现的安全漏洞被曝出,官方评定为CVSS 7.8分的高危漏洞。知乎

把这三件事放在一起,才能看懂这个拐点:它既不是"Rust大胜",也不是"Rust翻车"。

时间线:内核里的Rust是怎么走到这一步的

大多数人对"Rust进内核"的印象还停留在实验阶段。今年5月,内核中的Rust支持正式脱离实验标签:Rust在内核中的支持正式脱离了"实验性"(Experimental)标签,成为与C语言并列的、受官方完全支持的第二语言。 更早一步是今年2月,Linux 7.0内核已正式接纳Rust作为稳定组件,开发者正紧锣密鼓地修复内核中与即将到来的Rust 1.95版本相关的缺失约束条件和Clippy警告,确保平稳过渡。 之后是连续小步:7.2引入zerocopy库,把直接摸内存的代码往更小的unsafe范围里收;7.3修复GCC的Rust后端,rustc和gcc-rs两条工具链并行推进。知乎微博

10月20日发布的7.3本身也是个大节点:这个版本用18765次非合并提交、3021名开发者参与(其中807人是第一次给内核提代码)双双刷新项目历史纪录。 而7.4合并窗口里"新增1.7万行Rust"与"删除1.1万行C"同时发生——这条线不是单点跳变,是四个版本周期的连续推进。哔哩哔哩

为什么第一个删掉C实现的是Binder

Binder的痛点是引用计数。C里,计数的加减靠人在每条返回路径上手写,路径每多一条,漏改的机会就多一次,增加了编码错误的概率。 这种代码不是难,是又琐碎又容易错,恰好是"编译器能检查"的那一类。知乎

Rust版里clone(复制一份引用并加计数)与drop(值离开作用域时减计数)成对出现,如果漏写时,就会强制编译失败。知乎

删除动作也不是拍脑袋。C版被删之前,其实本次删除之前有一年多并行期,两版同时在内核主线存在,要过两道闸:用户态看不出差异,数据足够支撑替换,两个闸门都过了,删除commit才落地。知乎

Rust的首个漏洞:打脸了什么,没打脸什么

漏洞出在Rust版Binder的"死亡通知"模块——进程死掉时,内核要清理它登记的通知记录,Rust实现用侵入式链表管理这些记录。问题出在一段"看起来没毛病"的操作:Node::release在锁内把整条链表转移到局部变量,锁外再逐个处理——缩短临界区是教科书正确;但另一线程可能同时通过NodeDeath::set_cleared从原链表移除节点,节点实际还挂在旧链表上,prev/next指针被并发修改,造成数据竞争和内存破坏。公开的故障记录已经展示了内核访问非法地址并发生崩溃的情况,Linux官方指出这种内存破坏还具有进一步产生Use-after-free和内核内存访问风险的可能性。知乎

关键是:这个洞不是safe Rust代码写错了——借用检查器全数放行;是unsafe抽象依赖的前提不变量被破坏。unsafe里Rust信任人,"一个节点要么在受锁保护的链表里、要么不在任何链表里"是人的约定,链表整体转移的那一刻,约定失效。

所以这次事件支持的结论两边都不站:Rust没证明"绝对安全",也没被推翻——修复补丁没有推翻整个Rust Binder的设计,而是调整为在持有锁的情况下,逐个从原始链表中取出元素,然后暂时释放锁处理该元素,再重新获取锁继续。 Rust真正消灭的是可被编译器检查的内存错误;需要人想清楚的并发状态转换,一行都没省。"Rust安全"的准确含义是:把人必须保证的代码范围收缩到unsafe边界内——而漏洞一来,就打在边界上。知乎

社区声浪:玩笑是"生锈",焦虑是具体的

B站7.4 Rust代码新闻的评论区里,点赞最高的是一条"唉螃蟹怎么这么坏,天天让linux生锈"。 玩笑背后是三件具体的焦虑,评论区已经排好:编译门槛——“以后编译内核,不会还要先安装rust环境吧?”;生态断链——“有没有那种依赖rust库的dkms模块?”,树外驱动才是Linux第三方生态真正的暗角;价值质疑——“尽是一些绑定层代码,没什么实质意义”,反方回答也很干脆:“这是好事。”哔哩哔哩

还有根本不在内核阵营里下注的人:"内核里用Rust?不如干脆不要内核,直接用Rust!"这条视频挂着6880播放和74条评论。 圈子其实已经分成三层:C守旧派、渐进派、全Rust换轨派。第三层不是嘴炮:星绽OS(Asterinas)近期的形式化验证工作已完成150+API的验证,主要是memory management模块和sync模块。 vivo走得更远,已向开放原子开源基金会捐赠了以Rust语言自研的操作系统内核BlueKernel。哔哩哔哩微博

内核Rust化不是孤军,是被抢跑。

不同人怎么用这条新闻

Android系统/ROM从业者:受影响最直接。所有Android设备都跑Binder,7.4周期起没有C实现可以兜底。动作项只有一个:盯CVE-2025-68260的修复向stable分支回传的节奏,确认你的GKI内核何时切7.4。

驱动/嵌入式学习者:把Rust-for-Linux加进主线,但别把C卖了。unsafe边界恰恰是C时代功力的集中地——越懂C里的内存和并发,越看得懂内核押Rust押在哪里。

桌面/服务器用户:什么都不用做,等发行版滚动就行。这轮7.4里比"Rust"更可感的收益是性能:Google工程师改掉了mm/memblock.c里的线性扫描,KHO取回内存的时间从大约 268 秒 砍到大约 50 毫秒。 工作队列更新也号称带来"10到100倍"的性能优化。 Ubuntu 26.10已经切换Linux 7.3,7.4按惯常9到10周的节奏,明年年初落地。知乎哔哩哔哩

看热闹的人:留三个观察信号——7.4最终合入的Rust代码量、下一个被"删C"的子系统是谁、纯Rust OS会不会从Demo走进生产。

写在最后

内核不缺删除的commit,缺的是把一侧牌全亮出来的那种。1.1万行C离场,2020年才立项的Rust在六年后成了Android命脉的唯一实现。首个漏洞来得不是时候,来得也正是时候:它教会社区的是,这场豪赌押注的不是"Rust不出洞",而是"把洞挪到编译器拦得住的地方"。

linux生锈这个梗,头一次,不算全是玩笑。

内容由AI生成
0
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章