Windows 设置1中有一个选项,可让您进入固件设置2。它是如何做到的?我猜想它会是某种汇编指令,但我不确定它是什么。
1如果我没记错的话。2
可能需要重新启动后...
答案1
具有快速启动功能的 UEFI 固件支持OsIndications
包含 64 位位掩码的 EFI 变量。为了请求固件设置界面,Windows 会设置此变量中的位 1(也称为 EFI_OS_INDICATIONS_BOOT_TO_FW_UI),然后进行正常的系统重启。
- UEFI 规范 – OsIndications 变量格式:
https://uefi.org/sites/default/files/resources/UEFI_Spec_2_8_final.pdf#page=345 - 英特尔开发博客:
https://firmware.intel.com/blog/using-os-indications-uefi - Linux 上的 Systemd 实现:
https://lists.freedesktop.org/archives/systemd-devel/2013-January/008216.html
使用 EFI 变量可以启动到其他操作系统条目BootNext
,该变量是一个 16 位整数,包含所需条目的编号Boot####
。例如,操作系统可以将其设置为 0x0002,然后进行常规重启,以便使用 Boot0002。
这两个变量在使用一次后都会被固件自动清除。
- UEFI 规范 – BootNext 变量格式:
https://uefi.org/sites/default/files/resources/UEFI_Spec_2_8_final.pdf#page=156 - UEFI 规范 – 整个启动过程的信息:
https://uefi.org/sites/default/files/resources/UEFI_Spec_2_8_final.pdf#page=143
在这两种情况下,变量都是通过调用SetVariable()
EFI 运行时服务上的方法来设置的。用户空间代码无法直接访问该方法,但您可以使用操作系统提供的 API 来执行相同的操作。(在 Windows 上,您可以使用设置固件环境变量,在 Linux/sys/firmware/efi/efivars
或 libefivar 上。)
答案2
INT 20 在 POST 时可用,一旦加载 DOS,它就会执行 INT 21 上的某些功能。我不记得 INT 20 调用的确切参数,但如果你搜索一下,就会发现必须将 al、ah 和其他寄存器设置为什么才能重新启动并调用 bios 设置屏幕。