Xinu在VM中启动

时间:2013-12-12 15:34:24

标签: unix grub vbox

我想通过Xinu了解操作系统和网络。我从github上的the xinu-os repo下载了源代码(最多4d489eead3a49170f69041b959bd5a1bd8dff92d)并自己编译了xinu.boot和xinu.elf。要真正了解它,我想做一些修改和测试。所以我的目标(以及这个问题的目标)是在VBox中启动xinu。

为了解释一下,我知道在the Xinu Page上, Code Available For Download 部分下有一个Versions of Xinu for a VM along with instructions项,其中包含一个VBox版本(I将其称为下面的VBox版本)。我不想使用该版本的原因是它不包含与github中的代码一样多的功能。我也知道github中有一个boot.xinu-os.org项目,它宣传能够在javascript PC模拟器中启动xinu。我不想使用它的原因是因为似乎存在一些限制,我认为可能存在比传统方式更多的问题(可能不是)。所以我想我可以使用xinu-os repo中的代码编译自己的二进制文件,并且可以像VBox中的VBox版本一样轻松地运行它们,但我似乎错了。

来自Xinu页面的VBox版本正在使用pxe和grub来启动。我做的是以下内容:

  1. 我是从xinu-os repo克隆的。
  2. 我跟着Multiboot Specification#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.bootXinu.elf

  4. 我按照指示设置了minicom,并成功启动了VBox版本。
  5. 我检查了VBox版本中使用的Xinu.boot,发现它是i386的32位精灵,但我用Makefile构建的Xinu.boot是用objcopy制作的,而{{1}是一个精灵。所以我将Xinu.elf重命名为Xinu.elf,并将其替换为VBox版本中的内容。
  6. 然后我尝试在同一环境中使用除Xinu.boot之外的相同文件启动。
  7. 失败了,grub给了我grub命令行。我也试过使用调试版。它也失败了,但在显示grub命令行之前,它显示了一条消息“Unknown command:r(0,1)”。
  8. 所以我的主要问题是我的Xinu.boot和VBox版本之间的根本区别是什么阻止了我的pxe启动?任何人都可以对此有所了解吗?

    我花了很多读数和实验才到达那里。我的目标仍然是运行我自己构建的Xinu,修改并测试它。它不需要用pxe启动,但我希望我可以在VBox中运行它,而不是在一些真正的硬件上运行它。我的其他问题是:

    1. 在VBox或虚拟机中运行xinu有没有其他(更容易)的方式?
    2. 配置为查找Xinu.boot的VBox版本中的grub是如何启动的?因为我试图在文件中搜索 xinu ,但什么都没有。
    3. 消息“未知命令:r(0,1)”是什么意思,是grub还是xinu发出它?
    4. 我应该如何调试这样的系统?我试图在start.S中插入一些Xinu.boot,但无处可去。我也试过gdb kprintf,但在运行一些指令后它给了我一个分段错误。为什么它不能在gdb中调试? (我是集会的新手。所以请解释。)
    5. 这类问题是否有可靠的心语社区或邮件列表?
    6. 我知道我的问题可能特别复杂,用英语表达我很尴尬。任何帮助将不胜感激!提前谢谢!

1 个答案:

答案 0 :(得分:3)

经过大量阅读,现在我可以在QEMU中成功运行github版本xinu。我就这样做了:

  • github版本xinu几乎无法更改以在QEMU中运行。如我的问题所述,添加多重引导标头是必需的。
  • 制作完成后,用xinu运行:

    qemu-system-i386 -kernel xinu.elf
    
  • 当QEMU运行时,它将停在显示“从ROM引导...”的屏幕上。然后按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附加到运行xinu的QEMU进程上。您可以通常使用gdb执行任何操作,例如设置断点,显示寄存器或反汇编等。完成所有操作后,请发出ccontinue)以启动。

您可能会发现无法在gdb中显示CRx个寄存器。你可以直接用QEMU做到这一点。在QEMU窗口中按CTRL-ALT-2,您将进入控制台,在那里您可以发出:

info registers

您将获得所有寄存器,包括CRx个寄存器。可以在该控制台中发出更多命令。 help会为您提供有关它们的更多信息。