mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-19 17:26:31 +00:00
feat(boot): 内核启动命令行参数解析 (#969)
支持解析启动命令行参数,行为与Linux一致。具体见文档。 bbs链接:https://bbs.dragonos.org.cn/t/topic/362 issue: https://github.com/DragonOS-Community/DragonOS/issues/865 支持了三种参数: - Arg (不带Value的参数) - KV (正常的KV参数) - EarlyKV (在内存管理初始化之前解析) # TODO - 支持在`/proc/cmdline`下面查看内核启动时的命令行参数。 - 支持回调函数,允许更加灵活的设置参数的值(目前用不到,就没写了) Signed-off-by: longjin <longjin@DragonOS.org>
This commit is contained in:
6
kernel/crates/kcmdline_macros/Cargo.toml
Normal file
6
kernel/crates/kcmdline_macros/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "kcmdline_macros"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
74
kernel/crates/kcmdline_macros/src/lib.rs
Normal file
74
kernel/crates/kcmdline_macros/src/lib.rs
Normal file
@ -0,0 +1,74 @@
|
||||
#![no_std]
|
||||
#![deny(clippy::all)]
|
||||
#![allow(clippy::crate_in_macro_def)]
|
||||
|
||||
/// 定义一个bool类型的参数
|
||||
///
|
||||
/// # 参数
|
||||
///
|
||||
/// - `$varname`: 参数的变量名
|
||||
/// - `$name`: 参数的名称
|
||||
/// - `$default_bool`: 默认值
|
||||
/// - `$inv`: 是否反转
|
||||
#[macro_export]
|
||||
macro_rules! kernel_cmdline_param_arg {
|
||||
($varname:ident, $name:ident, $default_bool:expr, $inv:expr) => {
|
||||
#[::linkme::distributed_slice(crate::init::cmdline::KCMDLINE_PARAM_ARG)]
|
||||
static $varname: crate::init::cmdline::KernelCmdlineParameter =
|
||||
crate::init::cmdline::KernelCmdlineParamBuilder::new(
|
||||
stringify!($name),
|
||||
crate::init::cmdline::KCmdlineParamType::Arg,
|
||||
)
|
||||
.default_bool($default_bool)
|
||||
.inv($inv)
|
||||
.build()
|
||||
.unwrap();
|
||||
};
|
||||
}
|
||||
|
||||
/// 定义一个key-value类型的参数
|
||||
///
|
||||
/// # 参数
|
||||
/// - `$varname`: 参数的变量名
|
||||
/// - `$name`: 参数的名称
|
||||
/// - `$default_str`: 默认值
|
||||
#[macro_export]
|
||||
macro_rules! kernel_cmdline_param_kv {
|
||||
($varname:ident, $name:ident, $default_str:expr) => {
|
||||
#[::linkme::distributed_slice(crate::init::cmdline::KCMDLINE_PARAM_KV)]
|
||||
static $varname: crate::init::cmdline::KernelCmdlineParameter =
|
||||
crate::init::cmdline::KernelCmdlineParamBuilder::new(
|
||||
stringify!($name),
|
||||
crate::init::cmdline::KCmdlineParamType::KV,
|
||||
)
|
||||
.default_str($default_str)
|
||||
.build()
|
||||
.unwrap();
|
||||
};
|
||||
}
|
||||
|
||||
/// 定义一个内存管理初始化之前就要设置的key-value类型的参数
|
||||
///
|
||||
/// # 参数
|
||||
/// - `$varname`: 参数的变量名
|
||||
/// - `$name`: 参数的名称
|
||||
/// - `$default_str`: 默认值
|
||||
#[macro_export]
|
||||
macro_rules! kernel_cmdline_param_early_kv {
|
||||
($varname:ident, $name:ident, $default_str:expr) => {
|
||||
#[::linkme::distributed_slice(crate::init::cmdline::KCMDLINE_PARAM_EARLY_KV)]
|
||||
static $varname: crate::init::cmdline::KernelCmdlineParameter = {
|
||||
static ___KV: crate::init::cmdline::KernelCmdlineEarlyKV = {
|
||||
const { assert!($default_str.len() < KernelCmdlineEarlyKV::VALUE_MAX_LEN) };
|
||||
crate::init::cmdline::KernelCmdlineParamBuilder::new(
|
||||
stringify!($name),
|
||||
crate::init::cmdline::KCmdlineParamType::EarlyKV,
|
||||
)
|
||||
.default_str($default_str)
|
||||
.build_early_kv()
|
||||
.unwrap()
|
||||
};
|
||||
crate::init::cmdline::KernelCmdlineParameter::EarlyKV(&___KV)
|
||||
};
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user