拋棄 C / C++!微軟官宣:請(qǐng)用 Rust 編寫 Windows 驅(qū)動(dòng)!
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
轉(zhuǎn)自:CSDN(ID:CSDNnews)
憑借卓越的內(nèi)存效率、速度與安全性等特點(diǎn),近幾年 Rust 可謂深受大廠青睞:
2019 年,AWS 表示開始在其基礎(chǔ)架構(gòu)中越來越多地使用 Rust 后,決定贊助 Rust,即 Rust 團(tuán)隊(duì)可以優(yōu)惠租用 AWS 基礎(chǔ)設(shè)施以進(jìn)行語(yǔ)言開發(fā)。
2021 年 2 月 9 日,Rust 基金會(huì)成立,Mozilla、亞馬遜、華為、谷歌和微軟作為創(chuàng)始白金成員,承諾在兩年時(shí)間里每年投入不少于 100 萬美元的預(yù)算,以用于 Rust 項(xiàng)目的開發(fā)、維護(hù)和推廣。
2022 年,Meta 宣布將 Rust 語(yǔ)言納入其服務(wù)器端編程語(yǔ)言。
2022 年 12 月,Linux 內(nèi)核 6.1 發(fā)布,包含了初始 Rust 支持。
今年年初,谷歌宣布支持使用 Rust 開發(fā) Chromium。
……
在這眾多大廠之中,微軟對(duì)于 Rust 的重視與支持力度也一直未減。繼 5 月效仿 Linux 用 Rust 重寫部分 Windows 內(nèi)核后,近來微軟在擁抱 Rust 上又進(jìn)了一步:微軟在 GitHub 中發(fā)布了一系列開發(fā)工具包,讓開發(fā)者可以使用 Rust 語(yǔ)言來編寫 Windows 驅(qū)動(dòng)程序。
對(duì)此,不少開發(fā)者在感慨:沒想到啊,Windows 在擁抱 Rust 方面居然走在了 Linux 前面!


在擁抱 Rust 的路上,微軟曾遭到反對(duì)
事實(shí)上,早在 2019 年 2 月,微軟工程師 Matt Miller 在以色列舉行的安全會(huì)議 BlueHat 上曾透露:從 2006 年到 2018 年,微軟旗下產(chǎn)品過去 12 年修復(fù)的所有漏洞中,有七成涉及的都是內(nèi)存安全問題。

內(nèi)存安全問題占比高的原因,主要是因?yàn)?span style="font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 1px;background-color: rgb(255, 255, 255);"> Windows 大多是以 C 和 C++ 編寫的——著名的“內(nèi)存不安全”語(yǔ)言。內(nèi)存管理代碼只要有一個(gè)漏洞,就會(huì)導(dǎo)致大量的內(nèi)存安全錯(cuò)誤,從而可能引發(fā)遠(yuǎn)程代碼執(zhí)行或權(quán)限提升漏洞等攻擊。
對(duì)于這些潛在風(fēng)險(xiǎn),同年 7 月微軟研究院發(fā)布了一份聲明,希望“在漏洞發(fā)生之前消除一整類漏洞”,并表示“滿足這些要求的最有前途的新系統(tǒng)編程語(yǔ)言之一,就是最初由 Mozilla 發(fā)明的 Rust”。從這份聲明可以看出,至少自 2019 年開始,微軟已打算在擁抱 Rust 上積極布局。
到了去年 9 月,微軟 Azure 首席技術(shù)官 Mark Russinovich 在 X(前推特)上發(fā)文,正式呼吁業(yè)界淘汰 C / C++,應(yīng)改用更加安全的 Rust 語(yǔ)言:
說到語(yǔ)言,現(xiàn)在是時(shí)候停止用 C/C++ 啟動(dòng)任何新項(xiàng)目了,在需要使用非 GC 語(yǔ)言的情況下使用 Rust。為了安全性和可靠性,業(yè)界應(yīng)該宣布這些語(yǔ)言已被淘汰。

可不同于 Mark Russinovich 對(duì) Rust 的支持和青睞,當(dāng)時(shí)他的這則帖子下多是反對(duì)和質(zhì)疑的聲音:“這完全是一個(gè)與顯示脫節(jié)、不切實(shí)際的想法。”
“這聽起來像是在指責(zé)語(yǔ)言本身而不是程序員。C++ 是門好語(yǔ)言,只是許多使用它的人基本上不懂編程,而換一種語(yǔ)言并不能解決這個(gè)問題。”
“Rust 是一種不錯(cuò)的語(yǔ)言,但它甚至還未達(dá)到 1.0 版本,我認(rèn)為我們不應(yīng)該為了尚未經(jīng)過實(shí)戰(zhàn)檢驗(yàn)的語(yǔ)言而放棄久經(jīng)考驗(yàn)的語(yǔ)言。”
盡管不被看好,但微軟轉(zhuǎn)向 Rust 的決心依舊堅(jiān)定。今年 5 月 Mark Russinovich 宣布微軟已用 Rust 重寫部分 Windows 內(nèi)核:“如果你在 Windows 11 Insider ring 上,那么將首次感受到 Rust 在 Windows 內(nèi)核中帶來的魔力。”

