【问题标题】:user defined page fault and exception handlers用户定义的页面错误和异常处理程序
【发布时间】:2011-08-19 11:32:21
【问题描述】:

我正在尝试了解我们是否可以在 内核 / 用户模式中添加我们的页面错误处理程序 / 异常处理程序 并在将控制权交还给内核之前处理我们引起的错误。 这里的任务不会修改现有的内核代码(do_page_fault fn),而是添加一个用户定义的处理程序,当页面错误或异常被触发时将被查找

人们可以找到像“kprobe”这样的工具,它们在指令中提供挂钩,但看起来这不符合我的目的。

如果有人可以帮助我理解这一点或指出好的参考资料,那就太好了。

【问题讨论】:

    标签: linux-kernel


    【解决方案1】:

    我认为这是不可能的——首先,页面错误处理程序是一个复杂的函数,需要直接访问虚拟内存子系统结构。

    其次,假设这不是问题,但是为了在用户空间中编写页面错误处理程序,您应该能够捕获默认情况下强制转移到内核空间的错误,因此至少您应该防止这会发生。

    为此,您需要一个主管来跟踪所有内存访问,但您不能保证主管代码已经映射并存在于内存中。

    【讨论】:

      【解决方案2】:

      如果您不改变内核处理这些错误的方式并在之前添加您的错误,那么kprobes 将达到您的目的。它们有点难以处理,因为您在包含寄存器和堆栈的结构中获得探测函数的参数,并且您必须知道编译器将它们中的每一个放在哪里。但是,如果您需要它用于特定功能(在创建探测器期间已知),那么您可以使用jprobeshere 是一个很好的例子,说明如何使用两者),这需要使用与探测完全相同的参数进行探测的函数一个(因此不会在寄存器/堆栈中进行修改)。

      您可以动态加载内核模块并在所选函数上安装jprobes,而无需修改内核。

      【讨论】:

        【解决方案3】:

        您可以使用gnu libsegsev 安装用户级寻呼机。我没用过,但它似乎正是你要找的。​​p>

        【讨论】:

          【解决方案4】:

          从用户空间,您可以为 SIGSEGV 定义一个信号处理程序,因此每当进行无效的内存访问时都会调用您自己的函数。当与mprotect() 结合使用时,这让程序可以管理自己的虚拟内存,所有这些都来自用户空间。

          但是,我的印象是您正在寻找一种方法来拦截 所有 页面错误(主要、次要和无效)并调用任意 内核 函数作为回应。我不知道这样做的干净方法。当我在自己的研究项目中需要此功能时,我最终将代码添加到do_page_fault()。它对我来说很好,但它是一个黑客。如果有人知道一种干净的方法来做到这一点,我会非常感兴趣(即,可以由 vanilla 内核上的模块使用)。

          【讨论】:

          • 嗯,我认为可以通过替换IDT中的page_fault处理程序来实现。除此之外,这里允许进行代码拼接,但这是一个非常肮脏的 hack ;)
          猜你喜欢
          • 2018-10-23
          • 2013-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-08
          • 2014-05-28
          • 2013-11-19
          • 1970-01-01
          相关资源
          最近更新 更多