Возможно ли выключить ядро Linux и возобновить работу в реальном режиме?
-
21-08-2019 - |
Вопрос
Допустим, я хотел бы запустить небольшой дистрибутив Linux перед запуском моей обычной операционной системы.
- BIOS загружает MBR и выполняет MBR.
- MBR находит активный раздел, который является моим разделом Linux.
- Linux запускается, и я выполняю то, что мне нужно сделать.
- Linux выключается, и я снова переключаюсь в Реальный режим.
- Загрузочный сектор исходного раздела загружается, и запускается моя обычная операционная система.
AFAIK, шаг 4 будет сложной задачей, восстановите состояние на всех устройствах до Linux, будет ли INT13h функционировать?Нужно ли мне восстанавливать таблицу векторов прерываний?Чтобы упомянуть некоторые из них.
Возможно, это было сделано в каком-либо существующем проекте?
Решение
Linux обычно не поддерживает это, особенно из-за того, что он повторно инициализирует оборудование способом, которого могут не ожидать программы BIOS и DOS.Однако существует некоторая инфраструктура для возврата в реальный режим в определенных случаях - в частности, для перезагрузки (см. machine_real_restart в arch/x86/kernel/reboot.c) - и содержит код для повторной инициализации оборудования для kexec или приостановки.Я подозреваю, что вы могли бы что-то сделать с помощью их комбинации, но я не знаю, будет ли результат действительно соответствовать тому, что DOS или Windows ожидают увидеть при перезагрузке.
Гораздо более простым планом было бы использовать загрузчик с цепной загрузкой, который можно настроить на загрузку в определенной конфигурации один раз, например ЖРАТВА.Вы могли бы вызвать grub-set-default, затем перезагрузиться.Когда появится GRUB, он передаст управление Windows.Установив затем резервную операционную систему на раздел Linux, управление вернется к Linux при следующей загрузке.
Еще одним вариантом может быть использование Основной Ботинок, но я не уверен, что это уже готово к загрузке Windows.
Другие советы
я не пробовал этого, так что не знаю, сработает ли это, но вот что получается:
В заголовке файла ядра формата bzImage есть опция, которая указывает адрес кода реального режима, который должен выполняться перед запуском кода защищенного режима.Вы могли бы создать минимальный файл, совместимый с bzImage, у которого нет реального ядра, но который имеет код реального режима для загрузки вашего MBR с использованием INT 0x13 в 0x7c00 и jmp в него, как это делает BIOS.
Если вы используете kexec для загрузки bzImage, используя опции "-t bzImage-x86 --real-mode", он должен сбросить бит PE в CR0, чтобы перейти к realmode (как упоминалось выше bdonlan) и выполнить код, на который указывает опция заголовка bzImage.
Параметр заголовка bzImage называется realmode_swtch и задокументирован в /usr/src/linux/Documentation/x86/boot.txt код формата заголовка находится в /usr/src/linux/arch/x86/boot/header.S
Вы заглядывали в кексек?