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