C 在每个页面错误上获取一个信号

C 在每个页面错误上获取一个信号,c,linux,x86-64,C,Linux,X86 64,我想在我的应用程序中设置一个信号处理程序,以便内核在处理页面错误陷阱时发送一个信号。当然,我可以使用SIGSEGV信号处理程序,但我真正感兴趣的是捕获在写时复制时发生的页面错误。例如,在fork之后(后面不跟exec),如果原始进程试图写入某个页面,则会出现页面错误。我想得到关于此类页面错误的通知。如何实现这一点?页面错误是由do_page_fault()处理的中断 信号也会产生中断。不同之处在于页面错误中断被矢量化到代码中。对代码的作用有一个解释。在我看来,总是在中断处理程序中生成另一个中断是

我想在我的应用程序中设置一个信号处理程序,以便内核在处理页面错误陷阱时发送一个信号。当然,我可以使用
SIGSEGV
信号处理程序,但我真正感兴趣的是捕获在写时复制时发生的页面错误。例如,在fork之后(后面不跟exec),如果原始进程试图写入某个页面,则会出现页面错误。我想得到关于此类页面错误的通知。如何实现这一点?

页面错误是由do_page_fault()处理的中断

信号也会产生中断。不同之处在于页面错误中断被矢量化到代码中。对代码的作用有一个解释。在我看来,总是在中断处理程序中生成另一个中断是个坏主意


告诉我们:你想完成什么?不是你认为应该怎么做。

我怀疑你必须破解页面错误处理程序。非常非常小心,并始终保持可引导备份。如果在信号处理程序中出现页面错误,会发生什么情况?确切地说,双重错误在网球中很糟糕,但在内核中更糟糕。非分页池中的信号量可能会起作用,但对于类似的情况,我只会在非分页池中加入一个计数,并让驱动程序在轮询时返回它,(是的,Martin James只是建议轮询某些内容:)来自已删除答案的链接:。Andrea Arcangeli提供的用户空间页面错误处理补丁集可能使这成为可能。(但可能只有在用户空间中做更多工作的情况下才行。)
perf stat
/
perf record-e页面错误也可以计数/记录页面错误事件。因此,Linux进程无法知道页面错误何时发生?我想把导致每个页面错误的地址打印到stdout。有可能吗?没有。页面错误是另外一回事;这不是一个问题,它实际上是正常处理的一个预期功能:一个中断——操作系统被调用去做一些事情——而进程被阻止做任何事情——可能会持续几微秒。
http://www.stillhq.com/pdfdb/000446/data.pdf