硬件定时器中断在哪里?

时间:2013-01-23 13:36:01

标签: linux operating-system kernel interrupt

这是Exceptions and Interrupts表(我理解为IDT) 来自“英特尔架构软件开发人员手册”

Exceptions and Interrupts

定时器中断在哪里使上下文切换成为可能? (用于多任务处理)

如果这是一个愚蠢的问题,请修正我的理解。 提前谢谢你

3 个答案:

答案 0 :(得分:10)

嗯,是的,如果我们谈论的是传统的8254 PIT计时器,那就是IRQ0,它是向量32.但是在现代机器上,它通常不被用作Linux操作系统中的计时器。 [注意,32的向量分配实际上非常随意。它是在编程8259(PIC)或APIC时设置的 - 但这不是一个糟糕的选择,因为32是保留的第一个矢量。它肯定比将硬件中断与异常向量混合更好,就像DOS那样 - 所以没有办法从INTR 5(也是向量13,因为INT0被映射)告诉一般保护错误(上表中的向量13)到向量8,并且5 + 8 = 13)。从内存来看,INTR5并没有特别好用 - 比如LPT2 :(第二个并行端口)。但是不重叠它们仍然是一个好主意...... Henc为向量20到31的“保留”。

实际控制系统时序的IRQ很可能是本地APIC计时器,并且它的矢量不像原始PC那样在硬件中固定。

此外,随着“消息信号中断”的出现,完全可能拥有(多)256个以上的中断向量。

我不同意措辞“向量0-19是不可屏蔽的中断”。除了NMI(向量2)之外,它们都是EXCEPTIONS(也就是TRAPS或FAULTS) - 也就是说,由系统中的某些错误条件驱动的事件 - 向量零是整数除以零的结果,向量1是“单步“指令中断[和其他一些”调试“陷阱,例如”写入与启用的调试寄存器匹配的任何地址“],向量3是”int3“指令(操作码0xcc)的结果,向量4是执行“INTO”的结果(在溢出时为'o',而在零中为0)。当访问未在页表中标记为存在的一块存储器时,使用向量14。它们确实是“不可屏蔽的”,但除了少数例外,它们是当时执行指令的直接后果 - 因此它们与程序本身同步。

例外是“双重故障”异常和“机器检查故障”。

双重故障是指处理器在处理另一个异常期间检测到故障时 - 通常是因为操作系统已经完成了某些操作,比如将堆栈设置为无效,从而导致页面错误,尝试使用堆栈存储页面错误返回地址,但由于无法访问堆栈而失败。因此,双故障处理程序往往被设置为“任务切换中断”,并加载新的堆栈以确保双故障可以继续。如果双故障处理程序无法正常运行,则处理器将“三故障”。这通常意味着在PC平台上“重启”。双重故障通常是无法恢复的 - 处理程序将(尝试)提供有关发生的事情以及它如何进入此状态的一些信息,但一旦完成,系统要么重新启动,要么等待有人来按下重置按钮。

机器检查故障是处理器检测到不可恢复的错误的地方 - 例如不可恢复的内存错误或缓存奇偶校验错误等。这些通常也是不可恢复的,但不是直接与正在执行的指令耦合,而是更多的不同事件的组合(内存读取内存内容变坏或类似的地址)。

答案 1 :(得分:4)

硬件定时器中断的中断向量是IRQ 0 = INT 32,因为它是外部中断。

0-19是不可屏蔽的中断,Intel应保留20-31,外部中断(IRQ)为32-127。硬件时间需要连接为IRQ 0,因此这里的向量编号应为32。

答案 2 :(得分:0)

Bit       Disable IRQ            Function
7          IRQ7             Parallel Port
6          IRQ6             Floppy Disk Controller
5          IRQ5             Reserved/Sound Card
4          IRQ4             Serial Port
3          IRQ3             Serial Port
2          IRQ2             PIC2
1          IRQ1             Keyboard
0          IRQ0             System Timer

阅读hardware interrupts以了解更多信息。