Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux内核中拦截异常处理程序的最佳实践是什么_C_Exception Handling_Linux Kernel_Intercept - Fatal编程技术网

C 在Linux内核中拦截异常处理程序的最佳实践是什么

C 在Linux内核中拦截异常处理程序的最佳实践是什么,c,exception-handling,linux-kernel,intercept,C,Exception Handling,Linux Kernel,Intercept,我需要截获Linux内核中页面错误的异常处理,但不允许修改内核源代码和编译内核。我必须在内核模块中执行此操作。我现在有几种方法 复制IDT表并替换页面错误的ISR。然而,我查看了内核的汇编代码,发现ISR调用了一些在模块编译时无法确定地址的函数。例如,callq*0x2b0a07(%rip)#ffffffff81620100 使用kprobe/jprobe机制拦截do\u page\u故障,但并非所有内核都配置为启用kprobe 用跳转到我的代码的跳转指令替换do_page_fault的前几个

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


  • 复制IDT表并替换页面错误的ISR。然而,我查看了内核的汇编代码,发现ISR调用了一些在模块编译时无法确定地址的函数。例如,
    callq*0x2b0a07(%rip)#ffffffff81620100
  • 使用kprobe/jprobe机制拦截
    do\u page\u故障
    ,但并非所有内核都配置为启用kprobe
  • 用跳转到我的代码的跳转指令替换
    do_page_fault
    的前几个字节。但是,我需要在代码中使用
    do\u page\u fault
    后者。我不得不将替换的指令放到另一个地方,但是x86代码的大小很难确定,如果替换的指令中有一条是jump,事情会变得更复杂

  • 你们有什么办法解决这个问题吗?

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

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

    您的回答启发了我。这种方法有一个小问题:陷阱帧和错误代码必须被推送和弹出两次。这将稍微降低性能。如果没有其他优雅的方法,这应该是我的选择。我不想在例外情况下使用异常。即使你只需要检查一次陷阱代码,它们也不便宜。@AlexeyFrunze你有没有碰巧参考过这样做的代码?你的回答启发了我。这种方法有一个小问题:陷阱帧和错误代码必须被推送和弹出两次。这将稍微降低性能。如果没有其他优雅的方法,这应该是我的选择。我不想在例外情况下使用异常。即使您只需检查一次陷阱代码,它们也不便宜。@AlexeyFrunze您是否有机会参考执行此操作的代码?