中断上下文中的页面错误

在中断处理程序/primefaces上下文中是否可以发生页面错误?

它可以,但这将是一场灾难。 🙂

是。

处理程序或关键区域的代码可以跨越两页之间的边界。 如果第二页不可用,则需要页面错误来引入它。

(这是一个古老的问题,现有的答案含有正确的事实,但却很薄弱,我将试图以更实质的方式回答。

这个问题的答案取决于代码是在内核(管理员模式)还是在用户模式下。 原因是这些地区的内存访问规则通常是不同的。 下面是一个简短的事件序列来说明问题(假设内核可以被分页):

  1. 当用户程序正在执行时,发生中断(例如按键/磁盘事件)。
  2. CPU转换到管理员模式并开始在内核中执行处理程序。
  3. 中断处理程序开始保存CPU状态(以便用户进程可以在以后正确地恢复),但是这样做会触及其先前已被分页的一些存储。
  4. 这会触发页面错误异常。
  5. 为了处理页面错误异常,内核现在必须保存经历了页面未命中的代码的CPU状态。
  6. 如果它有一个永远不会被分页的预分配的内存池,它实际上可以做到这一点,但这样一个池将不可避免地受到限制。

所以你看,最安全(最简单)的解决方案是让内核确保内核拥有的内存根本不可调整。 出于这个原因,页面错误不应该在内核中发生。 他们可能会发生,但作为@adobriyan笔记,这通常表示一个更大的错误比简单的需要在一些内存中的页面。 (我相信这是Linux的情况,请检查您的特定操作系统,以确定内核内存是否不可修改,操作系统体系结构确实不同。

所以总而言之,内核内存通常是不可检测的,并且由于中断通常在内核中处理,所以在服务中断时通常不应该发生页面错误。 较高优先级的中断仍然可以中断较低的中断。 只是把他们所有的资源都留在物理记忆中。

关于原子语境的问题不太清楚。 如果是由硬件支持的原子操作,那么在操作的部分完成中不会发生中断。 如果你指的是某个关键部分,那么记住关键部分只是模仿原子性。 从硬件的角度来看,除了进入和退出代码之外,这种代码没有什么特别之处,它们可以使用真正的硬件原子操作。 中间的代码是正常的代码,并可能被中断。

我希望这能对这个问题提供一个有用的回应,因为我也想了一会儿这个问题。

不知道为什么没有人使用“双重故障”这个词:

http://en.wikipedia.org/wiki/Double_fault

但这是英特尔手册中使用的术语:

http://software.intel.com/en-us/articles/introduction-to-pc-architecture/

或在这里:

ftp://download.intel.com/design/processor/manuals/253668.pdf (请参阅第6-38节)。

还有一种叫做三重故障的东西,正如名称所示,当CPU正在尝试处理双重故障错误时也可能发生。