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:
LoGin
2024-10-13 23:39:55 +08:00
committed by GitHub
parent c709f79fda
commit f9fe30be89
15 changed files with 781 additions and 49 deletions

View File

@ -0,0 +1,6 @@
[package]
name = "kcmdline_macros"
version = "0.1.0"
edition = "2021"
[dependencies]

View 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)
};
};
}