Testing

来自osdev
跳到导航 跳到搜索

除非有一种方法可以测试新版本的操作系统或内核,否则开发操作系统几乎只是完全无用的练习。 设置测试环境有许多不同的方法。 广义上,它们可以分为两种方法:

作为成功测试环境要达到的要求

  • 速度。 你希望能够重新启动你的 (可能是虚拟的) 测试机,并在输入完命令之前将其准备好与新内核一起使用。 你还希望代码尽可能快地执行,这样你就可以回到编码,而不是等待 GRUB 加载。 物理机可以在这个指标上获胜,但这取决于硬件速度,当然 (软盘驱动器特别慢)。模拟486的Core 2 Duo可能会比486本身更快。
  • 易用性。 仅为了修改20条不同命令,就构建和运行新内核,肯定不太好玩,因此你可能希望编译构建的更少。 减少测试构建步骤是减少Bug的好方法。 模拟器通常会在这个指标获胜,因为你可以设置makefile来构建磁盘映像,同时准备在模拟器中运行。 无盘引导 也是真实机器上的一种选择。
  • 与真实情况足够接近。 如果你的测试机器尽可能接近真实,这被认为是一件好事。 当然,物理机器最适合此,其次是 Bochs一类的虚拟机。

使用物理机进行测试

使用真实机器进行测试的主要优点是,如果你的操作系统在测试平台上运行,则很有可能也能在任何其他计算机上运行。 然而,如果你使用模拟器进行测试,它可能无法在真实的东西上工作。 缺点主要是你需要空间和金钱来维护第二台计算机,以及花费重新启动开发机器所花费的时间。 有了今天便宜的硬件,建议你有第二台物理计算机。 你可以花3000美元购买一台全新的测试计算机,也可以花20美元购买一台回收的 486。 一台计算机有几个组成部分,但是,以下是一个建议最低限度的清单:

  • 软盘驱动器 (用于启动和测试FAT12驱动程序)。
  • 一个 VGA-兼容视频卡。
  • 串口
  • 硬盘 (500MB绰绰有余)。
  • PCI/ISA 总线。
  • 网卡,例如 NE20003c90x

这类机器是一个很好的基础。 由此,你添加的任何其他设备都只是用来编写更多驱动程序的。 要执行测试,你可以从便携式介质 (软盘USB) 引导内核,或者使用 无盘引导 从开发PC下载内核。 从 CD-ROM 引导是另一种选择,尽管它可能需要大量空白光盘 (或CD-RW)。 另一个很棒的技术是使用U盘: 只需在其上复制好软盘映像,然后使用BIOS例程来读取,BIOS就会为你模拟出一个软盘。

Brendan在 这个 论坛主题中写了一篇关于购买和管理测试机的很好的指南。

使用虚拟机进行测试

使用虚拟机进行测试的优点是,它可以用一个非常简单的过程来编译然后运行你的新内核 (shell脚本可以使它成为一个命令过程),如果你明智地选择你的模拟器,在调试消息方面,你可以获得很多免费帮助。 这里有一份模拟器列表。 也许最推荐给OSDev开发者的两个是 BochsQEMU。 有关虚拟机测试的更多信息,请从相应的模拟器页面中获得。

使用虚拟机的一个缺点是硬件的选择受到限制。 例如,Bochs和QEMU的 VGA网络 设备的选择有限。 他们模拟的那些设备可能 (尽管不太可能) 有错误,并且不像真正的设备那样运行 (模拟器有时会为内存清零,而真正的机器通常没有)。

高级事项

硬盘访问测试

硬盘访问测试会带来比通常测试更麻烦的问题,因为这意味着不太可能使用你的主要开发平台作为测试平台 (你可以坚持,但这通常是一个坏主意。译者注:主要怕开发中的操作系统把在用硬盘弄坏了)。 但是,如果你确实需要 (由于缺少模拟器或第二台机器),请参考以下指南:

  • 你的内核应该非常稳定,以确保它不会写入内存中的随机位置,不是跟随空指针和其他类似的东西。 处于保护模式在这里是一个优势,因为你不会意外调用可能写入磁盘的BIOS代码。
  • 首先在ramdisk上尝试文件系统代码。 ramdisk内容可以从头开始构建,也可以由引导加载程序加载的数据生成 (GRUB 的模块加载工具将是很好的工具) 确保你有能力检查ramdisk中写入的内容,而不必将ramdisk写入真实磁盘 (你也可以在真正的磁盘上先试过)。
  • 在开发 “将” 执行磁盘访问的组件时,请确保首先在 模拟器 上对其进行测试,并确保其行为符合预期。 在磁盘功能中强制执行边界检查,这样你就不会弄错分区或类似的东西。 你甚至可以在低级驱动程序中对边界进行硬编码,如果上层组件要求它脱离磁盘上的 “安全” 阵列,则报告致命情况。
  • 在一个与你的主磁盘单独的控制器 (例如不同的IDE电缆)尝试测试驱动器,这样你的代码将访问不会损害你的主磁盘的I/O端口。 如果所有其他方法都失败,请在专用的第二台计算机上进行测试。

寻找特定的硬件

如果你需要为特定的硬件编写驱动程序,则有几种选择。 如果你尚未拥有旧的硬件设备,则可以在 eBay (和其他类似的地方) 上购买。 你还可以试试查看 论坛主题,其中许多用户列出了一些用于测试其他用户操作系统的计算机。 硬件分类 中列出的绝大多数硬件都相当普遍,并且是不错的开发选择。

单元测试

正文: Unit Testing

以上正文链接讨论了一种单独测试操作系统组件的方法,以及安装测试驱动(driver,译者注:单元测试需要driver和stub,分别模拟测试目标的上层和下层),以确保组件始终按预期工作 (比如,修复一个错误不会引入另一个错误)。

另见

论坛主题