Unix 虚拟机中的Xinu引导

Unix 虚拟机中的Xinu引导,unix,grub,vbox,Unix,Grub,Vbox,我想学习一些关于操作系统和网络的知识。我从github上下载了源代码(最多4d489eead3a49170f69041b959bd5a1bd8dff92d),并亲自编译xinu.boot和xinu.elf。为了真正开始,我想做一些修改和测试。所以我的目标(也是这个问题的目标)是在VBox中引导xinu 为了稍微解释一下,我知道在上,在“可供下载的代码”部分下有一项,其中包括一个VBox版本(我将在下面将其称为VBox版本)。我不想使用该版本的原因是它没有包含github中代码中包含的那么多功能。

我想学习一些关于操作系统和网络的知识。我从github上下载了源代码(最多4d489eead3a49170f69041b959bd5a1bd8dff92d),并亲自编译xinu.boot和xinu.elf。为了真正开始,我想做一些修改和测试。所以我的目标(也是这个问题的目标)是在VBox中引导xinu

为了稍微解释一下,我知道在上,在“可供下载的代码”部分下有一项,其中包括一个VBox版本(我将在下面将其称为VBox版本)。我不想使用该版本的原因是它没有包含github中代码中包含的那么多功能。我还知道github中有一个boot.xinu-os.org项目,它宣传能够在javascript PC仿真器中引导xinu。我不想使用它的原因是因为它似乎有一些局限性,我认为可能会有比传统方法更多的问题(也许不会)。因此,我认为我可以用xinu os repo的代码编译自己的二进制文件,并以与VBox中的VBox版本类似的方式轻松运行它们,但我似乎错了

Xinu页面上的VBox版本使用pxe和grub进行引导。我所做的是:

  • 我是从xinu os repo克隆的
  • 我遵循,并将所需的头添加到_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版本
  • 我检查了VBox版本中使用的
    Xinu.boot
    ,发现它是i386的32位elf,但我用Makefile构建的
    Xinu.boot
    是由objcopy生成的,而
    Xinu.elf
    是elf。因此,我将
    Xinu.elf
    重命名为
    Xinu.boot
    ,并将其替换为VBox版本中的版本
  • 然后我尝试在相同的环境中使用相同的文件启动,除了
    Xinu.boot
  • 它失败了,grub给了我grub命令行。我还尝试使用调试版本。它也失败了,但在显示grub命令行之前,它显示了一条消息“未知命令:r(0,1)”
  • 所以我的主要问题是,我的
    Xinu.boot
    与VBox版本中阻止我的pxe引导的基本区别是什么?有人能解释一下吗

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

  • 在VBox或虚拟机中运行xinu是否有其他(更简单)的方法
  • VBox版本中的grub是如何配置为查找要引导的
    Xinu.boot
    的?因为我试图在文件中搜索xinu,但什么也没有得到
  • 消息“Unknown command:r(0,1)”是什么意思,是grub还是xinu发出的
  • 我应该如何调试这样一个系统?我试图在start.S中插入一些
    kprintf
    ,但没有成功。我还尝试使用gdb
    Xinu.elf
    ,但在运行了一些指令后,它给了我一个分段错误。为什么它不能在gdb中调试?(我是装配新手,请解释一下。)
  • 这类问题是否有可靠的Xinu社区或邮件列表

  • 我知道我的问题可能既特殊又复杂,用英语表达这些问题让我很尴尬。任何帮助都将不胜感激!提前谢谢

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

    • github版本xinu在QEMU中运行时几乎没有什么变化。需要按照我的问题中所述添加multiboot头
    • 制作完成后,使用Xiu运行:

      qemu-system-i386 -kernel xinu.elf
      
      qemu-system-i386 -s -S -kernel xinu.elf
      
    • 当QEMU运行时,它将在显示“从ROM引导…”的屏幕上停止。然后按CTRL-ALT-3,您将在那里找到它
    使用QEMU引导时,可以跳过grub以及grub导致的任何问题

    QEMU还方便了调试。如果您运行xinu时使用:

    qemu-system-i386 -kernel xinu.elf
    
    qemu-system-i386 -s -S -kernel xinu.elf
    
    QEMU将在运行任何指令之前启动和暂停(有关参数的更多详细信息,请参阅QEMU手册)。然后,您可以通过以下方式启动gdb并连接到它:

    gdb xinu.elf
    
    gdb启动后,发布:

    target remote localhost:1234
    
    您将把gdb附加到运行xinu的QEMU进程上。您可以使用gdb执行您通常执行的任何操作,例如设置断点、显示寄存器或反汇编等。完成所有操作后,发出
    c
    continue
    )启动

    您可能会发现无法在gdb中显示
    CRx
    寄存器。您可以直接使用QEMU实现这一点。在QEMU窗口中按CTRL-ALT-2,您将被放入控制台,您可以在控制台中发出:

    info registers
    
    您将获得所有寄存器,包括
    CRx
    寄存器。可以在该控制台中发出更多命令<代码>帮助将为您提供有关它们的更多信息