void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)
fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0);
=>int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, unsigned int flags)
return handle_pte_fault(mm, vma, address, pte, pmd, flags);
=>int handle_pte_fault(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, pte_t *pte, pmd_t *pmd, unsigned int flags)
entry = *pte;
if (!pte_present(entry))
if (pte_none(entry))
if (vma->vm_ops)
if (likely(vma->vm_ops->fault))
return do_linear_fault(mm, vma, address, pte, pmd, flags, entry);
=>int do_linear_fault(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, pte_t *page_table, pmd_t *pmd, unsigned int flags, pte_t orig_pte)
pgoff_t pgoff = (((address & PAGE_MASK) - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
pte_unmap(page_table);
return __do_fault(mm, vma, address, pmd, pgoff, flags, orig_pte);
=>int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, pmd_t *pmd, pgoff_t pgoff, unsigned int flags, pte_t orig_pte)
ret = vma->vm_ops->fault(vma, &vmf);
//struct vm_operations_struct generic_file_vm_ops = {
.fault = filemap_fault,
};
=>int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
linux页面缓存【笔记】
https://blog.csdn.net/xzongyuan/article/details/20369549
Linux内存映射(mmap)
http://www.cnblogs.com/lknlfy/archive/2012/04/27/2473804.html
Linux内核mmap机制
https://blog.csdn.net/ptonlix/article/details/79298575