我想编写一个劫持实时时钟(中断8)的LKM(Linux内核模块).所以我希望将中断设置为我的函数,并在某些时候将其发送回旧函数.
我试图使用该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):);
我的所有尝试都是在分段故障的好时候结束,并且在内核崩溃的困难时期迫使我重新启动(幸运的是我使用虚拟机和快照).
那么我怎么能劫持实时中断所以它能完成我的工作呢?(然后将其发送回原始函数以执行.)
这是一些很好的代码来改变IDT上的pagefault函数.我无法使它工作,因为它也是为内核2.6编写的.这个问题也值得研究.
要获得赏金,请发布工作代码,或者至少提供足够的信息以使其运行.