在哪里可以找到 vma->fault()?
Where to find vma->fault()?
我知道 vma->fault()
会接受两个参数,即 vma
和 vmf
。但是我不确定 vma->fault()
会在内部做什么,因为我找不到在 vm_area_struct->vm_ops->fault()
.
中讨论该字段初始化的代码或文档
如果我没理解错的话,您正在寻找实现 vma->fault()
,它正在 __do_fault() 函数中的 mm/memory.c
中执行:
ret = vma->vm_ops->fault(vma, &vmf);
TL;DR
简短回答:special_mapping_fault() 函数设置为 .fault
回调。
说来话长
当试图找到这样的东西时,不应低估简单的 Unix 工具的功能,例如 grep
。知道.fault
回调属于内存管理,我们知道应该查看mm/
目录。所以这里是答案:
$ grep -sIrHn '\.fault = ' mm/*
接下来的输出是:
mm/hugetlb.c:2594: .fault = hugetlb_vm_op_fault,
mm/mmap.c:3001: .fault = special_mapping_fault,
mm/mmap.c:3007: .fault = special_mapping_fault,
进一步调查我们可以发现 mm/hugetlb.c
是 HugeTLB FS 实现的一部分,因此与您的情况无关。
对于其他两种情况,您可以看到 special_mapping_fault()
函数用作 .fault
回调。
我知道 vma->fault()
会接受两个参数,即 vma
和 vmf
。但是我不确定 vma->fault()
会在内部做什么,因为我找不到在 vm_area_struct->vm_ops->fault()
.
如果我没理解错的话,您正在寻找实现 vma->fault()
,它正在 __do_fault() 函数中的 mm/memory.c
中执行:
ret = vma->vm_ops->fault(vma, &vmf);
TL;DR
简短回答:special_mapping_fault() 函数设置为 .fault
回调。
说来话长
当试图找到这样的东西时,不应低估简单的 Unix 工具的功能,例如 grep
。知道.fault
回调属于内存管理,我们知道应该查看mm/
目录。所以这里是答案:
$ grep -sIrHn '\.fault = ' mm/*
接下来的输出是:
mm/hugetlb.c:2594: .fault = hugetlb_vm_op_fault,
mm/mmap.c:3001: .fault = special_mapping_fault,
mm/mmap.c:3007: .fault = special_mapping_fault,
进一步调查我们可以发现 mm/hugetlb.c
是 HugeTLB FS 实现的一部分,因此与您的情况无关。
对于其他两种情况,您可以看到 special_mapping_fault()
函数用作 .fault
回调。