抛弃 C / C++!微软官宣:请用 Rust 编写 Windows 驱动!
共 6516字,需浏览 14分钟
·
2023-10-14 06:56
点击关注公众号,Java干货及时送达
转自:CSDN(ID:CSDNnews)
凭借卓越的内存效率、速度与安全性等特点,近几年 Rust 可谓深受大厂青睐:
2019 年,AWS 表示开始在其基础架构中越来越多地使用 Rust 后,决定赞助 Rust,即 Rust 团队可以优惠租用 AWS 基础设施以进行语言开发。
2021 年 2 月 9 日,Rust 基金会成立,Mozilla、亚马逊、华为、谷歌和微软作为创始白金成员,承诺在两年时间里每年投入不少于 100 万美元的预算,以用于 Rust 项目的开发、维护和推广。
2022 年,Meta 宣布将 Rust 语言纳入其服务器端编程语言。
2022 年 12 月,Linux 内核 6.1 发布,包含了初始 Rust 支持。
今年年初,谷歌宣布支持使用 Rust 开发 Chromium。
……
在这众多大厂之中,微软对于 Rust 的重视与支持力度也一直未减。继 5 月效仿 Linux 用 Rust 重写部分 Windows 内核后,近来微软在拥抱 Rust 上又进了一步:微软在 GitHub 中发布了一系列开发工具包,让开发者可以使用 Rust 语言来编写 Windows 驱动程序。
对此,不少开发者在感慨:没想到啊,Windows 在拥抱 Rust 方面居然走在了 Linux 前面!
在拥抱 Rust 的路上,微软曾遭到反对
事实上,早在 2019 年 2 月,微软工程师 Matt Miller 在以色列举行的安全会议 BlueHat 上曾透露:从 2006 年到 2018 年,微软旗下产品过去 12 年修复的所有漏洞中,有七成涉及的都是内存安全问题。
内存安全问题占比高的原因,主要是因为 Windows 大多是以 C 和 C++ 编写的——著名的“内存不安全”语言。内存管理代码只要有一个漏洞,就会导致大量的内存安全错误,从而可能引发远程代码执行或权限提升漏洞等攻击。
对于这些潜在风险,同年 7 月微软研究院发布了一份声明,希望“在漏洞发生之前消除一整类漏洞”,并表示“满足这些要求的最有前途的新系统编程语言之一,就是最初由 Mozilla 发明的 Rust”。从这份声明可以看出,至少自 2019 年开始,微软已打算在拥抱 Rust 上积极布局。
到了去年 9 月,微软 Azure 首席技术官 Mark Russinovich 在 X(前推特)上发文,正式呼吁业界淘汰 C / C++,应改用更加安全的 Rust 语言:
说到语言,现在是时候停止用 C/C++ 启动任何新项目了,在需要使用非 GC 语言的情况下使用 Rust。为了安全性和可靠性,业界应该宣布这些语言已被淘汰。
可不同于 Mark Russinovich 对 Rust 的支持和青睐,当时他的这则帖子下多是反对和质疑的声音:“这完全是一个与显示脱节、不切实际的想法。”
“这听起来像是在指责语言本身而不是程序员。C++ 是门好语言,只是许多使用它的人基本上不懂编程,而换一种语言并不能解决这个问题。”
“Rust 是一种不错的语言,但它甚至还未达到 1.0 版本,我认为我们不应该为了尚未经过实战检验的语言而放弃久经考验的语言。”
尽管不被看好,但微软转向 Rust 的决心依旧坚定。今年 5 月 Mark Russinovich 宣布微软已用 Rust 重写部分 Windows 内核:“如果你在 Windows 11 Insider ring 上,那么将首次感受到 Rust 在 Windows 内核中带来的魔力。”
当时,或许是网友对微软拥抱 Rust 的决定已逐渐接受,也或许是微软解释过并非是用 Rust 替换内核中 C/C++ 的整个“40 年工作”,而是将其中一些内部的 C++ 数据类型替换成 Rust,因此在这则帖子下大多是正面留言。
从 2019 年放出风声,到已用 Rust 重写部分 Windows 11 内核代码,如今微软拥抱 Rust 的程度仍在继续加深:在 Github 上发布工具包,让开发者能用 Rust 编写 Windows 驱动程序——这无疑是为操作系统实现内存安全编程的关键一步。
仍处于早期开发阶段,不建议“用于商业用途”
从 Mark Russinovich 在 X 上分享的 Github 链接来看,这个由微软 Surface 团队开发的新项目名为 windows-drivers-rs,是一个由多个 Rust 组件(Crates)组成的项目,可帮助开发人员用 Rust 开发 Windows 驱动程序。
该项目同时支持 WDM(Windows Driver Model)和 WDF(Windows Driver Foundation)两种不同的驱动程序开发模型:WDM 驱动程序级别较低,与操作系统紧密相连,而 WDF 驱动程序则通过框架库与系统交互。
据介绍,windows-drivers-rs 具体包含以下板块:
wdk-build:一个用于配置 Cargo 构建脚本的库,可用于绑定生成和 WDK(Windows Developer Kit)的下游链接。
wdk-sys:将 FFI 直接绑定到 WDK 中提供的 API。
wdk:与 WDK 中的 API 安全绑定。
wdk-panic:使用 WDK 构建的程序的默认 panic 处理程序实现。
wdk-alloc:为使用 WDK 编译的二进制文件提供分配支持。
wdk-macros:宏集合,有助于更轻松地与 wdk-sys 的直接绑定进行交互。
如需查看 windows-drivers-rs 用于创建驱动程序的示例,开发者可前往:https://github.com/microsoft/Windows-rust-driver-samples。
值得注意的是,微软补充:虽然该项目的计划灵活运用不同的 WDK 版本和不同的 WDF 版本,但目前“仅针对 NI eWDK、KMDF 1.33、UMDF 2.33 和 WDM 驱动程序进行了测试”,对于“较旧的 DDK 可能会缺少链接器选项”。
此外,微软还表示 windows-drivers-rs 目前仍处于早期开发阶段,因此“不建议用于商业用途”,但鼓励社区和开发者对其进行试验、建议和反馈,并将利用 GitHub 论坛作为与社区互动的主要形式。
开发者提问:Rust 如何处理异常?
就目前而言,已有少数开发者提出了当前这个旨在助力开发者用 Rust 开发 Windows 驱动程序的新工具平台存在的一些问题,其中一个引起讨论的问题就是 Rust 如何处理异常。
一位开发者指出:“对于 Windows 内核(以及整个操作系统)来说,结构化异常处理是 Windows 开发不可或缺的一部分,也是让 Rust 成为 Windows 内核开发现实的真正障碍。”
但与其他编程语言不同,在 Rust 语言中没有异常这一说,它通常用 Result 类型来处理可恢复的错误,而在遇到不可恢复的错误时,Rust 会提供一个特殊的宏 panic!。当执行这个宏时,程序会打印一段错误提示信息,展开(unwind)并清理当前的栈(Stack),然后退出程序的执行。
正如另一位开发者所说,“Windows 内核中的 Panic 往往是最后的手段,只应保留给内核已损坏且无法恢复的情况”,因此不少人认为 Rust 调用 Panic 的方式“在内核代码中是不可取的,这可能会导致系统崩溃”。
那么,你对于 Rust 进一步入驻 Windows 的趋势又有何看法呢?
参考链接:
https://github.com/microsoft/windows-drivers-rs
https://devclass.com/2023/09/25/microsoft-posts-early-stages-code-for-developing-windows-drivers-in-rust/