以保护模式重启
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)下重启的正确方法是使用电源管理功能(如果可用)
- 高级配置和电源接口 (ACPI)
- 高级电源管理 (APM)
- 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);
在 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)下重启的正确方法是使用电源管理功能(如果可用)
- 高级配置和电源接口 (ACPI)
- 高级电源管理 (APM)
- 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);