1# 内核启动命令行参数 2 3:::{note} 4本文作者: 5- 龙进 <longjin@DragonOS.org> 6::: 7 8## 概述 9 10  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