从头开始中断处理程序

时间:2014-08-10 23:40:43

标签: operating-system interrupt-handling

我想从头开始了解AMD64架构的操作系统开发,并且已经到了一定程度。但是,我需要学习如何附加中断处理程序。我还没有找到任何好的教程,通过示例逐步描述该过程。我阅读了处理器手册。但是,我需要一个C代码示例。

有人可以提出一个好的消息来源或给出一个简单的例子吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

你的问题不够具体,无法给出一个好的答案。您是在谈论一般的中断处理程序还是针对特定操作系统的中断处理程序?此外,它非常依赖于架构。某些处理器生成许多级别的中断(具有优先级),其他处理器仅具有单个中断级别。然后是NMI中断,通常总是由硬件生成。

另外,您需要了解中断发生的级别?我希望这不是光顾......但我想到一个人写一封信的中断。电话响了,他停止写信,接听电话,完成电话后,回到正确写信的地方。 (呼叫是中断,处理中断是他接听电话)。

让我们举一个简单的中断示例,比如一个由计时器生成的中断。为了方便起见,我将引用Amiga中断,因为它们本质上是非常原始的,而在某些体系结构中,在应用程序处理中断之前会有一些操作系统干预。

首先要了解硬件。为了让您从计时器获得中断,您必须启用它。通常有一个硬件寄存器来执行此操作。该寄存器将屏蔽启用哪些中断以及哪些中断不被启用。现在,如果你启用了这个中断,当它发生时,处理器将停止它正在做的事情,执行堆栈交换(到管理程序堆栈)并在特定地址调用中断处理例程或向量。为了自己处理这个中断,你需要编写一个处理程序并将其地址写入处理程序地址或向量。然后你的例程就会被调用。

您的例行程序需要注意这样一个事实,即您可能需要处理中断的时间限制,也可能会被更高优先级的中断打断,并且您必须为中断服务或通过中断前面的前任处理程序。

在你的中断处理程序中你应该......检查中断来自哪里,因为可能有很多来源,然后你可以决定是否要处理中断。您可能必须询问硬件设备以识别中断源。如果它是你想要处理的,那么在执行你想做的任何事情时,你必须确认中断并告诉硬件你已经为中断服务。通常会有一个特定的注册表来执行此操作。然后你可以退出你的中断处理程序,但只有你已经处理了中断。

当您使用rte或rti等指令退出中断处理程序时,堆栈将再次从管理程序堆栈交换回用户堆栈。

您需要注意某些体系结构构建某些堆栈帧,它们几乎彼此不同。但是,通常情况下,您总会在堆栈上找到状态寄存器和程序计数器,但您可能并且可能会在堆栈(管理程序堆栈)上找到更多信息

程序计数器将是退出处理程序时将跳转到的返回地址。

答案 1 :(得分:0)

"附加"的一般方式中断处理程序通过处理器的调度表。该结构有多种名称,包括中断调度表。

您的操作系统需要获取中断处理程序例程的地址,并将其加载到调度表中的相应插槽中。表条目的格式取决于所使用的系统。

以下是有人经历这个过程的例子:

http://forum.osdev.org/viewtopic.php?f=1&t=17306