微软在 Github 上发布了代码,使开发人员能够用 Rust 编写 Windows 驱动程序,这是为操作系统实现内存安全编程的关键一步。Azure 首席技术官马克-鲁西诺维奇(Mark Russinovich)在 X 上发布了该链接,并附有评论:"努力实现用 Rust 开发 Windows 驱动程序"。
这项工作可以追溯到很多年前。2019 年 7 月,微软研究院发帖称,它希望"在漏洞发生之前消除一整类漏洞",提出了内存安全语言的理由,并表示"满足这些要求的最有前途的较新系统编程语言之一是最初由 Mozilla 发明的 Rust 编程语言"。
该公司推崇 Rust,不仅因为它的内存安全,还因为它的数据竞赛安全--确保"两个或多个线程不会不同步地访问一段内存"。
2022 年,Russinovich 宣布:"现在是时候停止用 C/C++ 启动任何新项目了,在需要使用非 GC 语言的情况下使用 Rust。为了安全性和可靠性起见,业界应该宣布这些语言已被淘汰。"C# 和 Java 等 GC 或垃圾回收语言适用于商业应用,但不适合底层系统代码。
虽然 Windows 主要是用 C 和 C++ 编写的。"由于各种技术和历史原因,现在大部分用户模式代码都是用C++编写的,但大部分内核代码还是用C语言编写的。"2018年,长期从事软件开发的微软软件工程师陈伟明(Raymond Chen)说,虽然此后出现了Windows 11,但在开发新版本时,操作系统并没有重写。硬件制造商为使其设备能在 Windows 中运行而使用的 Windows 驱动程序工具包,仍然是一个 C/C++ 工具包。
根据基于 Rust 的新驱动程序工具包的发布说明,其目的是同时支持 WDM(Windows 驱动程序模型)和 WDF(Windows 驱动程序框架)驱动程序。WDM 驱动程序级别较低,与操作系统紧密相连,而 WDF 驱动程序则通过框架库与系统交互。初始资源库的重点是 WDK。
说明还补充说:"该项目仍处于早期开发阶段,尚不建议用于商业用途。微软鼓励进行试验和反馈,并指出开发人员可以到资源库中的 GitHub 讨论区寻求反馈。"
一个早期问题是如何处理异常。一位开发者说:"对于 Windows 内核(以及整个操作系统)来说,结构化异常处理是 Windows 开发不可或缺的一部分,也是让 Rust 成为 Windows 内核开发现实的真正障碍。Rust 没有异常,它更倾向于使用结果变量报告可恢复的错误,而在无法恢复的错误中,它会以崩溃失败的方式退出。在内核代码中,这种崩溃是不可取的,因为它会导致系统整体崩溃。"
开发者约翰尼-肖(Johnny Shaw)引用了 Linux Torvalds 在 Linux 内核(也采用了 Rust)中的一段话:"因为内核代码不同于随机的用户空间系统工具。内存耗尽绝对不能导致中止。 它只需要导致错误返回"。托瓦尔兹认为这是一个"根本性问题"。
微软新版本库中的早期代码包括以下注释:
// FIXME: Should this trigger Bugcheck via KeBugCheckEx?
这个问题说明,在底层 Windows 代码中引入 Rust 并不仅仅是为 WDK API 添加 Rust 语言绑定那么简单。不过,最初的反应总体上是积极的。内存安全问题在 Windows 的安全性和稳定性问题中占了很大比例,因此采用 Rust 是一个可行的解决方案。