我需要在Linux内核中拦截页面错误的异常处理,但是我不允许修改内核源和编译内核。我必须在内核模块中执行此操作。我现在有几种方法。
- 复制IDT表并替换缺页的ISR。但是,我查看了内核的汇编代码,发现ISR调用了一些在模块编译时无法确定地址的函数。例如,
callq *0x2b0a07(%rip) # ffffffff81620100 <pv_irq_ops+0x30>
。 - 使用 kprobe/jprobe 机制进行拦截
do_page_fault
,但并非所有内核都配置了启用 kprobe。 do_page_fault
用跳转到我的代码的跳转指令替换前几个字节。但是,我需要do_page_fault
在我的代码中使用后者。我必须将替换的指令放到另一个地方,但是 x86 代码的大小很难确定,如果替换的指令之一是跳转,事情会变得更加复杂。
你们有解决问题的想法吗?