这组引导参数来自哪里?

Where is this set of boot arguments coming from?

我正在使用 Yocto 将 EVL Core 移植到 iMX6 Sabre SD 板上。

我有一个内核(显然不是主线)的最小核心映像,它可以正确启动,并在启动前显示以下启动参数:

[    0.000000] Kernel command line: console=ttymxc0,115200 root=/dev/mmcblk2p2 rootwait rw 

然后我开始更改 EVL 内核(这是一个主线内核)的内核(两个内核都是 5.4)。在对新内核的设备树进行一些更改后,我验证了它正在使用以下内容启动:

[    0.000000] Kernel command line: console=ttymxc0,115200 root=/dev/mmcblk2p2 r

也就是说,rootwait rw 被替换为 r。不用说这会在启动过程中引起问题,我想更改它。

但是,我不知道这条线是从哪里来的。我搜索了内核源代码,找不到具体的那一行,连其中的某些部分都找不到。我认为它不仅仅是用脚本编写的,而是由某种 append 命令的序列组成的。

作为参考,我搜索的文件是 here

问题:这条线是怎么形成的,参数从哪里来?

我检查过大多数主板在其设备树中都有一个“bootargs”行,它直接提供要传递的参数。然而,对于 Sabre SD 的特定情况,这似乎有所不同,线条是通过另一个脚本形成的(我没能确定是哪个)。

注意:我知道这个问题可以被认为与本网站的主题无关。如果是这样,我可以转到 Unix/Linux SE。

附加信息:我正在使用 U-boot 启动,并尝试通过 SD 卡启动。缺少 rootwait rw 导致的问题是在启动期间内核无法看到其中一个 SD 分区,因此无法继续启动,导致内核崩溃。

所以在收到一些帮助后我找到了答案。在我的 bootenv 环境中没有 bootargs 变量。这是因为可以看到,作为 printenv*:

输出的一部分
bootcmd=run findfdt;run findtee;mmc dev ${mmcdev};if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; then run mmcboot; else run netboot; fi; fi; else run netboot; fi

前两个命令是成功的测试。之后,输入一系列嵌套的 if。在这些 ifs 中我们可以看到它运行 MMC 引导(因为我是从 SD 卡引导的)。 此命令然后在引导期间定义 bootargs 变量on-the-run,这就是我在源代码中找不到它的原因。

*我在这个问题中没有提供。这个细节很重要。