【问题标题】:How to test CPU exceptions in an x86 emulator?如何在 x86 模拟器中测试 CPU 异常?
【发布时间】:2013-09-12 10:01:41
【问题描述】:

我们正在编写一个专门的模拟器来模拟 x86 程序,并且我们通过将其效果与真实事物进行比较来对指令进行单元测试。它是通过在调试器中设置断点来完成的,然后检查寄存器、标志和各种内存地址是否设置为与模拟器中给定点相同的值。

它非常适合测试正常操作。

但是我们如何对可能出现的 CPU 异常进行单元测试呢?例如。段错误,零除法等? 普通用户态调试器是否可以获取异常中断号之类的?

【问题讨论】:

    标签: x86 emulation


    【解决方案1】:

    不,我不这么认为。考虑一页内存被占用到磁盘。当你访问它时,会产生一个页面错误,内核拦截它,从磁盘读回页面,然后像什么都没发生一样重新开始执行。

    所以,真正的问题是您无法验证在用户模式退出用户模式的指令的行为。事实上,这同样适用于SYSCALL

    【讨论】:

    • 这是否意味着,在用户模式下观察到的行为很大程度上取决于操作系统和操作系统版本?这是否意味着不能简单地测试除以零时是否真的调用了 INT 0 处理程序?
    【解决方案2】:

    如果我正确地假设您正在构建用户模式模拟器,那么您将必须自己实现异常处理。根据手册,当处理器响应中断或异常时,它会暂停当前任务的执行,并切换到 IDT 中为该异常条件安装的处理程序(有一些异常,如 SMI)。应用程序可以访问这些处理程序,但我不确定这对您是否有用。此外,请记住,某些中断/异常可能会保存相关状态(请参阅说明参考手册)。

    无论如何,您都可以安装处理程序(在您的模拟 CPU 中)来跟踪异常和发生时的状态,以便您可以对它们进行单元测试。

    【讨论】:

    • 在模拟器中实现异常处理程序是比较容易的部分。问题是我想通过将其与真实 CPU 进行比较来验证我们的模拟器的正确性。例如,我除以零(整数除法),我可以在用户模式下为 INT 0 安装处理程序吗?所以我可以在调试器中验证它是否真的像我预期的那样执行,并与模拟器进行比较。
    • 不,您不能在用户模式下安装异常处理程序。您将不得不修改并重新编译您的内核。不过,您仍然可以根据 x86 规范验证您的模拟器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2017-12-11
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多