以保护模式重启

Rebooting in Protected Mode

在 x86 实模式中重启非常简单。您可以使用 BIOS 或:

jmp 0xFFFF:0000

但是在保护模式下应该如何重启?

虽然我找不到直接参考,但 OSDev forums 上的人提出了以下建议(显然是从 Linux 代码中提取的):

;Forcing reboot with keyb controller ;)
_reboot:
WKC:
    XOR         AL, AL
    IN          AL, 0x64
    TEST        AL, 0x02
    JNZ         WKC

    MOV         AL, 0xFC
    OUT         0x64, AL

在保护模式(x86 或 x86_64)下重启的正确方法是使用电源管理功能(如果可用)

  1. 高级配置和电源接口 (ACPI)
  2. 高级电源管理 (APM)
  3. BIOS(在 vm86 或模拟器下)- 但我建议不要费心。

快速而肮脏的方法是做三重故障。

我曾经将 6 写入端口 0xcf9,但这里有一个更大的列表: http://smackerelofopinion.blogspot.nl/2009/06/rebooting-pc.html?m=1

端口 0xCF9 的信息。
为了写入它,需要访问内核模式(意思是来自内核驱动程序)。

0xCF9 端口可以获得三种复位类型的三个值:

将 4 写入 0xCF9:(INIT) 将初始化 CPU。这意味着它会跳转到启动的初始位置,但它会保持许多 CPU 元素不变。大多数内部表、chaches 等将在 Init 调用时保持不变(但可能会在此期间发生变化)。

将 6 写入 0xCF9:(RESET) 将重置 CPU 并将所有内部表缓存等清除为初始状态。

正在将 0xE 写入 0xCF9:(重新启动) 会用它附带的所有东西重新启动主板。

windows 驱动程序中的示例:

__outbyte(0xCF9, 0xE);