Testing
除非有一种方法可以测试新版本的操作系统或内核,否则开发操作系统几乎是完全无用的练习。 设置测试环境有许多不同的方法。 广义上,它们可以分为两种方法:
- 物理机器
- virtual machine
作为成功的测试环境要达到的要求
- 速度。 你希望能够重新启动你的 (可能是虚拟的) 测试机,并在输入完命令之前将其准备好与新内核一起使用。 你还希望代码尽可能快地执行,这样你就可以回到编码,而不是等待 GRUB 加载。 物理机可以在这个指标上获胜,但这取决于硬件速度,当然 (软盘驱动器特别慢)。模拟486的Core 2 Duo可能会比486本身更快。
- 易用性。 仅为了修改20种不同命令,就构建和运行新内核,肯定不太好玩,因此你可能希望编译构建的更少。 减少测试构建步骤是使错误漏出的好方法。 模拟器通常会在这里获胜,因为你可以设置makefile来构建磁盘映像,同时准备在模拟器中运行。 Diskless Booting 也是真实机器的一种选择。
- 与真实情况足够接近。 如果你的测试机器尽可能接近真实,这被认为是一件好事。 当然,物理机器最适合此,其次是 Bochs一类的虚拟机。
使用物理机进行测试
使用真实机器进行测试的主要优点是,如果你的操作系统在测试平台上运行,则很有可能也能在任何其他计算机上运行。 然而,如果你使用模拟器进行测试,它可能无法在真实的东西上工作。 缺点主要是你需要空间和金钱来维护第二台计算机,以及花费重新启动开发机器所花费的时间。 有了今天便宜的硬件,建议你有第二台物理计算机。 你可以花3000美元购买一台全新的测试计算机,也可以花20美元购买一台回收的 486。 一台计算机有几个组成部分,但是,以下是一个建议最低限度的清单:
这种机器是一个很好的基础。 由此,你添加的任何其他内容都只是用来编写更多驱动程序的。 要执行测试,你可以从便携式介质 (Floppy 或 USB) 引导内核,或者使用 Diskless Booting 从开发PC下载内核。 从 CD-ROM 引导是另一种选择,尽管它可能需要大量空白光盘 (或CD-RW)。 另一个很棒的技术是使用U盘: 只需在其上复制软盘映像,只要你使用BIOS routines来读取,BIOS就会为你模拟出一个软盘。
Brendan在 这个 论坛主题中写了一篇关于购买和管理测试机的很好的指南。
使用虚拟机进行测试
使用虚拟机进行测试的优点是,它可以用一个非常简单的过程来编译然后运行你的新内核 (shell脚本可以使它成为一个命令过程),如果你明智地选择你的模拟器,在调试消息方面,你可以获得很多免费帮助。 这里有一份仿真器列表。 也许最推荐给OSDev的两个是 Bochs 和 QEMU。 有关虚拟机测试的更多信息,请从相应的仿真器页面中获得。
使用虚拟机的一个缺点是硬件的选择受到限制。 例如,Bochs和QEMU的 VGA 和 网络 设备的选择有限。 他们模拟的那些设备可能 (尽管不太可能) 有错误,并且不像真正的设备那样运行 (模拟器有时内存为零,而真正的机器通常没有)。
高级事项
硬盘访问测试
测试硬盘访问会带来比通常测试问题更麻烦,因为这意味着不太可能使用你的主要开发平台作为测试平台 (你可以坚持,但这通常是一个坏主意)。 但是,如果你确实需要 (由于缺少模拟器或第二台机器),请参考以下指南:
- 你的内核应该非常稳定,以确保它不会写入内存中的随机位置,不是跟随空指针和其他类似的东西。 处于保护模式在这里是一个优势,因为你不会意外调用可能写入磁盘的BIOS代码。
- 首先在ramdisk上尝试文件系统代码。 ramdisk内容可以从头开始构建,也可以由引导加载程序加载的数据生成 (GRUB 的模块加载工具将是很好的工具) 确保你有能力检查ramdisk中写入的内容,而不必将ramdisk写入真实磁盘 (否则你也可以在真正的磁盘上试过)。
- 在开发 “将” 执行磁盘访问的组件时,请确保首先在 模拟器 上对其进行测试,并确保其行为符合预期。 在磁盘功能中强制执行边界检查,这样你就不会弄错分区或类似的东西。 你甚至可以在低级驱动程序中对边界进行硬编码,并报告致命情况,如果上层组件要求它脱离磁盘上的 “安全” 阵列。
- 在一个与你的主磁盘单独的控制器 (例如不同的IDE电缆)尝试测试驱动器,这样你的代码将访问不会损害你的主磁盘的I/O端口。 如果所有其他方法都失败,请在专用的第二台计算机上进行测试。
寻找特定的硬件
如果你需要为特定的硬件编写驱动程序,则有几种选择。 如果你尚未拥有旧的硬件设备,则可以在 eBay (和其他类似的地方) 上购买。 你可能还想尝试 此 论坛主题,其中许多用户列出了一些用于测试其他用户操作系统的计算机。 硬件分类 中列出的绝大多数硬件都相当普遍,并且将是开发的不错选择。
单元测试
- 正文: Unit Testing
以上文章链接讨论了一种单独测试操作系统组件的方法,并安装测试驱动程序,以确保组件始终按预期工作 (例如,修复一个错误不会引入另一个错误)。