【问题标题】:How can I use the vm_operations struct to intercept page faults to a particular set of pages?如何使用 vm_operations 结构来拦截特定页面集的页面错误?
【发布时间】:2014-03-19 20:43:47
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    设置所需VMA的vma->vm_ops->fault。如果您将破解堆分配器并将mmaps 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 处理程序,而 was replaced with fault() handler 在 2007 年)

    【讨论】:

    • 感谢您的回答!是否有此方法的完整文档以及应实施哪些步骤才能获得正确的工作功能?例如,在某些实现中,我看到调用 get_page(page) 来增加引用计数。那么,是否有完整的要求列表来避免错误?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多