在哪里可以找到 vma->fault()?

Where to find vma->fault()?

我知道 vma->fault() 会接受两个参数,即 vmavmf。但是我不确定 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 回调。