什么是陷阱?

问题描述 投票:13回答:4

处理器数据表中列出了许多不同类型的陷阱,例如BusFault,MemManage故障,使用故障和地址错误。

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

embedded cpu microcontroller processor hardware-traps
4个回答
15
投票

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

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

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

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


8
投票

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

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

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

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

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

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

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

代码完成,第2版:

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

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

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


4
投票

ARMv7-M(不要与ARM7和ARMv7-A混淆)Cortex-M3技术参考手册,它也可能是新ARM ARM之一(ARM架构参考手册)的一部分,它描述了每一个这些错误。

现在,为什么这些问题可能是问题的根源。通常为什么你有机会恢复。想象一下,如果您的机顶盒或电话遇到其中一个,您是希望它挂起还是可能尝试恢复?除非你期望这些错误中的一个(在这种情况下你不应该,x86系统和它们的一些故障是一个完全不同的故事)如果你存活了足够长的时间来击中其中一个,你最有可能最终触发你自己(软件试图通过重置处理器/系统来自杀)。您可以查看长列表并尝试找到可以从中恢复的列表。除以零,异常处理程序如何知道导致这种情况的数学错误是什么?一般来说它不能。未对齐的加载或存储,处理程序如何知道该代码尝试执行的操作,例如除以零可能是软件错误。未定义的指令,代码进入杂草并执行数据最有可能到此为止你已经走得太远而且无法恢复。任何类型的内存总线故障处理程序都无法修复硬件。

你必须经历每一个故障,并为每个故障定义你将如何处理它,你可以解决这一个故障的所有方法,以及你可以走出或处理这些路径中的每一个的方法。有时您可能能够恢复,否则您需要一个默认操作,例如将处理器挂在处理程序的无限循环中,以便软件工程师(如果可用)可以尝试使用调试器进入并查找代码已停止。或者在芯片内部或外部有一个看门狗定时器,具体取决于芯片和电路板设计(通常在芯片外部,WDT将重置整个电路板)。在尝试或导致重置之前,您可能有一些非易失性存储器尝试存储故障,执行此操作所需的时间和代码可能会导致您出现另一个故障,具体取决于故障。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.