rust编程之道 pdf_LPC: 想在内核里引入Rust,还需要做很多决定
在今天的Linux Plumbers Conference 2020大會上,Geoffery Thomas等人以“Barriers to in-tree Rust”為主題,討論了想要把Rust引入到Linux內核項目中作為一種可選的開發語言,還需要解決的一些問題。
Rust適合作為內核開發語言主要有兩點原因:
Rust的優勢讓很多開發者感受到了吸引力。對新項目來說,選擇Rust的技術困難可能不太大,但是對已有項目來說,到底有多可行呢?Linux社區已經在嚴肅的考慮這個問題。除了“可能沒人懂Rust的patch怎么review因為沒有用過Rust”這種雞生蛋的問題以外,還有一些更加實際的項目框架問題需要考慮:
Cargo和庫
Cargo是Rust官方的項目管理工具,可以安裝和管理依賴,也可以控制構建過程。Geoffery認為雖然cargo的依賴管理對內核完全沒有用(比如編譯內核的過程不能依賴從網絡上下載一個庫,所有的代碼都必須是in-tree的),但是使用cargo還是有一定的意義的(具體是什么并沒有深入)。
Rust的語言的運行時包含core / alloc / std三個層級,其中core是最核心的,內核代碼也需要用到。alloc需要運行時里包含動態內存管理,這個在內核里是有的(kmalloc),但是有人指出,內核GPF_*的API可能比較難適配。std庫基本是封裝操作系統的輸入輸出,文件操作等API,所以在內核里是用不到的。
跟C語言之間的ABI
兩個語言之間如何互相調用?這個Rust是支持的,也不是Linux特有的問題,工具也有,但是如果大量的涉及到一些比較底層的操作,比如位操作、#ifdef檢測config、以及各種C的預處理技巧,怎么在Rust里保持一致等等,可能會導致一些混亂。感覺像trace這樣的框架,是不是需要用Rust重新實現一次呢?
RCU
內核使用了很多精細的同步機制,比如RCU。在討論到怎么樣從Rust訪問RCU保護的數據時,Geoffery認為從語言層面是可行的,也有一些代碼適配的進展。具體可以見
https://github.com/fishinabarrel/linux-kernel-module-rust/pull/250
除此之外,還有一些Rust語言特性導致的數據結構區別,比如雙鏈表等,似乎也不是很大的困難——常見問題已經有一些可以參考的庫和unsafe大法來解決(來自Rust社區的說法)。
GCC編譯
rustc目前依賴LLVM作為編譯工具,但是GCC仍然是內核的主流編譯方式。使用LLVM編譯整個內核可能是目前比較可行的做法,因為大家對混合LLVM+GCC的方式表示了一些擔憂——使用兩套編譯器就無法做LTO,更重要的是,兩個編譯器的微妙差異可能會導致內部ABI不兼容問題。還有人提出,應該考慮給GCC添加一個Rust前端。
多平臺支持
Linux支持的體系結構眾多,Rust暫時還不能全部覆蓋。(主要是arc, sparc32)
不過這個問題可以用“先讓一部分人Rust起來”的思路解決。
mrustc
除了把Rust代碼編譯成.o再跟C語言的目標文件鏈接在一起,還有一種可能是用mrustc把Rust代碼翻譯成C,再進行編譯。
https://github.com/thepowersgang/mrustc
Linus Torvalds的態度
https://lkml.org/lkml/2020/7/10/1261
I’d want the first rust driver (or whatever) to be introduced in such a simple format that failures will be obvious and simple.
總結
所謂魔鬼都在細節之中。對內核項目來說,要引入一個新的語言并不容易。即使沒有致命的問題,也需要投入很多的精力來排除一些障礙,讓雙語言開發被流暢的支持。如果Linux真的能夠采納Rust,那對整個Rust生態必將是一個巨大的利好消息。
最后,這次雖然更多的是一個主題討論,不過還是有一份演講的slides可以看的:
https://linuxplumbersconf.org/event/7/contributions/804/attachments/641/1168/barriers-to-in-tree-rust.pdf
總結
以上是生活随笔為你收集整理的rust编程之道 pdf_LPC: 想在内核里引入Rust,还需要做很多决定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手动安装sys驱动文件_海龙工具的正确安
- 下一篇: 创建data_微软推出 Microsof