以保护模式重新启动

时间:2015-06-04 01:27:16

标签: x86 osdev

在x86 Real Mode中,重启非常简单。您可以使用BIOS或:

jmp 0xFFFF:0000

但是如何在保护模式下重新启动?

4 个答案:

答案 0 :(得分:3)

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

  1. 高级配置和电源接口(ACPI)
  2. 高级电源管理(APM)
  3. BIOS(在vm86或模拟器下) - 但我建议不要打扰。
  4. 快速而肮脏的方式是做三重错误。

答案 1 :(得分:3)

关于PORT 0xCF9的信息。
为了写入它,需要访问内核模式(来自内核驱动程序的含义)。

0xCF9端口可以为三种类型的重置获得三个值:

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

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

将0xE写入0xCF9 :( RESTART) 用它带来的所有东西来驱动主板电源。

Windows驱动程序中的示例:

__ outbyte(0xCF9,0xE);

答案 2 :(得分:2)

虽然我找不到直接引用,但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

答案 3 :(得分:2)

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