Возможно ли отключить ядро ​​Linux и продолжить работу в реальном режиме? - PullRequest
4 голосов
/ 13 мая 2009

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

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

AFAIK, шаг 4 будет сложной задачей, восстановить состояние на всех устройствах до Linux, будет ли INT13h работать? Нужно ли восстанавливать таблицу векторов прерываний? Чтобы упомянуть несколько.

Возможно, это было сделано в каком-либо из существующих проектов?

Ответы [ 3 ]

4 голосов
/ 14 мая 2009

Linux обычно не поддерживает это, особенно потому, что реинициализирует аппаратные средства таким образом, которого программы BIOS и DOS могут не ожидать. Тем не менее, есть некоторая инфраструктура для возврата в реальный режим в определенных случаях - в частности, для перезагрузки (см. Machine_real_restart в arch / x86 / kernel / reboot.c) - и есть код для повторной инициализации оборудования для kexec или приостановки. Я подозреваю, что вы могли бы что-то сделать с их сочетанием, но я не знаю, будет ли результат действительно соответствовать тому, что DOS или Windows ожидают увидеть при перезагрузке.

Намного проще было бы использовать загрузчик с загрузкой по цепочке, который можно настроить на загрузку в определенной конфигурации один раз, например, GRUB . Вы можете вызвать grub-set-default и перезагрузить компьютер. Когда появится GRUB, он передаст управление Windows. После установки резервной ОС для раздела Linux управление вернется в Linux при следующей загрузке.

Еще одним вариантом может быть использование Coreboot , но я не уверен, готов ли он к загрузке Windows.

3 голосов
/ 26 июня 2009

Я не пробовал это, поэтому я не знаю, будет ли это работать, но здесь идет:

В заголовке файла ядра формата bzImage есть опция, которая указывает адрес кода реального режима, который должен быть выполнен до запуска кода защищенного режима. Вы можете создать минимальный bzImage-совместимый файл, который не имеет реального ядра, но в котором есть код реального режима, чтобы загружать MBR с помощью INT 0x13 до 0x7c00 и вставлять в него jmp, как это делает BIOS.

Если вы используете kexec для загрузки bzImage с использованием опций "-t bzImage-x86 --real-mode", он должен сбросить бит PE в CR0 для перехода в реальный режим (как упомянуто выше bdonlan) и выполнить указанный код с помощью опции заголовка bzImage.

Параметр заголовка bzImage называется realmode_swtch и задокументирован в /usr/src/linux/Documentation/x86/boot.txt, код формата заголовка находится в / usr / src / linux / arch / x86 / boot / header. S

1 голос
/ 13 мая 2009

Вы смотрели в kexec ?

...