一个页面错误可以发生在中断处理程序/原子上下文中吗?
是的。
处理程序或关键区域的代码可能跨越两个页面之间的边界。如果第二页不可用,则需要发生页面错误来将其带入。
不确定为什么没有人使用“双重错误”这个词:
http://en.wikipedia.org/wiki/Double_fault
但这是Intel手册中使用的术语:
http://software.intel.com/en-us/articles/introduction-to-pc-architecture/
或者在这里:
ftp://download.intel.com/design/processor/manuals/253668.pdf (请查看第6-38节)。
还有一种叫做三重故障的东西,它也可能发生在CPU试图处理双重错误时。
我认为答案是肯定的。 我刚刚检查了在x86_64平台上内核4.15中的页面错误处理程序代码。 以下是一个提示。 no_context是经典的'内核 oops'。
no_context(struct pt_regs *regs, unsigned long error_code,
unsigned long address, int signal, int si_code)
{
/* Are we prepared to handle this kernel fault? */
if (fixup_exception(regs, X86_TRAP_PF)) {
/*
* Any interrupt that takes a fault gets the fixup. This makes
* the below recursive fault logic only apply to a faults from
* task context.
*/
if (in_interrupt())
return;
mmap
作为数据源的情况下很常见。页面错误处理程序中有特定的代码来注意先前的IRQ状态。任何copy_from_user()
或copy_to_user()
都可能会出错。内核代码本身是固定的,因此只应发生数据异常或数据故障。 - artless noise