本文共 1715 字,大约阅读时间需要 5 分钟。
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/20369549Linux内存映射(mmap)
http://www.cnblogs.com/lknlfy/archive/2012/04/27/2473804.htmlLinux内核mmap机制
https://blog.csdn.net/ptonlix/article/details/79298575由mmap引发的SIGBUS
https://blog.csdn.net/ctthuangcheng/article/details/8916015