【问题标题】:where is hardware timer interrupt?硬件定时器中断在哪里?
【发布时间】:2013-01-23 13:36:00
【问题描述】:

这是异常和中断表(我理解为 IDT) 摘自《英特尔架构软件开发人员手册》

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

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

【问题讨论】:

    标签: linux operating-system kernel interrupt


    【解决方案1】:

    嗯,是的,如果我们谈论的是传统的 8254 PIT 计时器,它位于 IRQ0,也就是向量 32。但在现代机器上的 Linux 操作系统中,它通常不用作计时器。 [请注意,32 的向量分配确实非常随意。它是在对 8259 (PIC) 或 APIC 进行编程时设置的——但这不是一个糟糕的选择,因为 32 是保留向量之后的第一个向量。这肯定比将硬件中断与异常向量混合更好,因为 DOS 会这样做 - 因此无法从 INTR 5(也是向量 13,因为 INT0 已映射)告诉通用保护故障(上表中的向量 13)到向量 8,并且 5 + 8 = 13)。从记忆中看,INTR5 的使用并不是特别好——比如 LPT2:(第二个并行端口)。但是不要重叠它们仍然是一个好主意......因此,向量 20 到 31 的“保留”。

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

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

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

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

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

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

    【讨论】:

    • 谢谢!这是非常有帮助的答案!顺便问一下,你知道屏蔽 NMI 中断的 x86 指令“POP SS”吗?英特尔手册说这条指令会屏蔽 NMI 中断,直到下一条指令完成以保证顺序的“POP SS;MOV ESP,EBP”的东西......这可以用来防止你的代码被调试器调试,因为单步异常将被阻止.我想知道更多关于“POP SS”如何阻止调试过程的细节,但这就是我所知道的。如果您对此有更多了解,请告诉我。谢谢
    • 我认为这是一种非常无用的防止调试方法 - 因为 POP SS 只会阻止下一条指令被调试,并且只有在堆栈上有一个有效的 SS 值时才能使用它pop ...因此您的代码将充满不必要的 PUSH SS 和 POP SS - 真正想要调试代码的人只会搜索并替换 17 并将其替换为 90 [使用一些逻辑来避免替换 MOV $0 x17,当然是 EAX]。
    • 我同意代码最终会被调试。但如果代码是多态的,在运行时(在未知点)生成令人不安的代码,我认为调试起来会困难得多。
    • 这里似乎缺少一些东西,我认为这是一个与原始问题不同的问题......也许你想把它作为一个“新问题”发布[带有这个问题的链接,如果你觉得有道理]
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 2023-01-03
      • 1970-01-01
      相关资源
      最近更新 更多