首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VM中的Xinu引导

VM中的Xinu引导
EN

Stack Overflow用户
提问于 2013-12-12 15:34:24
回答 1查看 2.1K关注 0票数 2

我想了解一些关于操作系统和与西努联网的知识。我在github上下载了新奥斯回购的源代码(最多4d489eead3a49170f69041b959bd5a1bd8dff92d),并自己编译了xinu.boot和xinu.elf。为了真正做到这一点,我想做一些修改和测试。所以我的目标(也是这个问题的目标)是在VBox中引导鑫。

为了稍微解释一下,我知道在辛努页上,在“代码可供下载”一节中有一个VM的Xinu版本及其说明项,其中包括一个VBox版本(我将将其称为下面的VBox版本)。我不想使用该版本的原因是它没有github中的代码包含更多的特性。我还知道,github中有一个boot.xinu-os.org项目,该项目宣传说可以在javascript PC仿真器中引导xinu。我不想使用的原因是因为似乎有一些限制,而且我认为可能存在比传统方法更多的问题(也许不是)。因此,我想我可以用xinu-os回购的代码编译我自己的二进制代码,轻松地以类似于VBox版本的方式在VBox中运行它们,但我似乎错了。

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

  1. 我是从新奥斯回购公司克隆的。
  2. 我遵循多引导规范#OS-映像格式,并将所需的头添加到_start的末尾,以使二进制多引导兼容: /* /新华网/装载机/平台/x86/start.S*定义MULTIBOOT_HEADER_MAGIC 0x1BADB002 **定义MULTIBOOT_HEADER_FLAGS 0x00000003 * _start:*./ jmp启动/*启用多引导支持*/ .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版本中使用的VBox,发现它是i386的32位精灵,但是我用Makefile构建的Xinu.boot是用objcopy制作的,而Xinu.elf是一个精灵。因此,我将构建的Xinu.elf重命名为Xinu.boot,并在VBox版本中将其替换。
  6. 然后,我尝试在相同的环境中使用除Xinu.boot之外的相同文件进行引导。
  7. 它失败了,grub给了我grub命令行。我还尝试使用调试版本。它也失败了,但是在显示grub命令行之前,它显示了一条消息:"Unknown : r(0,1)“。

因此,我的主要问题是,我的Xinu.boot和VBox版本之间的根本区别是什么,它阻止了我的启动?有人能解释一下吗?

我花了大量的阅读和实验才达到这个目的。我的目标仍然是运行我自己创建的Xinu,修改和测试它。它不需要用pxe引导,但我希望我可以在VBox中运行它,而不是在一些真正的硬件上运行。我的其他问题是:

  1. 在VBox或虚拟机中是否有其他(也更容易)的运行xinu的方法?
  2. 如何将VBox版本中的grub配置为找到要引导的Xinu.boot?因为我试着在档案里寻找新奴,但一无所获。
  3. 什么是“未知命令: r(0,1)”的意思,是grub还是xinu发出的?
  4. 我应该如何调试这样的系统?我试着在start.S中插入一些kprintf,但一无所获。我也尝试了gdb Xinu.elf,但是在运行了一些指令之后,它给了我一个分段错误。为什么不能在gdb中调试呢?(我是个装配新手。所以请解释。)
  5. 对于这类问题,是否有可靠的新华网社区或邮件列表?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-14 13:31:01

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

  • 在QEMU中运行的github版本xinu几乎没有什么改变。如我在问题中所述,需要添加多重引导头。
  • 制作完毕后,与新宇一起跑,用: qemu系统i 386 -kernel xinu.elf
  • 当QEMU运行时,它将停在显示“从ROM.引导”的屏幕上。然后按CTRL-ALT-3,你会找到它的!

使用QEMU引导时,可以跳过grub,以及grub引起的任何问题。

QEMU也为调试提供了方便。如果你带着:

代码语言:javascript
复制
qemu-system-i386 -s -S -kernel xinu.elf

在运行任何指令之前,QEMU将启动和暂停(有关参数的更多详细信息,请参阅QEMU手册)。然后,您可以启动gdb并通过以下方式附加到它:

代码语言:javascript
复制
gdb xinu.elf

在gdb启动后,发布:

代码语言:javascript
复制
target remote localhost:1234

您将把gdb附加到运行xinu的QEMU进程上。您可以对gdb做任何您通常做的事情,例如设置断点、显示寄存器或拆卸等等。当所有操作完成后,发出c (continue)开始。

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

代码语言:javascript
复制
info registers

您将得到包括CRx寄存器在内的所有寄存器。在该控制台中可以发出更多的命令。help会给你更多关于他们的信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20547610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档