Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用vm_operations结构截取特定页面集的页面错误?_Linux_Memory Management_Linux Kernel_Linux Device Driver_Page Fault - Fatal编程技术网

Linux 如何使用vm_operations结构截取特定页面集的页面错误?

Linux 如何使用vm_operations结构截取特定页面集的页面错误?,linux,memory-management,linux-kernel,linux-device-driver,page-fault,Linux,Memory Management,Linux Kernel,Linux Device Driver,Page Fault,我想创建一个内核模块,当给定进程的id时,它可以查找其任务结构,然后查找其内存映射。当它发现它应该附加一个函数,该函数将为一组特定的页面(即堆页面)提供页面错误。设置所需vma的vma->vm_ops->fault。如果您侵入堆分配器并用您的专用设备的mmaps mmap\u ANONYMOUS替换mmap,这会更容易 代码相关: 一些文档:“fault()”-[由corbet于2007年7月23日发布],LWN 您还可以查看LDD手册第15章:(有点过时,它使用了nopagehandler,2

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

设置所需vma的
vma->vm_ops->fault
。如果您侵入堆分配器并用您的专用设备的
mmap
s mmap\u ANONYMOUS替换
mmap
,这会更容易

代码相关:

一些文档:“fault()”-[由corbet于2007年7月23日发布],LWN


您还可以查看LDD手册第15章:(有点过时,它使用了
nopage
handler,2007年的版本)

谢谢您的回答!是否有此方法的完整文档,以及应执行哪些步骤以获得正确的工作功能?例如,在一些实现中,我看到一个调用get_page(page)来增加ref计数。那么,是否有一个避免bug的完整需求列表?谢谢
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         }