1

我需要在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 回答 1

4

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

于 2013-04-25T10:48:14.543 回答