DragonOS/docs/kernel/boot/cmdline.md
LoGin f9fe30be89
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>
2024-10-13 23:39:55 +08:00

2.8 KiB
Raw Blame History

内核启动命令行参数

:::{note} 本文作者:

概述

DragonOS内核启动命令行参数解析模块旨在提供类似Linux的内核启动命令行参数解析支持以便更灵活地让内核执行不同的行为。该模块允许内核在启动时接收并解析命令行参数根据参数的不同类型执行相应的回调函数或设置环境变量。

:::{note} 暂时不支持设置回调函数 :::

设计方案

参数类型

内核启动命令行参数分为三种类型:

  • Arg类型
  • KV类型
  • EarlyKV类型

Arg类型

Arg类型的参数在命令行中只有名称没有值。分为以下两种类型

  • ArgNormal默认值为false,如果命令行中包含这个参数,则会设置为true
  • ArgInv默认值为true,如果命令行中包含这个参数,则会设置为false

KV类型

KV类型的参数在命令行中表现为name=valuevalue按照逗号分隔。内核模块可提供参数的默认值。

EarlyKV类型

EarlyKV类型的参数与KV类型类似但它们在内存管理初始化之前被解析。

Module标志

Module标志类似于usbprobe.xxxx

参数声明

提供宏来声明内核命令行参数。

procfs支持

:::{note} TODO: 在/proc/cmdline下显示当前内核的启动命令行参数。 :::

声明内核启动命令行参数的宏

Arg类型参数声明

kernel_cmdline_param_arg!(varname, name, default_bool, inv);
  • varname:参数的变量名
  • name:参数的名称
  • default_bool:默认值
  • inv:是否反转

KV类型参数声明

kernel_cmdline_param_kv!(varname, name, default_str);
  • varname:参数的变量名
  • name:参数的名称
  • default_str:默认值

内存管理初始化之前的KV类型参数声明

kernel_cmdline_param_early_kv!(varname, name, default_str);
  • varname:参数的变量名
  • name:参数的名称
  • default_str:默认值

示例

以下示例展示了如何声明和使用KV类型参数

kernel_cmdline_param_kv!(ROOTFS_PATH_PARAM, root, "");
if let Some(rootfs_dev_path) = ROOTFS_PATH_PARAM.value_str() {
    .......
} else {
    .......
};

使用方式

  1. 在内核代码中,使用kernel_cmdline_param_kv!宏声明所需的KV类型参数。
  2. 在内核初始化过程中,通过参数的value_str()或者value_bool()方法获取参数值。
  3. 根据参数值执行相应的操作。

通过以上步骤,开发者可以灵活地使用内核启动命令行参数来控制内核行为。

TODO

  • 支持在/proc/cmdline下显示当前内核的启动命令行参数。(需要在procfs重构后)
  • 支持设置回调函数,调用回调函数来设置参数值