慢慢欣赏linux文件缓冲区 mmap分析

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

猜你喜欢

转载自blog.csdn.net/shipinsky/article/details/89766215
今日推荐