我想编写一个Linux内核模块(LKM),以劫持实时时钟(中断8)。因此,我希望将中断设置为我的函数,并在某个时刻将其发送回旧函数。
我尝试使用request_irq
函数,但没有成功,可能是因为内核函数不愿共享中断(我猜这是一个好的决定)。
我还尝试编辑中断描述表(IDT),根据我找到的一些页面。它们都不能正常工作,大多数甚至不能编译,因为它们是针对2.6内核编写的,而我正在使用3.10。
这是一个简化的代码,只是为了让您了解我的做法。
kpage =__get_free_page( GFP_KERNEL);
asm("sidt %0": : "m"(*idtr) : );
memcpy(kpage, idtr, 256*sizeof(kpage));
newidt = (unsigned long long *)(*(unsigned long*)(idtr+1));
newidt[8] = &my_function;
asm("lidt %0": "=m"(newidt):);
我的所有尝试要么以Segmentation fault(分段错误)的好结果告终,要么在内核崩溃的坏情况下强制我重新启动电脑(幸运的是我使用虚拟机和快照)。
那么我该如何劫持实时中断以执行自己的代码?(然后将其发送回原始函数以执行。)
这里 有一些很好的代码可以更改IDT上的pagefault函数。由于它也是针对2.6内核编写的,所以我无法使其正常工作。这个问题也值得关注。
为了获得悬赏,请发布可行的代码,或者至少提供足够的信息来运行它。