将自定义环境变量添加到 U Boot 并从内核模块访问它

Adding Custom environment variable to UBoot and access it from Kernal module

我想向 U-Boot 环境添加自定义变量,然后从 Linux 内核模块访问它。这可能吗?
如果可以请帮我解决这个问题。
例如我们可以打印

printenv

它将显示环境变量。我想向该列表添加额外的变量。这个方法好吗?
或者还有其他方法吗?

使用环境变量的常用方法是使用 U-Boot shell 编辑它们。

  • setenv - 设置环境变量的值
  • saveenv - 保存所有环境变量

如果您使用发行版引导,U-Boot 将按此顺序查找脚本 boot.scr.uimg 和 boot.scr 并执行它们。

在 Linux 中,您可以创建一个文本文件 boot.txt,然后使用以下内容创建 boot.scr:

mkimage -T script -C none -n 'My fancy script' -d boot.txt boot.scr

然后复制boot.scr到根分区的根目录下

如果您使用的是 Debian 或 Ubuntu,则包 flash-kernel 会为您创建脚本。它有挂钩,您可以在其中添加命令来操作环境变量。

Is this approach is good ?

IMO 不,这不好。
U-Boot 运行时环境将位于主内存中,位于 Linux 内核未知的位置。当内核获得 CPU 的控制权时,这个包含 U-Boot 环境变量的内存缓冲区可能是 Linux "free" 内存的一部分。要保留此缓冲区供内核访问,您必须破解 U-Boot 以将此环境缓冲区重新定位到安全位置,并以某种方式将此位置传递给内核。
IOW 你必须创建一个新的引导程序到内核的接口。

或者,您可以将新的自定义环境变量保存到持久存储中。但这会产生其他问题。
根据启动设备的不同,访问 U-Boot 的环境存储可能是原始 NAND 或 SD 卡的原始扇区或 SD 卡上 VFAT 文件系统中的文件。通常 Linux 内核甚至不知道(更不用说关心)使用了哪个引导介质或引导程序所在的位置。
但是你的想法需要这些信息。此外,内核必须读取该环境,这被认为是不好的做法。 (在引导期间容易做的事情在安全内核中变得复杂。)参见 Driving Me Nuts - Things You Never Should Do in the Kernel

or is there is any other way ?

您最好将变量名及其值转换为文本字符串,并将其附加到 bootargs 变量。
使用模块名称作为参数前缀以避免冲突。

my_module.my_variable=value

然后您的内核模块可以按照 Passing Command Line Arguments to a Module
中的描述检索它 这种方法避免了对引导程序数据存储的新依赖性污染内核。
它使用现有的内核界面,即内核命令行。