在虚拟机中开发和测试内核

8

我喜欢编程挑战,编写内核似乎是一项挑战。

不幸的是,内核特别难以测试,因为它们基本上是操作系统的核心,所以不能轻易地在操作系统之上运行。

然而,我知道有一种叫做虚拟机的应用程序,可以模拟计算机硬件。

使用虚拟机开发和测试内核(C + Assembly)的最简单/最佳方法是什么?

5个回答

11

虽然BOCHS在让你知道操作系统出了大问题时做得更好……但它运行得非常慢!我一般使用VirtualPC进行通用测试,当事情变得模糊时才使用BOCHS。

此外,你很可能每隔2分钟就需要启动操作系统,因此最好有某种自动化方式来构建启动镜像并启动Virtual PC。

我创建了一个GRUB启动软盘映像,并包含了所有必要的内容以使其从根目录引导Kernel.Bin。我使用批处理文件将此文件复制到虚拟项目目录中,使用FAT Image Generator将我的内核复制到映像中。接着只需启动VirtualPC项目即可,万事大吉!

以下是批处理文件的摘录:

COPY Images\Base.vfd Images\Boot.vfd /Y
fat_imgen.exe modify Images\Boot.vfd -f Source\Bin\KERNEL.BIN
COPY Images\Boot.vfd Emulators\VirtualPC\ /Y
START Emulators\VirtualPC\MyOS.vmc

最后一个建议:将VirtualPC进程的优先级设置为低-请相信我! 如果你愿意,我很乐意交换一些代码!

工具:DGJPP,NASM,GRUB。
代码:osdev.org,osdever.net


我的电脑上没有软盘读取器,但我猜对于软盘镜像来说并不需要。你的指示看起来很准确,只是我使用Linux... 针对这个操作系统有什么特别的要求吗? - luiscubal
好的,这方面我了解不多 - 我对Linux的经验非常有限。根据我的理解:在Linux下创建虚拟软盘映像并将文件复制到其中要比在Windows下简单得多,但是如果我在这方面回答问题,可能只会误导您。然而,可以尝试使用VMWare来支持Linux,这是个好东西! - NTDLS
Linux:编译器显然是gcc,而不是djgpp(它本身是gcc的一个移植版本)。 - Tadeusz A. Kadłubowski

1

你可能会对HelenOS感兴趣。它是一个从头开始编写的微内核,已经被移植到许多架构上(可以在裸机上正常启动),使用Simics和QEMU等模拟器进行开发。

我们使用静态grub,在构建过程中将其复制到最终的ISO中。有些事情必须这样做,直到操作系统变得自主托管。我强烈建议不要实现自己的用户空间C库,除非你真的想从头开始做所有事情..这样你会更快地成为自主托管 :)

虽然Simics是非免费的,但我强烈推荐它(以及其内置的调试/分析工具)来制作你的内核。一旦你有了某种内核控制台和记录器,QEMU就可以很好地完成工作。


0

可能只是设置一台机器(我猜是x86),然后调查在启动过程中它的行为。主机文件系统中应该有一个或多个文件作为虚拟机的文件系统,然后您需要在那里放置一些引导扇区信息,以使您正在开发的内核启动。

这当然意味着主机上的构建系统有一种方法将内核写入虚拟机的文件系统中,这可能会因难度而异。

随机选择一个,bochs似乎支持使用标准工具(如dd等)从外部编辑引导介质。


0

这很简单。设置一个虚拟机,编写你的内核,将其复制到虚拟机中,启动虚拟机。

如果您想要更具体的建议,您需要提供更多详细信息。


0
你需要首先问问自己的问题是:你的硬件架构是什么?为了讨论方便,我会假设你的目标是IA_32架构,这应该是一个明智的选择,因为有很多现成的关于这个处理器的文档。
如果你真的认真对待这个项目,那么你一定会想要在模拟器或虚拟机上运行你的调试/代码/构建/部署周期。有人提到了非常受欢迎的BOCHS模拟器,如果速度很重要,还有一个比BOCHS更快的模拟器叫Qemu。
我建议你的开发环境运行在Linux或Windows下,因为有很多相关的文档。
Make工具是你的好朋友。用它来自动化构建/执行过程。我建议你提前选择好你的工具集/编译器,并花些时间学习它们,这样可以节省你的时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接