【问题标题】:What is triggering an 0x08 interrupt?什么触发了 0x08 中断?
【发布时间】:2013-12-19 17:53:14
【问题描述】:

我试图劫持定时器中断。一位同事告诉我,IDT(Interrupt Descriptor Table)上的中断0x08就是定时器。诅咒我检查并看到两个可能的答案:this 说 8 是 real clock timer 和 this 说这是 Double Fault 中断 - 我决定相信他,而不是浪费时间进一步检查。在终于控制了 IDT 并替换了中断 8 之后,什么都没有发生。

  • 那么发生了什么?
  • 此中断是否随着时间的推移从定时器更改为双重故障?
  • 此中断在 ARM/Intel/etc. 上是否有不同的用途?

我的代码是一个内核模块,它劫持中断 8 并在每次中断到达时简单地执行printk 命令。我运行了大约 25 分钟 - dmesg 没有输出。

以防万一:我在 VM 上运行带有内核 3.8 的 Linux Mint。主机有 Intel i5。

【问题讨论】:

  • 内核不是已经在使用它来进行进程调度了吗?
  • 可能 - 我现在期待内核崩溃,然后从我的函数调用原始函数(代理原始处理程序)。但现在似乎什么都没有发生。
  • @roe:在大多数现代内核上,APIC timer 用于此目的。更加灵活和精确,而且它是针对每个 CPU 而不是全局的。
  • @duskwuff,看​​,这就是我做内核调度工作已经有多久了... :) 我太老了 ;)

标签: c timer linux-kernel x86-64


【解决方案1】:

你可以使用这个命令找到定时器的中断:cat /proc/interrupt

以下是 6 核机器上的示例输出:

cat /proc/interrupts | egrep "timer|rtc"
   0:  320745126          0          0          0          0          0   IO-APIC-edge      timer
   8:          1          0          0          0          0          0   IO-APIC-edge      rtc0
 LOC:  115447297  304097630  194770704  212244137   63864376   69243268   Local timer interrupts

注意,timer 和 rtc 是不同的。到目前为止,也只有一个 rtc 中断。 (很多定时器中断)。以下是正常运行时间输出。

 uptime
 14:14:20 up 13 days,  3:58,  9 users,  load average: 0.47, 1.68, 1.38

我认为你应该在破解 IDT 之前检查一下。此外,您可能想破解中断 0,而不是 8。

【讨论】:

    【解决方案2】:

    您找到了同一个 IRQ 的两个描述,因为在保护模式下,地址范围 0x0 - 0x1F 保留给内部 CPU 中断使用。

    您必须在没有冲突的情况下将 IRQ 重新映射到另一个地址空间,在本文中您可以找到它的解释以及所需的所有源代码:

    https://alfaexploit.com/readArticle/416

    【讨论】:

      猜你喜欢
      • 2017-04-09
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 2019-12-16
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多