在x86实模式下,重启非常简单 . 您可以使用BIOS或:
jmp 0xFFFF:0000
但是如何在保护模式下重启?
我曾经写过6到端口0xcf9,但这里有一个更大的列表:http://smackerelofopinion.blogspot.nl/2009/06/rebooting-pc.html?m=1
在保护模式(x86或x86_64)上重新启动的正确方法是使用电源管理功能(如果可用)
高级配置和电源接口(ACPI)
高级电源管理(APM)
BIOS(在vm86或模拟器下) - 但我建议不要费心 .
快速而肮脏的方式是做三重故障 .
有关端口0xCF9的信息 .为了写入它,需要访问内核模式(来自内核驱动程序的含义) .
0xCF9端口可以为三种类型的重置获得三个值:
Writing 4 to 0xCF9:(INIT) 将INIT CPU . 这意味着它将跳转到启动的初始位置,但它将保持许多CPU元素不变 . Init调用会保留大多数内部表,字符等等(但在此期间可能会发生变化) .
Writing 6 to 0xCF9:(RESET) 将所有内部表缓存等重置为初始状态的CPU .
Writing 0xE to 0xCF9:(RESTART) 将使用随附的所有东西为主板供电 .
Example in a windows driver:
__outbyte(0xCF9,0xE);
虽然我找不到直接引用,但是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
4 回答
我曾经写过6到端口0xcf9,但这里有一个更大的列表:http://smackerelofopinion.blogspot.nl/2009/06/rebooting-pc.html?m=1
在保护模式(x86或x86_64)上重新启动的正确方法是使用电源管理功能(如果可用)
高级配置和电源接口(ACPI)
高级电源管理(APM)
BIOS(在vm86或模拟器下) - 但我建议不要费心 .
快速而肮脏的方式是做三重故障 .
有关端口0xCF9的信息 .
为了写入它,需要访问内核模式(来自内核驱动程序的含义) .
0xCF9端口可以为三种类型的重置获得三个值:
Writing 4 to 0xCF9:(INIT) 将INIT CPU . 这意味着它将跳转到启动的初始位置,但它将保持许多CPU元素不变 . Init调用会保留大多数内部表,字符等等(但在此期间可能会发生变化) .
Writing 6 to 0xCF9:(RESET) 将所有内部表缓存等重置为初始状态的CPU .
Writing 0xE to 0xCF9:(RESTART) 将使用随附的所有东西为主板供电 .
Example in a windows driver:
__outbyte(0xCF9,0xE);
虽然我找不到直接引用,但是OSDev forums上的人提出了以下建议(显然是从Linux代码中提取的):