我想在U-Boot环境中添加自定义变量,然后从Linux内核模块访问它。这可能吗?
如果可以,请帮我解决这个问题
例如,我们可以打印
printenv
它将显示环境变量。我想在该列表中添加额外的变量。这种做法是好的吗? 或者还有其他方法吗?
答案 0 :(得分:1)
使用环境变量的常用方法是使用U-Boot shell编辑它们。
如果您正在使用发行版启动,U-Boot将按此顺序查找脚本boot.scr.uimg和boot.scr并执行它们。
在Linux中,您可以创建一个文本文件boot.txt,然后使用:
创建boot.scrmkimage -T script -C none -n 'My fancy script' -d boot.txt boot.scr
然后将boot.scr复制到根分区的根目录。
如果你使用的是Debian或Ubuntu,那就是为你创建脚本的包flash-kernel。它有钩子,您可以在其中添加命令来操作环境变量。
答案 1 :(得分:0)
这种做法好吗?
IMO不,这不好 U-Boot运行时环境将位于主内存中,位于Linux内核未知的位置。当内核获得对CPU的控制权时,包含U-Boot环境变量的内存缓冲区可能是Linux" free"记忆。要保留此缓冲区以供内核访问,您必须破解U-Boot以将此环境缓冲区重定位到安全位置,并以某种方式将此位置传递给内核。 如果你必须创建一个新的boot-program-to-kernel接口。
或者,您的新自定义环境变量可以保存到持久存储中。但这会产生其他问题 根据引导设备,访问U-Boot的环境存储可以是原始NAND或SD卡的原始扇区或SD卡上的VFAT文件系统中的文件。通常,Linux内核甚至不知道(更不用说)使用哪种引导介质或引导程序所在的位置 但是你的想法需要这些信息。此外,内核必须阅读该环境,这被认为是不好的做法。 (在安全内核中,启动过程中容易做的事情变得复杂。)请参阅Driving Me Nuts - Things You Never Should Do in the Kernel。
还是有其他办法吗?
最好将变量名称及其值转换为文本字符串,然后将其附加到 bootargs 变量。
使用模块的名称前缀参数以避免冲突。
my_module.my_variable=value
然后你的内核模块可以按照Passing Command Line Arguments to a Module中的描述检索它 这种方法避免了对引导程序数据存储的新依赖性污染内核 它使用现有的内核接口,即内核命令行。