【问题标题】:Xinu boot in VM [closed]虚拟机中的Xinu启动[关闭]
【发布时间】:2013-12-31 02:33:39
【问题描述】:

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

稍微解释一下,我知道在the Xinu Page,在可供下载的代码部分下有一个Versions of Xinu for a VM along with instructions项目,其中包括一个VBox版本(我会参考它作为下面的 VBox 版本)。我不想使用那个版本的原因是它没有像 github 中的代码那样包含那么多的特性。我还知道在 github 中有一个 boot.xinu-os.org 项目,它宣传能够在 javascript PC 模拟器中启动 xinu。我不想使用它的原因是因为似乎有一些限制,而且我认为可能存在比传统方式更多的问题(也许不是)。所以我想我可以用 xinu-os repo 中的代码编译我自己的二进制文件,并以与 VBox 中的 VBox 版本类似的方式轻松运行它们,但我似乎错了。

Xinu 页面的 VBox 版本使用 pxe 和 grub 启动。我所做的如下:

  1. 我从 xinu-os 存储库克隆。
  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制作的,而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. 有没有其他(更简单)的方法可以在 VBox 或虚拟机中运行 xinu?
  2. VBox 版本中的grub 是如何配置找到Xinu.boot 来引导的?因为我试图在文件中搜索xinu,但什么也没有。
  3. “未知命令:r(0, 1)”消息是什么意思,是 grub 还是 xinu 发出的?
  4. 我应该如何调试这样的系统?我试图在 start.S 中插入一些kprintf,但没有成功。我也尝试过 gdb Xinu.elf,但在运行了一些指令后它给了我一个分段错误。为什么它不能在 gdb 中调试? (我是组装新手。所以请解释一下。)
  5. 有没有可靠的 Xinu 社区或邮件列表来解决这类问题?

我知道我的问题可能很特殊和复杂,我很难用英语表达它们。任何帮助将不胜感激!提前致谢!

【问题讨论】:

    标签: unix virtualbox grub


    【解决方案1】:

    经过大量阅读,现在我可以在 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 会给你更多关于他们的信息。

    【讨论】:

      猜你喜欢
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 2022-07-09
      • 2011-07-25
      相关资源
      最近更新 更多