日期:2014-05-16  浏览次数:20709 次

求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()


------解决方案--------------------
一不小心溜过来了,太高深了。。帮顶一下!