xref: /DragonOS/docs/kernel/boot/cmdline.md (revision fae6e9ade46a52976ad5d099643d51cc20876448)
1# 内核启动命令行参数
2
3:::{note}
4本文作者:
5- 龙进 <longjin@DragonOS.org>
6:::
7
8## 概述
9
10&emsp;&emsp;DragonOS内核启动命令行参数解析模块旨在提供类似Linux的内核启动命令行参数解析支持,以便更灵活地让内核执行不同的行为。该模块允许内核在启动时接收并解析命令行参数,根据参数的不同类型执行相应的回调函数或设置环境变量。
11
12:::{note}
13暂时不支持设置回调函数
14:::
15
16## 设计方案
17
18
19### 参数类型
20
21内核启动命令行参数分为三种类型:
22
23- Arg类型
24- KV类型
25- EarlyKV类型
26
27#### Arg类型
28
29Arg类型的参数在命令行中只有名称,没有值。分为以下两种类型:
30
31- ArgNormal:默认值为`false`,如果命令行中包含这个参数,则会设置为`true`。
32- ArgInv:默认值为`true`,如果命令行中包含这个参数,则会设置为`false`。
33
34#### KV类型
35
36KV类型的参数在命令行中表现为`name=value`,`value`按照逗号分隔。内核模块可提供参数的默认值。
37
38#### EarlyKV类型
39
40EarlyKV类型的参数与KV类型类似,但它们在内存管理初始化之前被解析。
41
42### Module标志
43
44Module标志类似于`usbprobe.xxxx`。
45
46### 参数声明
47提供宏来声明内核命令行参数。
48### procfs支持
49
50:::{note}
51TODO: 在`/proc/cmdline`下显示当前内核的启动命令行参数。
52:::
53
54## 声明内核启动命令行参数的宏
55
56### Arg类型参数声明
57```rust
58kernel_cmdline_param_arg!(varname, name, default_bool, inv);
59```
60- `varname`:参数的变量名
61- `name`:参数的名称
62- `default_bool`:默认值
63- `inv`:是否反转
64
65### KV类型参数声明
66
67```rust
68kernel_cmdline_param_kv!(varname, name, default_str);
69```
70
71- `varname`:参数的变量名
72- `name`:参数的名称
73- `default_str`:默认值
74
75### 内存管理初始化之前的KV类型参数声明
76
77```rust
78kernel_cmdline_param_early_kv!(varname, name, default_str);
79```
80
81- `varname`:参数的变量名
82- `name`:参数的名称
83- `default_str`:默认值
84
85## 示例
86
87以下示例展示了如何声明和使用KV类型参数:
88```rust
89kernel_cmdline_param_kv!(ROOTFS_PATH_PARAM, root, "");
90if let Some(rootfs_dev_path) = ROOTFS_PATH_PARAM.value_str() {
91    .......
92} else {
93    .......
94};
95```
96
97### 使用方式
98
991. 在内核代码中,使用`kernel_cmdline_param_kv!`宏声明所需的KV类型参数。
1002. 在内核初始化过程中,通过参数的`value_str()`或者`value_bool()`方法获取参数值。
1013. 根据参数值执行相应的操作。
102
103通过以上步骤,开发者可以灵活地使用内核启动命令行参数来控制内核行为。
104
105
106## TODO
107
108- 支持在`/proc/cmdline`下显示当前内核的启动命令行参数。(需要在procfs重构后)
109- 支持设置回调函数,调用回调函数来设置参数值
110