當(dāng)時(shí),或許是網(wǎng)友對(duì)微軟擁抱 Rust 的決定已逐漸接受,也或許是微軟解釋過并非是用 Rust 替換內(nèi)核中 C/C++ 的整個(gè)“40 年工作”,而是將其中一些內(nèi)部的 C++ 數(shù)據(jù)類型替換成 Rust,因此在這則帖子下大多是正面留言。
從 2019 年放出風(fēng)聲,到已用 Rust 重寫部分 Windows 11 內(nèi)核代碼,如今微軟擁抱 Rust 的程度仍在繼續(xù)加深:在 Github 上發(fā)布工具包,讓開發(fā)者能用 Rust 編寫 Windows 驅(qū)動(dòng)程序——這無疑是為操作系統(tǒng)實(shí)現(xiàn)內(nèi)存安全編程的關(guān)鍵一步。

仍處于早期開發(fā)階段,不建議“用于商業(yè)用途”
從 Mark Russinovich 在 X 上分享的 Github 鏈接來看,這個(gè)由微軟 Surface 團(tuán)隊(duì)開發(fā)的新項(xiàng)目名為 windows-drivers-rs,是一個(gè)由多個(gè) Rust 組件(Crates)組成的項(xiàng)目,可幫助開發(fā)人員用 Rust 開發(fā) Windows 驅(qū)動(dòng)程序。
該項(xiàng)目同時(shí)支持 WDM(Windows Driver Model)和 WDF(Windows Driver Foundation)兩種不同的驅(qū)動(dòng)程序開發(fā)模型:WDM 驅(qū)動(dòng)程序級(jí)別較低,與操作系統(tǒng)緊密相連,而 WDF 驅(qū)動(dòng)程序則通過框架庫(kù)與系統(tǒng)交互。
據(jù)介紹,windows-drivers-rs 具體包含以下板塊:
wdk-build:一個(gè)用于配置 Cargo 構(gòu)建腳本的庫(kù),可用于綁定生成和 WDK(Windows Developer Kit)的下游鏈接。
wdk-sys:將 FFI 直接綁定到 WDK 中提供的 API。
wdk:與 WDK 中的 API 安全綁定。
wdk-panic:使用 WDK 構(gòu)建的程序的默認(rèn) panic 處理程序?qū)崿F(xiàn)。
wdk-alloc:為使用 WDK 編譯的二進(jìn)制文件提供分配支持。
wdk-macros:宏集合,有助于更輕松地與 wdk-sys 的直接綁定進(jìn)行交互。
如需查看 windows-drivers-rs 用于創(chuàng)建驅(qū)動(dòng)程序的示例,開發(fā)者可前往:https://github.com/microsoft/Windows-rust-driver-samples。
值得注意的是,微軟補(bǔ)充:雖然該項(xiàng)目的計(jì)劃靈活運(yùn)用不同的 WDK 版本和不同的 WDF 版本,但目前“僅針對(duì) NI eWDK、KMDF 1.33、UMDF 2.33 和 WDM 驅(qū)動(dòng)程序進(jìn)行了測(cè)試”,對(duì)于“較舊的 DDK 可能會(huì)缺少鏈接器選項(xiàng)”。
此外,微軟還表示 windows-drivers-rs 目前仍處于早期開發(fā)階段,因此“不建議用于商業(yè)用途”,但鼓勵(lì)社區(qū)和開發(fā)者對(duì)其進(jìn)行試驗(yàn)、建議和反饋,并將利用 GitHub 論壇作為與社區(qū)互動(dòng)的主要形式。

開發(fā)者提問:Rust 如何處理異常?
就目前而言,已有少數(shù)開發(fā)者提出了當(dāng)前這個(gè)旨在助力開發(fā)者用 Rust 開發(fā) Windows 驅(qū)動(dòng)程序的新工具平臺(tái)存在的一些問題,其中一個(gè)引起討論的問題就是 Rust 如何處理異常。
一位開發(fā)者指出:“對(duì)于 Windows 內(nèi)核(以及整個(gè)操作系統(tǒng))來說,結(jié)構(gòu)化異常處理是 Windows 開發(fā)不可或缺的一部分,也是讓 Rust 成為 Windows 內(nèi)核開發(fā)現(xiàn)實(shí)的真正障礙。”

但與其他編程語(yǔ)言不同,在 Rust 語(yǔ)言中沒有異常這一說,它通常用 Result 類型來處理可恢復(fù)的錯(cuò)誤,而在遇到不可恢復(fù)的錯(cuò)誤時(shí),Rust 會(huì)提供一個(gè)特殊的宏 panic!。當(dāng)執(zhí)行這個(gè)宏時(shí),程序會(huì)打印一段錯(cuò)誤提示信息,展開(unwind)并清理當(dāng)前的棧(Stack),然后退出程序的執(zhí)行。
正如另一位開發(fā)者所說,“Windows 內(nèi)核中的 Panic 往往是最后的手段,只應(yīng)保留給內(nèi)核已損壞且無法恢復(fù)的情況”,因此不少人認(rèn)為 Rust 調(diào)用 Panic 的方式“在內(nèi)核代碼中是不可取的,這可能會(huì)導(dǎo)致系統(tǒng)崩潰”。
那么,你對(duì)于 Rust 進(jìn)一步入駐 Windows 的趨勢(shì)又有何看法呢?
參考鏈接:
https://github.com/microsoft/windows-drivers-rs
https://devclass.com/2023/09/25/microsoft-posts-early-stages-code-for-developing-windows-drivers-in-rust/
往 期 推 薦
3、互聯(lián)網(wǎng)人為什么學(xué)不會(huì)擺爛
4、為什么國(guó)外JetBrains做 IDE 就可以養(yǎng)活自己,國(guó)內(nèi)不行?區(qū)別在哪?
![]()
點(diǎn)分享
![]()
點(diǎn)收藏
![]()
點(diǎn)點(diǎn)贊
![]()
點(diǎn)在看

