我正试图劫持定时器中断。一位同事告诉我,IDT(中断描述符表)上的中断0x08是定时器。我检查了一些诅咒并看到了两个可能的答案:this表示8是real clock timer
而this表示它是Double Fault
中断 - 我决定相信他而不是浪费时间进一步检查。在最终控制IDT并替换中断8之后,没有任何事情发生。
我的代码是一个内核模块,它劫持中断8,并在每次中断到达时简单地执行printk
命令。我跑了大约25分钟 - dmesg
没有输出。
如果重要:我在VM上运行带有内核3.8的Linux Mint。主机有Intel i5。
答案 0 :(得分: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
注意,计时器和rtc是不同的。到目前为止,只有一个rtc中断。 (很多计时器中断)。以下是正常运行时间输出。
uptime
14:14:20 up 13 days, 3:58, 9 users, load average: 0.47, 1.68, 1.38
我认为你应该在攻击IDT之前检查一下。此外,您可能想要破解中断0,而不是8。
答案 1 :(得分:0)
您发现了同一IRQ的两个描述,因为在保护模式下,地址范围0x0-0x1F保留供内部CPU中断使用。
您必须将IRQ重新映射到另一个地址空间而不会发生冲突,在本文中,您可以找到它的解释以及所需的所有源代码: