Перезагрузка в защищенном режиме
В 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) - использовать функции управления питанием (если они доступны)
- Расширенная конфигурация и интерфейс питания (ACPI)
- Расширенное управление питанием (APM)
- 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