用 Rust 编写 Linux 内核模块

用 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 将成为内核开发的主流选择之一。