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 для загрузки. Я сделал следующее:
- Я клонировал из репозитория Xinu-OS.
Я следовал спецификации 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)
Я построил свой
Xinu.boot
а такжеXinu.elf
из модифицированного кода.- Я настроил Minicom в соответствии с инструкциями и успешно загрузил версию VBox.
- Я осмотрел
Xinu.boot
используется в версии VBox, и обнаружил, что это был 32-битный эльф для i386, ноXinu.boot
Я построил с Makefile был сделан из objcopy, в то время какXinu.elf
был эльф. Поэтому я переименовалXinu.elf
Я построил, чтобыXinu.boot
и заменил его на это в версии VBox. - Затем я попытался загрузиться с теми же файлами, кроме
Xinu.boot
в той же среде. - Это не удалось, и Grub дал мне командную строку Grub. Я также попытался использовать отладочную версию. Это тоже не удалось, но прежде чем он показал командную строку grub, он отобразил сообщение "Неизвестная команда: r(0, 1)".
Поэтому мой главный вопрос - в чем принципиальная разница между моими Xinu.boot
и что в версии VBox, которая мешает моей загрузке pxe? Кто-нибудь может пролить свет на это?
Мне потребовалось много чтений и экспериментов, чтобы добраться туда. Моя цель по-прежнему состоит в том, чтобы запустить Xinu, который я создал сам, изменить и протестировать его. Его не нужно загружать с помощью pxe, но я надеюсь, что смогу запустить его в VBox, а не на каком-то реальном оборудовании. Мои другие вопросы:
- Есть ли альтернативный (и более простой) способ запуска xinu в VBox или на виртуальной машине?
- Как grub поставляется в версии VBox, настроенной для поиска
Xinu.boot
Загружать? Потому что я пытался найти xinu в файлах, но ничего не получил. - Что означает сообщение "Неизвестная команда: r (0, 1)", и оно выдает grub или xinu?
- Как мне отладить такую систему? Я пытался вставить некоторые
kprintf
в начале. С, но никуда не деться. Я также пытался GDBXinu.elf
, но это дало мне ошибку сегментации после выполнения нескольких инструкций. И почему это не может быть отлажено в gdb? (Я новичок в сборке. Поэтому, пожалуйста, объясните.) - Есть ли надежное сообщество 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
даст вам больше информации о них.