do_page_fault()是处理缺页异常的入口,一直感兴趣这是怎样被调用到的。今天在handle_mm_fault()里面加了一个BUG()专门看调用栈,发现并不复杂。
既然是缺页,肯定是发端于预取数据异常,是由中断发起的。这要追溯到entry-armv.S里对预取数据中断的处理,最终会调用到do_PrefetchAbort(),这个函数在arch/arm/mm/fault.c里定义,在其中通过钩子的形式直接就调了do_page_fault():
if (!inf->fn(addr, ifsr | FSR_LNX_PF, regs))return;