Xinu загрузиться в ВМ

Я хочу узнать кое-что об ОС и работе в сети с Xinu. Я скачал исходный код из репозитория xinu-os на github (до 4d489eead3a49170f69041b959bd5a1bd8dff92d) и скомпилировал xinu.boot и xinu.elf самостоятельно. Чтобы действительно приступить к этому, я хотел сделать несколько модификаций и испытаний. Поэтому моя цель (а также цель этого вопроса) состояла в том, чтобы загрузить Xinu в VBox.

Чтобы объяснить это немного, я знаю, что на странице Xinu есть версия Xinu для виртуальной машины вместе с пунктом инструкций в разделе " Код, доступный для загрузки ", который включает версию VBox (я буду называть ее версией VBox). ниже). Причина, по которой я не хочу использовать эту версию, состоит в том, что она не включает в себя столько функций, сколько в коде на github. Я также знаю, что в github есть проект boot.xinu-os.org, который объявляет о возможности загрузки xinu в эмуляторе javascript для ПК. Причина, по которой я не хочу использовать это, заключается в том, что, похоже, существуют некоторые ограничения, и я подумал, что может быть больше проблем, чем обычным способом (возможно, нет). Поэтому я подумал, что смогу скомпилировать свои собственные двоичные файлы с помощью кода из репозитория xinu-os, и легко запустил их так же, как и версию VBox в VBox, но я был неправ.

Версия VBox со страницы Xinu использует pxe и grub для загрузки. Я сделал следующее:

  1. Я клонировал из репозитория Xinu-OS.
  2. Я следовал спецификации Multiboot #OS-image-format и добавил требуемый заголовок в конец _start, чтобы сделать двоичный мультизагрузочный совместимым:

    /* /xinu/loader/platforms/x86/start.S
     * ...
     * #define     MULTIBOOT_HEADER_MAGIC  0x1BADB002
     * #define     MULTIBOOT_HEADER_FLAGS  0x00000003
     * _start:
     * ...
     */
    jmp     startup
    
    /* Enable multiboot support */
    .align  4
    .long   MULTIBOOT_HEADER_MAGIC
    .long   MULTIBOOT_HEADER_FLAGS
    .long   -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
    
  3. Я построил свой Xinu.boot а также Xinu.elf из модифицированного кода.

  4. Я настроил Minicom в соответствии с инструкциями и успешно загрузил версию VBox.
  5. Я осмотрел Xinu.boot используется в версии VBox, и обнаружил, что это был 32-битный эльф для i386, но Xinu.boot Я построил с Makefile был сделан из objcopy, в то время как Xinu.elf был эльф. Поэтому я переименовал Xinu.elf Я построил, чтобы Xinu.boot и заменил его на это в версии VBox.
  6. Затем я попытался загрузиться с теми же файлами, кроме Xinu.boot в той же среде.
  7. Это не удалось, и Grub дал мне командную строку Grub. Я также попытался использовать отладочную версию. Это тоже не удалось, но прежде чем он показал командную строку grub, он отобразил сообщение "Неизвестная команда: r(0, 1)".

Поэтому мой главный вопрос - в чем принципиальная разница между моими Xinu.boot и что в версии VBox, которая мешает моей загрузке pxe? Кто-нибудь может пролить свет на это?

Мне потребовалось много чтений и экспериментов, чтобы добраться туда. Моя цель по-прежнему состоит в том, чтобы запустить Xinu, который я создал сам, изменить и протестировать его. Его не нужно загружать с помощью pxe, но я надеюсь, что смогу запустить его в VBox, а не на каком-то реальном оборудовании. Мои другие вопросы:

  1. Есть ли альтернативный (и более простой) способ запуска xinu в VBox или на виртуальной машине?
  2. Как grub поставляется в версии VBox, настроенной для поиска Xinu.boot Загружать? Потому что я пытался найти xinu в файлах, но ничего не получил.
  3. Что означает сообщение "Неизвестная команда: r (0, 1)", и оно выдает grub или xinu?
  4. Как мне отладить такую ​​систему? Я пытался вставить некоторые kprintf в начале. С, но никуда не деться. Я также пытался GDB Xinu.elf, но это дало мне ошибку сегментации после выполнения нескольких инструкций. И почему это не может быть отлажено в gdb? (Я новичок в сборке. Поэтому, пожалуйста, объясните.)
  5. Есть ли надежное сообщество Xinu или список рассылки для такого рода вопросов?

Я знаю, что мои вопросы могут быть особенными и сложными, и мне так неловко выражать их на английском. Любая помощь будет оценена! Заранее спасибо!

1 ответ

Решение

После долгого чтения, теперь я могу успешно запустить gitHub-версию xinu в QEMU. Вот как я это сделал:

  • Версия github xinu мало что может изменить в QEMU. Требуется добавить заголовок мультизагрузки, как описано в моем вопросе.
  • После создания, запустите с Xinu с:

    qemu-system-i386 -kernel xinu.elf
    
  • Когда QEMU запустится, он остановится на экране с надписью "Загрузка из ПЗУ...". Затем нажмите CTRL-ALT-3, там вы найдете это!

Загружаясь с QEMU, вы пропускаете grub вместе с любыми проблемами, вызывающими grub.

QEMU также делает его удобным для отладки. Если вы запускаете xinu с:

qemu-system-i386 -s -S -kernel xinu.elf

QEMU запустится и остановится перед выполнением какой-либо инструкции (см. Руководство QEMU для получения более подробной информации о параметрах). Затем вы можете запустить GDB и подключиться к нему:

gdb xinu.elf

И после запуска GDB, выполните:

target remote localhost:1234

Вы присоедините gdb к процессу QEMU, в котором работает xinu. Вы можете делать с GDB все, что вы обычно делаете, например устанавливать точки останова, отображать регистры, разбирать и т. Д. Когда все будет готово, выполните команду c (continue), чтобы начать.

Вы можете обнаружить, что не можете отобразить CRx регистрируется с GDB. Вы можете сделать это с QEMU напрямую. Нажмите CTRL-ALT-2 в окне QEMU вы попадете в консоль, где вы можете выполнить:

info registers

И вы получите все регистры, включая CRx из них. В этой консоли можно выполнить больше команд. help даст вам больше информации о них.

Другие вопросы по тегам