拋棄 C / C++!微軟官宣:請(qǐng)用 Rust 編寫(xiě) Windows 驅(qū)動(dòng)!

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

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

內(nèi)存安全問(wèn)題占比高的原因,主要是因?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;background-color:rgb(255,255,255);"> Windows 大多是以 C 和 C++ 編寫(xiě)的——著名的“內(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ā)生之前消除一整類(lèi)漏洞”,并表示“滿足這些要求的最有前途的新系統(tǒng)編程語(yǔ)言之一,就是最初由 Mozilla 發(fā)明的 Rust”。從這份聲明可以看出,至少自 2019 年開(kāi)始,微軟已打算在擁抱 Rust 上積極布局。
到了去年 9 月,微軟 Azure 首席技術(shù)官 Mark Russinovich 在 X(前推特)上發(fā)文,正式呼吁業(yè)界淘汰 C / C++,應(yīng)改用更加安全的 Rust 語(yǔ)言:
說(shuō)到語(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í)際的想法?!?/span>
-
“這聽(tīng)起來(lái)像是在指責(zé)語(yǔ)言本身而不是程序員。C++ 是門(mén)好語(yǔ)言,只是許多使用它的人基本上不懂編程,而換一種語(yǔ)言并不能解決這個(gè)問(wèn)題?!?/span>
-
“Rust 是一種不錯(cuò)的語(yǔ)言,但它甚至還未達(dá)到 1.0 版本,我認(rèn)為我們不應(yīng)該為了尚未經(jīng)過(guò)實(shí)戰(zhàn)檢驗(yàn)的語(yǔ)言而放棄久經(jīng)考驗(yàn)的語(yǔ)言?!?/span>
盡管不被看好,但微軟轉(zhuǎn)向 Rust 的決心依舊堅(jiān)定。今年 5 月 Mark Russinovich 宣布微軟已用 Rust 重寫(xiě)部分 Windows 內(nèi)核:“如果你在 Windows 11 Insider ring 上,那么將首次感受到 Rust 在 Windows 內(nèi)核中帶來(lái)的魔力?!?/span>

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

仍處于早期開(kāi)發(fā)階段,不建議“用于商業(yè)用途”
從 Mark Russinovich 在 X 上分享的 Github 鏈接來(lái)看,這個(gè)由微軟 Surface 團(tuán)隊(duì)開(kāi)發(fā)的新項(xiàng)目名為 windows-drivers-rs,是一個(gè)由多個(gè) Rust 組件(Crates)組成的項(xiàng)目,可幫助開(kāi)發(fā)人員用 Rust 開(kāi)發(fā) Windows 驅(qū)動(dòng)程序。
該項(xiàng)目同時(shí)支持 WDM(Windows Driver Model)和 WDF(Windows Driver Foundation)兩種不同的驅(qū)動(dòng)程序開(kāi)發(fā)模型:WDM 驅(qū)動(dòng)程序級(jí)別較低,與操作系統(tǒng)緊密相連,而 WDF 驅(qū)動(dòng)程序則通過(guò)框架庫(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)程序的示例,開(kāi)發(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 目前仍處于早期開(kāi)發(fā)階段,因此“不建議用于商業(yè)用途”,但鼓 勵(lì)社區(qū)和開(kāi)發(fā)者對(duì)其進(jìn)行試驗(yàn)、建議和反饋,并將利用 GitHub 論壇作為與社區(qū)互動(dòng)的主要形式。

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

但與其他編程語(yǔ)言不同,在 Rust 語(yǔ)言中沒(méi)有異常這一說(shuō),它通常用 Result 類(lèi)型來(lái)處理可恢復(fù)的錯(cuò)誤,而在遇到不可恢復(fù)的錯(cuò)誤時(shí),Rust 會(huì)提供一個(gè)特殊的宏 panic!。 當(dāng)執(zhí)行這個(gè)宏時(shí),程序會(huì)打印一段錯(cuò)誤提示信息,展開(kāi)(unwind)并清理當(dāng)前的棧(Stack),然后退出程序的執(zhí)行。
正如另一位開(kāi)發(fā)者所說(shuō),“Windows 內(nèi)核中的 Panic 往往是最后的手段,只應(yīng)保留給內(nèi)核已損壞且無(wú)法恢復(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/
歡迎參與 CSDN 重磅發(fā)起的《2023 AI 開(kāi)發(fā)者生態(tài)調(diào)查問(wèn)卷》,分享您真實(shí)的 AI 使用體驗(yàn),更有精美好禮等你拿!
推薦閱讀:
? 讓 AI 取代人類(lèi)工作 3 個(gè)月,公司 CEO 夸贊:“復(fù)制粘貼的工作完全消失了!”
? 代碼別拿來(lái)就用!中國(guó)研究者14頁(yè)論文預(yù)警:Copilot生成代碼35.8%有漏洞、C++成“重災(zāi)區(qū)”
? 蘋(píng)果 App Store 現(xiàn)黃色軟件偽裝成學(xué)習(xí)軟件;微軟或推出自家首款A(yù)I芯片;Rails 7.1 發(fā)布|極客頭條
