Возможно ли выключить ядро Linux и возобновить работу в реальном режиме?

StackOverflow https://stackoverflow.com/questions/855150

Вопрос

Допустим, я хотел бы запустить небольшой дистрибутив Linux перед запуском моей обычной операционной системы.

  1. BIOS загружает MBR и выполняет MBR.
  2. MBR находит активный раздел, который является моим разделом Linux.
  3. Linux запускается, и я выполняю то, что мне нужно сделать.
  4. Linux выключается, и я снова переключаюсь в Реальный режим.
  5. Загрузочный сектор исходного раздела загружается, и запускается моя обычная операционная система.

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

Вы заглядывали в кексек?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top