我们正在编写一个专门的模拟器来模拟 x86 程序,我们通过将其效果与真实事物进行比较来对指令进行单元测试。它是通过在调试器中设置断点来完成的,然后检查寄存器、标志和各种内存地址是否设置为与模拟器中给定点相同的值。
它非常适合测试正常操作。
但是我们如何对可能出现的 CPU 异常进行单元测试呢?例如。段错误,零除法等?是否可以使用普通用户模式调试器获取异常中断号或类似的东西?
不,我不这么认为。考虑一页内存被占用到磁盘上。当你访问它时,会产生一个页面错误,内核拦截它,从磁盘读回页面,然后像什么都没发生一样重新开始执行。
因此,真正的问题是您无法在用户模式下验证退出用户模式的指令的行为。事实上,这同样适用于 a SYSCALL
。
如果我正确地假设您正在构建用户模式模拟器,那么您将必须自己实现异常处理。根据手册,当处理器响应中断或异常时,它会暂停当前任务的执行,并切换到 IDT 中为该异常条件安装的处理程序(有一些异常,如 SMI)。应用程序可以访问这些处理程序,但我不确定这对您是否有用。此外,请记住,某些中断/异常可能会保存相关状态(请参阅说明参考手册)。
无论如何,您可以安装处理程序(在您的模拟 CPU 中)以跟踪异常和发生时的状态,以便您可以对它们进行单元测试。