在访问内核地址空间时,缺页异常可能被各种条件出发,如下所述:
- 内核本身的程序设计错误导致访问不正确的地址,这个在稳定版本中永远不会发生,在开发版本中偶尔会发生
- 内核通过用户空间传递的参数访问了无效地址
- 访问使用vmalloc分配的区域,触发缺页异常
前两种情况是真正的错误,内核必须使用最后的手段---异常修正(exception fixup)机制来进行处理
vmalloc的情况是导致缺页异常的合理情况,必须加以校正。直至对应的缺页异常发生之前,vmalloc区域中的修改都不会传输到进程的页表中。因此在对vmalloc异常进行处理时,必须从主页表复制适当的访问权限信息到进程的页表中。