【发布时间】:2014-03-19 20:43:47
【问题描述】:
我想创建一个内核模块,当给定进程的 id 时,它可以查找其任务结构,然后查找其内存映射。当它发现它应该附加一个为特定页面集(即堆页面)提供页面错误的函数时。
【问题讨论】:
标签: linux memory-management linux-kernel linux-device-driver page-fault
我想创建一个内核模块,当给定进程的 id 时,它可以查找其任务结构,然后查找其内存映射。当它发现它应该附加一个为特定页面集(即堆页面)提供页面错误的函数时。
【问题讨论】:
标签: linux memory-management linux-kernel linux-device-driver page-fault
设置所需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 年)
【讨论】: