drivers/android 目录在这一轮合并窗口里瘦了一大圈:binder.c、binder_alloc.c、binderfs.c 这几个 C 文件整份删掉,留下的是 binder/ 子目录里的 Rust 实现。Carlos Llamas 9 月中旬发的补丁就叫「binder: rm -f binder.c」。这次一共改了 20 个文件,新增 9 行,删掉 11470 行。
10 月 25 日,Linus 合并了 Greg KH 的 char-misc-7.4-rc1 拉取请求(合并提交),说明里列的第一条亮点是删掉 C 版 binder,原话是「the rust version is stable and will be used going forward in a few billion devices」。写这帖时 torvalds/linux 上最新的 tag 还是 v7.3,7.4-rc1 还没打出来,不过这批改动已经在主线里了。
Kconfig 最后长什么样
补丁邮件里的版本是给 ANDROID_BINDER_IPC 加了一行 depends on RUST,同时删掉了原来的 ANDROID_BINDER_IPC_RUST。没过几天,Greg 又补了一个提交「binder: Fix up Kconfig dependancy due to removal of .c code」。理由是原来开着 Rust 版的配置升级后会编不出 binder,所以选项名改回了带 _RUST 后缀的版本,Greg 说这个发布周期先保持这样。提交说明还提了一句:以后要是想去掉这个后缀,改名时会重新提示大家选一次。主线里现在的 drivers/android/Kconfig 是:
config ANDROID_BINDER_IPC_RUST
bool "Android Binder IPC Driver"
depends on MMU
depends on NET
depends on RUST
default n
所以 Binder 确实依赖 Rust,只是选项名是 ANDROID_BINDER_IPC_RUST,不是很多转述里写的 ANDROID_BINDER_IPC。几个连带变化:
- ANDROID_BINDERFS 这个选项没了,Rust 版的 binderfs(rust_binderfs.c)直接编进 binder.o,跟着 ANDROID_BINDER_IPC_RUST 走。
- ANDROID_BINDER_DEVICES 还在,默认值仍是 “binder,hwbinder,vndbinder”,依赖改成了 ANDROID_BINDER_IPC_RUST。
- 原来的 ANDROID_BINDER_ALLOC_KUNIT_TEST 跟着 C 代码一起删了。
谁会被坑到
安卓容器离不开 Binder。按内核的 binderfs 文档,每挂一个 binderfs 实例就有一套独立的 binder 设备。新实例里起初只有 binder-control,用来按需申请设备,多个安卓实例靠这个各用各的。内核里没了 Binder,容器那一层再怎么配也起不来。
以前用 C 版的人,配置里写的是 CONFIG_ANDROID_BINDER_IPC=y 加 CONFIG_ANDROID_BINDERFS=y。这两个符号在新内核里都不存在了,新选项又是 default n。旧 .config 直接沿用的话,编出来的内核大概率没有 Binder,要到起安卓容器时才发现。原来就开着 Rust 版的配置,选项名没变,受影响小一些,前提是 Rust 支持本身还开着。
手上的源码树是哪个状态,翻一下 drivers/android/Kconfig 就知道:还能看到 ANDROID_BINDERFS 和带 !ANDROID_BINDER_IPC 条件的 Rust 选项,说明是删 C 代码之前的树。只剩一个依赖 RUST 的 ANDROID_BINDER_IPC_RUST,说明是合并之后的。跟着主线追 rc 的人,升级前把自己的配置片段对一遍,比编完开机再排查省事。
各家的内核开不开 Rust、什么时候跟进 7.4,这里没法替发行版说。用发行版内核的人暂时不用动手,等新内核包出来,照上面的办法查一下配置里有没有 CONFIG_ANDROID_BINDER_IPC_RUST 就行。
检查和准备
想看当前内核的配置,开了 IKCONFIG_PROC 的话可以 zgrep BINDER /proc/config.gz,出现 CONFIG_ANDROID_BINDER_IPC_RUST=y 就是 Rust 版。binderfs 能不能用,看 /proc/filesystems 里有没有 binder,或者照内核文档挂一下:
mkdir /dev/binderfs
mount -t binder binder /dev/binderfs
挂上后里面应该只有一个 binder-control。挂载报错、文件系统列表里也找不到 binder,多半是内核没编进去,回头查配置。
要自己编的话,内核文档《Quick Start》讲了怎么装工具链。比如 Debian 13 是 apt install rustc rust-src bindgen rustfmt rust-clippy,Fedora 是 dnf install rust rust-src bindgen-cli rustfmt clippy。装完在源码目录跑 make LLVM=1 rustavailable,Kconfig 为什么认不出 Rust,这条命令会给出原因。工具链齐了,General setup 里才会出现 Rust support(CONFIG_RUST)。文档推荐整套 LLVM 来编,GCC 只在部分配置下能用,而且还在实验阶段。
还有一类坑来自配置本身。init/Kconfig 里 RUST 有一串限制条件,比如不能开 RANDSTRUCT 和 GCC_PLUGIN_RANDSTRUCT,开了 MODVERSIONS 就得同时有 GENDWARFKSYMS。加固过的配置文件,可能得先在这里松一松,Rust support 才点得出来。另外 RUST 还依赖 HAVE_RUST,架构本身不支持的话,工具链装得再全也没用。
内核自带的 binderfs 自测配置也跟着改了,tools/testing/selftests/filesystems/binderfs/config 现在写的是 CONFIG_ANDROID_BINDER_IPC_RUST=y,自己维护配置片段的,可以拿它当参照。
有在桌面 Linux 上跑安卓容器的吗?你们用的发行版内核,Rust 开了没有?