【问题标题】:Can UEFI firmware force the OS to change its boot mode?UEFI 固件可以强制操作系统更改其启动模式吗?
【发布时间】:2015-12-24 08:32:08
【问题描述】:

默认情况下,Windows 8 和 10 是在启用 Hiberboot 的情况下启动的,因此当您转到 Start->Power->Shutdown 时,系统实际上会进入 S4,而不是 S5。在某些情况下,我需要能够强制 Windows 执行完全启动,而不是从 S4“唤醒”,无论它之前是如何关闭的。我试图强制我的 UEFI BIOS BootMode 始终为 BOOT_WITH_FULL_CONFIGURATION,但这无济于事 - Windows 仍然采用快速启动路径。

过去,可以在 BIOS 中使用 Simple Boot Flag 设置 DIAG 模式;这可能对我有用,但 Windows 8/10 似乎仍然不支持它。是否有一些 UEFI 变量或其他一些与操作系统通信的方式以在完全模式或诊断模式下启动?

【问题讨论】:

  • 您的问题的解决方案将与您使用的实现和硬件高度相关,即新的英特尔芯片具有在 CMOS 电池重置之前保持启动状态的记忆棒寄存器。您能否提供有关您使用的硬件的更多信息?
  • 为什么解决方案要与硬件绑定?我需要我的 UEFI 驱动程序以或多或少的标准方式告诉操作系统,尽管它选择通过休眠方式关闭,但在此启动时它需要丢弃 hiberfil 数据并执行完全启动或诊断启动。我使用基于 Atom 的平台进行实验,但这必须适用于任何硬件。您能否详细说明在粘性寄存器中保留了哪些启动状态信息,操作系统应该检查这些信息以做出启动类型决定?
  • 这是一个相当复杂的话题。首先,固件始终知道您正在从哪个 ACPI 状态启动,并据此决定选择哪种启动路径。固件获取该信息的方式取决于硬件和固件。您的应用程序的实现并非易事。你想欺骗 ACPI 状态和操作系统关于以前的硬件状态。请查看this 帖子。还请提供确切的 Atom 模型,以便我查看数据表并将您指向寄存器。

标签: windows uefi


【解决方案1】:

这是我为解决这个问题所做的。我注册了一个 ExitBootServices 事件回调,并在该例程中检查启动模式是否为 BOOT_ON_S4_RESUME。我还检查了我的其他内部条件,因此如果系统从 S4 唤醒并且我需要强制诊断/完全启动,我只需执行 gRT->ResetSystem (...)。 ExitBootServices 事件在 Windows 启动过程中已经足够深入,因此此时突然重置会使其废弃 Hiberfil 数据并进行完全启动。

似乎没有明显的不利影响,例如任何错误消息 - 它在重置后启动干净。从视觉上看,重置发生在显示 Windows 徽标之后,因此用户体验也应该没问题。我不知道这种方法是否会成为生产代码,但我认为这是一个成功的实验。

【讨论】:

  • 有趣的解决方案 我想知道这是否不会长期影响 Windows 的稳定性,也想知道 Linux 或其他系统会如何运行。 ExitBootServices 由系统引导加载程序调用,这就是您在重置之前看到启动画面的原因。可以肯定的是,操作系统没有机会对以前的状态做任何事情。我最担心主要是不受 BIOS 控制的硬件(ME、AMT、BMC),也想知道系统中的各种驱动程序如果发现唤醒是从 S5 而不是 S4 会做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2011-08-31
  • 2017-01-17
相关资源
最近更新 更多