用 Rust 编写 Linux 内核模块
Linux 6.1 合并了初始的 Rust 支持,这是内核开发史上的里程碑事件。Rust 的内存安全保证可以在编译期消除整类 bug,这对内核这种对安全性要求极高的代码尤为重要。
一个最简的 Rust 内核模块:
// SPDX-License-Identifier: GPL-2.0
//! Rust 内核模块示例
use kernel::prelude::*;
module! {
type: HelloRust,
name: "hello_rust",
author: "赵瀚文",
description: "Rust 内核模块示例",
license: "GPL",
}
struct HelloRust;
impl kernel::Module for HelloRust {
fn init(_name: &str) -> Result<Self> {
pr_info!("Hello from Rust kernel module!");
Ok(HelloRust)
}
}
impl Drop for HelloRust {
fn drop(&mut self) {
pr_info!("Goodbye from Rust kernel module!");
}
}
安全地封装内核 API 是 Rust 内核开发的核心挑战:
use kernel::{
file::File,
io_buffer::IoBufferWriter,
miscdev::Registration,
sync::smutex::Mutex,
sync::Ref,
};
struct Device {
registration: Registration<Device>,
data: Mutex<Vec<u8>>,
}
impl kernel::file::Operations for Device {
fn write(
this: &Self,
_file: &File,
reader: &mut impl IoBufferReader,
_offset: u64,
) -> Result<usize> {
let mut data = this.data.lock();
let len = reader.read_all(&mut *data, 0)?;
Ok(len)
}
}
目前 Rust 内核支持还处于早期阶段,可用的子系统绑定有限。但网络驱动和文件系统已经可以用 Rust 实现。社区正在积极推进更多子系统的 Rust 绑定,预计在 Linux 7.x 时代,Rust 将成为内核开发的主流选择之一。