反汇编发现 rust 若按照第一种方式,编译器会将代码编译为两次在一个寄存器中取值,然而这个值会在 abi 调用后失效。在交流群里询问才得知需要在内联汇编上加上一行 clobber_abi(“C”),这时编译器会帮你自动加上某个 abi 的 function call 的 caller-saved 的寄存器会在内联汇编被使用的提示,从而会保证程序上下文寄存器的值在函数调用前后都有效。具体的 ref: https://doc.rust-lang.org/reference/inline-assembly.html.
非常感谢清华大学开放的 rCore 课程,一番体验下来后,我对 RISC-V 上的 OS 开发有了比较清楚的认知。 课程为了一步步引导学生理解 OS 的结构和功能,费了很大的功夫在 OS 从简单到复杂的渐进式的构建,以及 各种周边设施的建设上,再次表达对课程精心准备和无私开放的感谢!
用 Rust 写 OS 是一件非常有趣的事情,传统上基建通常使用 C 语言,虽然它非常容易与汇编相对照,抽象 能力和整洁程度却不大理想。作为一门比 C 年轻了 30 多岁的语言,Rust 融入了许许多多现代的理论和特性, 在我看来,对于写 OS 来说比较突出的一点是,它的类型系统带来了更强的表达能力,而同时 RAII 思想的贯彻 有时也带来了一些挑战。