什么是陷阱?

miz*_*izo 15 embedded cpu microcontroller processor hardware-traps

处理器数据表中列出了许多不同类型的陷阱,例如BusFault,MemManage Fault,Usage Fault和Address Error.

他们的目的是什么?如何在故障处理中使用它们?

Ira*_*ter 16

陷阱本质上是子程序调用,当处理器检测到指令流中的异常时,处理器强制执行这些调用.(有些处理器使它们成为中断,但这主要只是将更多的上下文推送到堆栈;如果陷阱包含用户和系统地址空间之间的切换,这会变得更有趣).

这对于处理很少但需要解决的条件很有用,例如除以零.通常,在执行除法指令之前,有一对额外的指令来测试除数为零是无用的开销,因为除数从不期望为零.因此,架构师让处理器与实际除法并行地进行检查,作为除法指令的一部分,并且如果除数为零,则使处理器陷入除零例程.另一个有趣的案例是非法内存地址; 很明显,您不希望在使用之前编写测试来检查每个地址.

通常存在各种潜在感兴趣的故障条件,并且设计的处理器将控制传递给针对每种不同类型的故障的不同的陷阱例程(通常设置为向量).

一旦处理器具有陷阱工具,CPU架构师就会发现很多用途.常见的用途是调试器断点,以及用于执行操作系统调用的陷阱到OS.


miz*_*izo 8

微处理器具有各种故障条件的陷阱.它们是同步中断,允许运行的OS /软件对错误采取适当的操作.陷阱中断程序流并设置寄存器位以指示故障.调试器断点也使用陷阱实现.

在典型的计算环境中,操作系统负责处理由用户进程触发的CPU陷阱.让我们考虑一下当我运行以下程序时会发生什么:

int main(void)
{
    volatile int a = 1, b = 0;
    a = a % b; /* div by zero */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

显示一条错误消息,我的盒子仍在运行,没有任何反应.在这种情况下,我的操作系统的故障处理方法是杀死违规进程并通知用户错误消息Floating point exception.

内核模式下的陷阱更成问题.如果操作系统本身有问题,它就不会采取纠正措施.对于系统进程,没有底层保护.这就是故障设备驱动程序可能导致实际问题的原因.

在裸机上工作时,没有操作系统的舒适保护,情况与上面的情况大致相似.实现连续正确操作的首要目标是在使用断言和更高级别的错误处理程序触发任何陷阱之前捕获所有潜在的陷阱条件.将陷阱视为最后一道防线,一个你不想故意陷入的安全网.

定义陷阱处理程序的行为值得一些思考,即使它们"永远不会发生".当出现意外情况时,它们将被执行,无论是由于宇宙射线在最极端情况下改变RAM.不幸的是,错误处理程序应该做什么没有一个正确的答案.

代码完成,第2版:

最合适的错误处理方式取决于错误发生的软件类型,并且通常有利于更正确或更稳健.严格来说,这些术语在规模的两端相互对立.正确意味着永远不会返回不准确的结果; 没有结果比不准确的结果更好.稳健性意味着总是尝试做一些允许软件继续运行的事情,即使这会导致有时结果不准确.

显然,我的操作系统的故障处理设计考虑了鲁棒性; 我可以执行有缺陷的代码并执行任何操作而不会使系统崩溃.仅为可靠性而设计意味着尽可能进行恢复尝试,如果所有其他方法都失败,则重置.如果您的产品是玩具,这是一种合适的方法.

安全关键应用程序需要更多的偏执,而应该支持正确性; 检测到故障时,写入错误日志,关闭.我们不希望我们的放射治疗单位从无效的垃圾值中选择剂量水平.

  • 我不明白你提出问题,然后在几分钟内提供一个非常完整的答案.这个代表是妓女吗? (4认同)
  • @IraBaxter,whoring并不是Jeff在他[关于这个主题的博客文章]中使用的确切术语(http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own -questions /).我想知道为什么人们对回答他们自己的问题的人如此激动. (3认同)
  • @IraBaxter,这本来打算作为[这个问题](http://stackoverflow.com/questions/7860565/what-are-the-most-reliable-fault-handling-strategies)的答案,已经关闭了.这个问题部分有效,虽然过于宽泛,所以我决定发布更适合SO格式的类似问题.我还觉得,如果我把它放在抽屉里,我已经完整的答案就不会让任何人受益,所以现在就是这样. (2认同)

Mat*_*hen 1

简而言之,它们允许您在处理器中发生某些情况时执行代码。它们有时被操作系统用于错误恢复。