过去几年,Google 工程师一直在用 Rust 编程语言重新实现 Android 的 Binder 驱动。Binder 是 Android 中的关键部分,用于进程间通信(IPC),现在随着 Linux 6.18 的发布,Rust 重写版本看起来将被上游化。
本周已将 Rust Binder 驱动加入 Greg Kroah Hartman 的 char-misc-next Git 分支。随着它被加入 char/misc 区域的 “next” 分支,预计将在未来一两周内启动的即将到来的 Linux 6.18 合并窗口期间提交。
关于用 Rust 重写的 Android Binder IPC 内核驱动,谷歌工程师 Alice Ryhl 在添加新 Rust Binder 驱动的补丁中解释道:
“我们通常不主张重写(重写是让人不愉快且耽误晚餐的事情!)。那么为什么要重写 Binder?
Binder 在过去 15 多年里一直在发展,以满足 Android 不断变化的需求。随着时间的推移,它的职责、期望和复杂性都有了显著增长。虽然我们预计 Binder 会随着 Android 继续发展,但目前有一些因素限制了我们的开发/维护能力。简而言之,这些因素是:
1. 复杂性:Binder 是 Android 中所有事物的交汇点,并承担着远超进程间通信(IPC)的许多职责。它对许多人来说意味着很多,由于其众多特性及其相互作用,其复杂性相当高。在仅 6kLOC 的代码量中,它必须将事务传递给正确的线程。它必须正确解析和转换事务的内容,这些内容可能包含多种类型的多个对象(例如,指针、文件描述符),这些对象可以相互作用。它控制用户空间线程池的大小,并确保事务以避免线程池耗尽线程导致死锁的方式分配给线程。它必须正确地在进程间转发共享对象的引用计数变化。它必须处理大量错误场景,并结合/嵌套了 13 个不同的锁、7 个引用计数器和原子变量。最后,它必须尽可能快且高效地完成所有这些工作。轻微的性能退化可能导致用户体验明显下降。
2. 需要改进的地方:随着代码库有机地增长,可能会出现千行函数、易出错的错误处理和结构混乱等问题。经过十多年的开发,这个代码库需要进行一次彻底的改进。
3. 安全关键:Binder 是 Android 沙盒策略的关键部分。即使是 Android 最不具特权的沙盒(例如 Chrome 渲染器或 SW 编解码器)也直接访问 Binder。与其他任何组件相比,Binder 提供强大的安全性并自身具备强大的抗安全漏洞能力至关重要。
正是第 1 点(高复杂性)使得在不引发第 3 点(安全问题)的情况下继续演进 Binder 和解决第 2 点(技术债务)变得异常困难。为了让 Binder 继续满足 Android 的需求,我们需要更好的方法来管理(并减少!)复杂性,同时不增加风险。
最大的变化显然是编程语言的选择。我们决定使用 Rust,因为它直接解决了我们在过去几年中在 Binder 中面临的一些挑战。它防止了引用计数、锁、边界检查方面的错误,并在很大程度上减少了错误处理的复杂性。此外,我们还能够使用更丰富的类型系统来编码各种结构和指针的所有权语义,这使得管理对象生命周期的复杂性从程序员手中移除,降低了 use-after-free 和类似问题的风险。”
Rust Binder 驱动已在 Android 模拟器和 Google Pixel 6 Pro 上进行了测试。Rust Binder 驱动实现了 C Binder 驱动支持的所有功能。

除非 Linus Torvalds 在最后一刻提出反对或问题,否则看起来即将到来的 Linux 6.18 周期将是第一个被未来 Android 设备使用的 Rust 内核驱动。
转自 Linux 6.18 Expected To Land Google’s Rust Binder Driver – Phoronix
Linuxeden开源社区