微軟開始讓開發人員用Rust 編寫Windows 驅動程式
微軟在Github 上發布了程式碼,使開發人員能夠用Rust 編寫Windows 驅動程序,這是為作業系統實現記憶體安全編程的關鍵一步。Azure 首席技術官 Mark Russinovich(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 是一個可行的解決方案。