在Linux内核中拦截异常处理程序的最佳做法是什么?

时间:2013-04-25 10:43:16

标签: c exception-handling linux-kernel intercept

我需要拦截Linux内核中页面错误的异常处理,但我不允许修改内核源代码并编译内核。我必须在内核模块中执行此操作。我现在有几种方法。


  1. 复制IDT表并替换页面错误的ISR。但是,我查看了内核的汇编代码,发现ISR调用了一些函数,这些函数的地址在模块的编译时无法确定。例如,callq *0x2b0a07(%rip) # ffffffff81620100 <pv_irq_ops+0x30>
  2. 使用kprobe / jprobe机制拦截do_page_fault,但并非所有内核都配置了启用kprobe。
  3. 用跳转指令替换do_page_fault的前几个字节,跳转到我的代码。但是,我需要在我的代码中使用do_page_fault后者。我必须将替换的指令放到另一个地方,但是x86代码的大小很难确定,如果其中一个被替换的指令是跳转的,事情会变得更复杂。
  4. 你们有什么想法解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

将IDT条目更改为指向您的处理程序。如果/需要,从那里调用原始处理程序。无需复制IDT或修补现有代码。