Перезагрузка в защищенном режиме

В x86 Real Mode перезагрузка очень проста. Вы можете использовать BIOS или:

jmp 0xFFFF:0000

Но как перезагрузиться в защищенном режиме?

4 ответа

Решение

Раньше я писал 6 для порта 0xcf9, но вот большой список: http://smackerelofopinion.blogspot.nl/2009/06/rebooting-pc.html?m=1

Информация о ПОРТ 0xCF9.
Для записи в него нужен доступ к режиму ядра (имеется в виду из драйвера ядра).

Порт 0xCF9 может получить три значения для трех типов сброса:

Запись от 4 до 0xCF9:(INIT) включит процессор. Это означает, что он перейдет к исходному месту загрузки, но при этом многие элементы процессора останутся нетронутыми. Большинство внутренних таблиц, цепочек и т. Д. Останутся неизменными при вызове Init (но могут измениться во время него).

Запись от 6 до 0xCF9:(RESET) сбросит процессор с очищением всех кешей внутренних таблиц и т.д. до исходного состояния.

Запись от 0xE до 0xCF9:(RESTART) Включит и снова включит и выключит материнскую плату.

Пример в драйвере Windows:

__outbyte (0xCF9, 0xE);

Правильный способ перезагрузки в защищенном режиме (x86 или x86_64) - использовать функции управления питанием (если они доступны)

  1. Расширенная конфигурация и интерфейс питания (ACPI)
  2. Расширенное управление питанием (APM)
  3. BIOS (под vm86 или эмулятором) - но я советую не беспокоиться.

Быстрый и грязный способ - сделать тройную ошибку.

Хотя я не могу найти прямую ссылку, ребята на форумах OSDev предложили следующее (очевидно, взято из кода 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
Другие вопросы по тегам