如何使用vm_operations结构来拦截特定页面的页面错误?

时间:2014-03-19 20:43:48

标签: linux memory-management linux-kernel linux-device-driver page-fault

我想创建一个内核模块,当给定一个进程的id时,可以查找其任务结构,然后查找其内存映射。当它发现它应该附加一个将页面错误提供给特定页面集(即堆页面)的函数时。

1 个答案:

答案 0 :(得分:1)

设置所需VMA的vma->vm_ops->fault。如果您攻击堆分配器并将mmap的MMAP_ANONYMOUS替换为您的特殊设备的mmap,则会更容易。

相关代码:http://lxr.free-electrons.com/source/mm/memory.c?v=3.12#L3676

3689 static int handle_pte_fault(struct mm_struct *mm,
3690                      struct vm_area_struct *vma, unsigned long address,
3691                      pte_t *pte, pmd_t *pmd, unsigned int flags)
3692 {
3693         pte_t entry;
3694         spinlock_t *ptl;
3695 
3696         entry = *pte;
3697         if (!pte_present(entry)) {
3698                 if (pte_none(entry)) {
3699                         if (vma->vm_ops) {
3700                                 if (likely(vma->vm_ops->fault))  /* HERE */
3701                                         return do_linear_fault(mm, vma, address,
3702                                                 pte, pmd, flags, entry);
3703                         }
3704                         return do_anonymous_page(mm, vma, address,
3705                                                  pte, pmd, flags);
3706                 }
3707                 if (pte_file(entry))
3708                         return do_nonlinear_fault(mm, vma, address,
3709                                         pte, pmd, flags, entry);
3710                 return do_swap_page(mm, vma, address,
3711                                         pte, pmd, flags, entry);
3712         }

一些文档:https://lwn.net/Articles/242625/" fault()" - [2007年7月23日由corbet发表],LWN

你也可以查看LDD书,第15章:http://lwn.net/images/pdf/LDD3/ch15.pdf(有点过时,它使用了nopage hanlder,was replaced with fault() handler在2007年)