Unix 虚拟机中的Xinu引导
我想学习一些关于操作系统和网络的知识。我从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进行引导。我所做的是:Unix 虚拟机中的Xinu引导,unix,grub,vbox,Unix,Grub,Vbox,我想学习一些关于操作系统和网络的知识。我从github上下载了源代码(最多4d489eead3a49170f69041b959bd5a1bd8dff92d),并亲自编译xinu.boot和xinu.elf。为了真正开始,我想做一些修改和测试。所以我的目标(也是这个问题的目标)是在VBox中引导xinu 为了稍微解释一下,我知道在上,在“可供下载的代码”部分下有一项,其中包括一个VBox版本(我将在下面将其称为VBox版本)。我不想使用该版本的原因是它没有包含github中代码中包含的那么多功能。
/* /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
Xinu.boot
,发现它是i386的32位elf,但我用Makefile构建的Xinu.boot
是由objcopy生成的,而Xinu.elf
是elf。因此,我将Xinu.elf
重命名为Xinu.boot
,并将其替换为VBox版本中的版本Xinu.boot
Xinu.boot
与VBox版本中阻止我的pxe引导的基本区别是什么?有人能解释一下吗
我花了很多阅读和实验才到达那里。我的目标仍然是运行我自己构建的Xinu,修改并测试它。它不需要用pxe启动,但我希望我可以在VBox中运行它,而不是在一些真正的硬件上运行。我的其他问题是:
Xinu.boot
的?因为我试图在文件中搜索xinu,但什么也没有得到kprintf
,但没有成功。我还尝试使用gdbXinu.elf
,但在运行了一些指令后,它给了我一个分段错误。为什么它不能在gdb中调试?(我是装配新手,请解释一下。)我知道我的问题可能既特殊又复杂,用英语表达这些问题让我很尴尬。任何帮助都将不胜感激!提前谢谢 经过大量阅读,现在我可以在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-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
寄存器。可以在该控制台中发出更多命令<代码>帮助将为您提供有关它们的更多信息