近年来,Rust 语言以内存安全、高可靠性、零抽象等能力获得大量开发者关注,而这些特性恰好是内核编程中所需要的,所以我们看下如何用rust来写Linux内核模块。
Rust 与内核模块
虽然 Rust 支持已经在 LinuxKernel6.1 版本合并到主线了,所以理论上来说,开发者可以使用 Rust 来为 Linux6.1 写内核模块。
但实际开发工作中,内核版本不是最新的,比如 Debian 11 的内核就是 5.10 版本的,那么在这种情况下,该如何用 Rust 写内核模块呢?
原理
- Rust 如何向内核注册回调、如何调用内核代码。Rust 和 C 的互操作性
- Rust 如何编译到目标平台上。Rust 的 target 配置
- Rust 如何申明内核模块入口、并添加特殊 section。Rust 内核模块的二进制约定
Rust 和 C 的互操作性
第一个问题基本上就是 C 和 Rust 的互操作性了。
得益于 Rust 的抽象层次,C 语言和 Rust 的互相调用都是比较容易的。rust 官方也提供了 bindgen 这样,根据 .h 文件生成 .rs 文件的库。
这样一来,貌似直接使用 bindgen 将内核头文件翻译成 .rs 就可以了?
但还有一个问题,如何获取内核头文件路径呢?
可以使用一个 dummy 内核模块,在编译过程中把编译参数导出来,其中包含了头文件路径,编译参数等,用于 bindgen 生成代码。
Rust 和 target 配置
内核模块和普通的程序相比,主要的不同在于:
- 内核模块是 freestanding 的,没有