求LINUX内核程序注释,并从功能的角度说明其用途(2)
do_page_fault(struct pt_regs *regs, unsigned long error_code)
{
     struct vm_area_struct *vma;
     struct task_struct *tsk;
     unsigned long address;
     struct mm_struct *mm;
     int write;
     int fault;
     tsk = current;
     mm = tsk->mm;
     /* Get the faulting address: */
     address = read_cr2();
     ………………
    if (unlikely(fault_in_kernel_space(address))) {
         if (!(error_code & (PF_RSVD | PF_USER | PF_PROT))) {
             if (vmalloc_fault(address) >= 0)
                 return;
             if (kmemcheck_fault(regs, address, error_code))
                 return;
        }
         …………………
          /* Don't take the mm semaphore here. If we fixup a prefetch
          * fault we could otherwise deadlock:
          */
         bad_area_nosemaphore(regs, error_code, address);
         return;
     }
     ………………..
     if (user_mode_vm(regs)) {
         local_irq_enable();
         error_code |= PF_USER;
     } else {
         if (regs->flags & X86_EFLAGS_IF)
             local_irq_enable();
     }
     if (unlikely(error_code & PF_RSVD))
         pgtable_bad(regs, error_code, address);
     perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, 0, regs, address);
     /*
      * If we're in an interrupt, have no user context or are running
      * in an atomic region then we must not take the fault:
      */
     if (unlikely(in_atomic() || !mm)) {
         bad_area_nosemaphore(regs, error_code, address);
         return;
      }
      ………………………
}  //end of do_page_fault()
------解决方案--------------------
一不小心溜过来了,太高深了。。帮顶一下!