【问题标题】:Get a signal on each page fault在每个页面错误上获取信号
【发布时间】:2012-04-20 20:29:01
【问题描述】:

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

【问题讨论】:

  • 我怀疑您将不得不破解页面错误处理程序。要非常非常小心,并始终保留可启动的备份。
  • 如果在信号处理程序中出现页面错误会发生什么?
  • 完全正确 - 双错误在网球中很糟糕,但在内核中更糟糕。非分页池中的信号量可能会这样做,但是对于这样的事情,我只会在非分页池中增加一个计数,并在轮询时让驱动程序返回它,(是的,马丁詹姆斯只是建议轮询某事:)跨度>
  • 已删除答案的链接:lwn.net/Articles/550555。来自 Andrea Arcangeli 的用户空间页面错误处理补丁集可能使这成为可能。 (但也许只有你在用户空间做更多的工作?)。
  • perf stat / perf record -e page-faults 也可以统计/记录缺页事件。

标签: c linux x86-64


【解决方案1】:

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

http://www.stillhq.com/pdfdb/000446/data.pdf

信号也会产生中断。不同之处在于缺页中断被引导至代码。对代码的作用进行了解释。 IMO,总是在中断处理程序中生成另一个中断是一个坏主意。

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

【讨论】:

  • 那么,Linux 进程没有办法知道何时发生页面错误?我想将导致每个页面错误的地址打印到标准输出。这可能吗?
  • 没有。页面错误是另一回事。这不是问题,它确实是正常处理的预期功能:中断 - 操作系统被调用以执行某些操作 - 而进程坐在那里被阻止执行任何操作 - 可能会持续几微秒。
猜你喜欢
  • 2011-01-28
  • 2022-11-20
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2015-05-24
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多