用户定义的页面错误和异常处理程序

时间:2011-05-05 14:55:43

标签: linux-kernel

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

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

如果有人可以帮助我理解这一点或指出好的参考资料,那将会很棒。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

如果您不想改变内核处理这些错误的方式并且之前只添加您的错误,那么kprobes将为您的目的服务。它们有点难以处理,因为你在包含寄存器和堆栈的结构中获得探测函数的参数,你必须知道,编译器在哪里确切地放置它们。但是,如果您需要特定功能(在创建探针时已知),那么您可以使用jprobeshere是一个很好的示例,如何使用两者),这需要完全探测的功能探测一个相同的参数(因此寄存器/堆栈中没有错位)。

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

答案 2 :(得分:0)

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

其次,想象它不会是一个问题,但是为了在用户空间中编写页面错误处理程序,你应该能够捕获一个错误,默认情况下是一个强制转移到内核空间,所以至少你应该防止这发生了。

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

答案 3 :(得分:0)

您希望可以使用gnu libsegsev安装用户级寻呼机。我没有用它,但它似乎正是你正在寻找的。

相关问题