【问题标题】:How to set Linux kernel command line on ARM?如何在 ARM 上设置 Linux 内核命令行?
【发布时间】:2021-09-19 06:20:44
【问题描述】:

我的理解是,对于 ARM,一般来说内核启动命令行有三个来源:

  1. 在内核配置中以 CONFIG_CMDLINE 形式给出的那些
  2. 引导加载程序(通常是 ARM 处理器上的 U-Boot)传递的那些
  3. 那些包含在设备树中,在 selected/bootargs 下 使用哪一个取决于内核配置参数。我的问题是如何使用内核配置在这些选项之间进行选择?

并且可以一个附加到另一个,即我们可以使用 CONFIG_CMDLINE 传递一些,然后在设备树中附加硬件特定参数吗?

我正在尝试组合 1、2 和 3,但这不能编译:

/dts-v1/; 
#include "imx6q.dtsi"
#include "imx6q-h.dtsi"
#include "imx6q-m.dtsi"
/ {
    model = "A M";
    compatible = "a,imx6q-hydra13", "a,imx6q-mercury",
                    "a,imx6q-hydra", "fsl,imx6q";
};

&ssd_touch {
    status = "okay";
};

ERROR AT THIS LINE: chosen {  
        bootargs = "console=ttymxc1,115200";
};

【问题讨论】:

  • 您尝试了多少种组合,结果如何,请发布实验和结果
  • CONFIG_CMDLINE 设置默认内核命令字符串。然后可以选择以下选项: (1) CONFIG_CMDLINE_FROM_BOOTLOADER 将优先使用引导加载程序中的命令行,而不是默认的内核命令字符串。 (2) CONFIG_CMDLINE_EXTEND 将命令行从引导加载程序附加到默认内核命令字符串。 (3) CONFIG_CMDLINE_FORCE 将只使用默认的内核命令字符串,忽略引导加载程序提供的任何字符串。
  • 这个错误可能是因为你的chosen节点在根节点之外。
  • @IanAbbott 谢谢。但是设备树在这个方案中的位置是什么?我正在使用 AOSP 9 代码并在 BoardConfig.mk 文件和设备树中设置命令行,但我没有看到设备树命令行出现在任何地方,包括 /proc/cmdline。

标签: command-line linux-kernel arm embedded-linux device-tree


【解决方案1】:

我的理解是,对于 ARM,内核启动命令行一般有三个来源:

这对于 Linux ARM 内核并不准确。内核只处理两个“源”,一个default kernel command 字符串和一个bootloader kernel arguments 字符串。
更多细节如下。

我的问题是如何使用内核配置在这些选项之间进行选择?

您的选择可能仅限于“使用内核配置”

“附加”命令行配置选项,即 CONFIG_CMDLINE_FROM_BOOTLOADER(“使用bootloader kernel arguments,如果可用”)、CONFIG_CMDLINE_EXTEND(“扩展bootloader kernel arguments”)和 CONFIG_CMDLINE_FORCE(“始终使用default kernel command 字符串”)是仅在启用对旧 ATAG 参数传递(即 CONFIG_ATAGS)的支持时可用(自 3.7 版起)。
但是,除非明确禁用,否则 CONFIG_ATAGS 确实默认为 y。主线 arch/arm/configs/ 中大约有十几个 _defconfig 文件明确禁用了此 CONFIG_ATAGS。


但是设备树在这个方案中的位置是什么?

设备树是bootloader kernel arguments的提供者。
也就是说,/chosen 节点中的bootargs= 属性是向 ARM 内核提供命令行的常规方法,即禁用 CONFIG_ATAGS 或启用 CONFIG_CMDLINE_FROM_BOOTLOADER 或 CONFIG_CMDLINE_EXTEND 时。
命令行通过 drivers/of/fdt.c

中的 early_init_dt_scan_chosen() 由内核从设备树中检索为字符串

仅当启用 CONFIG_CMDLINE_FORCE(带有 CONFIG_ATAGS)时,设备树 bootargs= 属性才会被忽略。

您可以使用 CONFIG_CMDLINE 使用 default kernel command 配置/构建 ARM 内核,以防没有其他方法可以设置命令行。
drivers/of/fdt.c 中的评论记录了这一点。

CONFIG_CMDLINE_EXTEND(带有 CONFIG_ATAGS)生成的命令行是设备树bootargs= 属性与 CONFIG_CMDLINE 内容的串联。

但是...

当使用 U-Boot 引导 Linux 内核时,请注意,当定义环境变量 bootargs 时,U-Boot 将(尝试)安装该 bootargs 环境变量(作为属性)到/chosen 加载的设备树 blob 的节点。
如果/chosen节点在DT中不存在,则创建它。
如果该 DT 节点中不存在 bootargs= 属性,则创建它。
如果bootargs= 属性已存在于该DT 节点中,则它会被U-Boot 环境变量覆盖。
请参阅 common/fdt_support.c 中的 fdt_chosen()

IOW U-Boot 的bootargs 环境变量通常成为事实上的 内核命令行。


并且可以一个附加到另一个,即我们可以使用 CONFIG_CMDLINE 传递一些,然后在设备树中附加硬件特定参数吗?

仅当 (a) CONFIG_ATAGS 已启用,并且 (b) CONFIG_CMDLINE_EXTEND 已启用,并且 (c) 确保 U-Boot 的环境中没有 bootargs 变量时。


底线

  1. U-Boot 总是尝试使用设备树将其bootargs 变量传递给内核。
  2. 设备树中的bootargs= 属性始终被内核用作bootloader kernel arguments,如arch/arm/Kconfig 文件中所述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多