如何从命令行向Rust编写的Linux内核模块传递参数?
向Rust开发的Linux内核模块传递命令行参数的实现方法
Rust for Linux框架已提供与C侧module_param()完全等价的官方公开能力,你之前找到的kernel::miscdev::Registration::register_with_options()是misc字符设备注册的配置接口,其依赖的Options是内核内部使用的注册配置结构体,和命令行模块传参需求无关,不需要在该接口上做尝试。
- 核心实现接口:使用框架公开的
kernel::module_param!宏定义模块参数,宏会自动完成命令行参数解析、sysfs参数节点生成、访问权限控制全流程,行为和C侧module_param()完全对齐。 - 基础用法示例:
use kernel::prelude::*; // 模块元信息声明 module! { type: MyDemoModule, name: "rust_demo_mod", author: "dev", description: "Demo for module params", license: "GPL", } // 定义命令行可传入的模块参数 module_param! { /// 整数类型测试参数 my_int: i32 { default: 42, permissions: 0o644, description: "Sample integer parameter from cmdline", }, /// 字符串类型测试参数 my_str: str { default: "init_val", permissions: 0o644, description: "Sample string parameter from cmdline", }, /// 布尔类型测试参数 my_enable: bool { default: false, permissions: 0o644, description: "Sample bool switch from cmdline", } } struct MyDemoModule; impl kernel::Module for MyDemoModule { fn init(_name: &'static CStr, _module: &'static ThisModule) -> Result<Self> { // init执行前参数已经完成解析,直接读取即可 pr_info!( "Module loaded, my_int={}, my_str={:?}, my_enable={}\n", my_int.read(), my_str.read(), my_enable.read() ); Ok(Self) } }
- 使用注意事项:
- 参数定义需要和
module!宏放在同一代码顶层,不要写在函数或结构体内部 - 框架内置支持所有整数类型、布尔类型、C字符串类型的参数解析,自定义类型可通过实现
ModuleParamtrait接入自定义解析逻辑 - 定义参数时设置的权限值和C侧
module_param()的perm参数规则一致,会直接作用于/sys/module/下对应的参数节点 - 参数值在模块
init流程执行前就已完成校验和赋值,不需要自行实现解析逻辑
- 参数定义需要和
- 传参方式:和C编写的内核模块完全一致,加载时直接在命令行拼接
参数名=值即可,示例:insmod rust_demo_mod.ko my_int=123 my_enable=1 my_str="custom_val"
加载后也可通过/sys/module/rust_demo_mod/parameters/路径下的节点查看、按权限修改参数值。 - 版本适配说明:
module_param!宏从Linux 6.1(首个正式支持Rust开发的稳定内核版本)开始对外开放,如果你使用的是更早的Rust内核开发分支,切换到6.1及以上稳定版本或最新的rust-next分支即可直接使用,不需要修改内核核心代码。
内容的提问来源于stack exchange,提问作者Haoan
相关产品推荐
相关产品推荐

