【问题标题】:UEFI Shell: Change value of variable persistently (nonvolatile)UEFI Shell:持久更改变量的值(非易失性)
【发布时间】:2019-01-05 21:04:32
【问题描述】:

我编写了一个 UEFI-App 来更改 uefi 变量(调用 gRT->SetVariable(..))。虽然我更改了一个非易失性变量,但更改不会通过重置持久化。

如何持续进行更改?

使用 UEFI 应用程序,我可以更改我选择的变量的值。使用dmpstore variablename,我可以验证变量的值是否已正确更改(并且它具有“NV”标志)。但是重置后旧值会恢复。

我使用 uefiversion 2.4 和 uefishellsupport 3。

这个问题的背景是这个问题:Access BIOS/UEFI menu setting via uefi shell。 我想更改 ConOut、ConIn 等变量以及可以在 BIOS 菜单设置中更改的其他变量。

顺便说一句:通过set uefi shell 命令设置环境变量确实会进行持久更改。我不明白为什么 UEFI 变量的变化不是持久的......

【问题讨论】:

  • 您尝试持续更改哪些 UEFI 变量?
  • 我将其添加到我的问题中。
  • 你应该学习平台初始化过程。你不能只保存你想要 ConOut 的任何东西并期望它在重启后仍然存在

标签: uefi


【解决方案1】:

并非所有对 UEFI 全局变量的更改都会在重新启动后持续存在。

对于 CONINCONOUTERROUT,适用 UEFI 规范第 3.6 节中的以下段落:

“ConInDev、ConOutDev 和 ErrOutDev 变量都包含一个 EFI_DEVICE_PATH_PROTOCOL 描述符,它定义了所有可能的默认设备以在启动时使用。这些变量是易失的,并且在每次启动时动态设置。 ConIn、ConOut 和 ErrOut 始终是 ConInDev、ConOutDev 和 ErrOutDev 的真子集。"

【讨论】:

  • 谢谢。好的,所以 ConOut 等依赖于 ConOutDev 并且是不稳定的!?!关于如何操作“每次启动时动态设置”过程的任何建议?
【解决方案2】:

您应该使用EFI_SHELL_PROTOCOL.SetEnv() 来设置 UEFI Shell 环境变量。

这个函数改变指定环境变量的当前值。 如果环境变量存在且 Value 为空字符串,则 环境变量被删除。如果环境变量存在并且 value 不是空字符串,那么环境变量的值为 改变了。如果环境变量不存在且 Value 为空 字符串,没有任何动作。如果环境变量不存在并且 值是一个非空字符串,然后创建环境变量并 指定的值。

查看UEFI Shell Specification了解更多详情

【讨论】:

  • 谢谢,但我认为这不是我想要的。我想更改 UEFI 变量(我可以通过 setvardmpstore 获取和更改),而不是环境变量。 (或者它们是否以任何方式相关?)
  • 我知道。抱歉,可能是“btw”评论令人困惑。我只是想说环境变量在重新启动后确实保持了它们的(更改的)值。但是 UEFI 变量没有(我也希望对它们进行持久更改)。 -> 我将其添加到我的问题中。
  • 我明白了。如果您使用setvar 命令编辑 UEFI 变量更改,它们是否会保留?这些是特定于供应商的变量还是一般变量?您可以将它们添加到您的问题中吗?
  • 不,使用 setvar 编辑它们会产生相同的(非持久性)结果。这就是为什么我尝试通过gRT->SetVariable(..) 来查看行为是否有任何差异。但事实并非如此。我在问题中添加了变量/背景。
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多