我想通过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来启动。我做的是以下内容:
我跟着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)
我使用修改过的代码构建了Xinu.boot
和Xinu.elf
。
Xinu.boot
,发现它是i386的32位精灵,但我用Makefile构建的Xinu.boot
是用objcopy制作的,而{{1}是一个精灵。所以我将Xinu.elf
重命名为Xinu.elf
,并将其替换为VBox版本中的内容。Xinu.boot
之外的相同文件启动。所以我的主要问题是我的Xinu.boot
和VBox版本之间的根本区别是什么阻止了我的pxe启动?任何人都可以对此有所了解吗?
我花了很多读数和实验才到达那里。我的目标仍然是运行我自己构建的Xinu,修改并测试它。它不需要用pxe启动,但我希望我可以在VBox中运行它,而不是在一些真正的硬件上运行它。我的其他问题是:
Xinu.boot
的VBox版本中的grub是如何启动的?因为我试图在文件中搜索 xinu ,但什么都没有。Xinu.boot
,但无处可去。我也试过gdb kprintf
,但在运行一些指令后它给了我一个分段错误。为什么它不能在gdb中调试? (我是集会的新手。所以请解释。)我知道我的问题可能特别复杂,用英语表达我很尴尬。任何帮助将不胜感激!提前谢谢!
答案 0 :(得分:3)
经过大量阅读,现在我可以在QEMU中成功运行github版本xinu。我就这样做了:
制作完成后,用xinu运行:
qemu-system-i386 -kernel xinu.elf
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执行任何操作,例如设置断点,显示寄存器或反汇编等。完成所有操作后,请发出c
(continue
)以启动。
您可能会发现无法在gdb中显示CRx
个寄存器。你可以直接用QEMU做到这一点。在QEMU窗口中按CTRL-ALT-2
,您将进入控制台,在那里您可以发出:
info registers
您将获得所有寄存器,包括CRx
个寄存器。可以在该控制台中发出更多命令。 help
会为您提供有关它们的更多信息。