我理解vma->fault()
将采用vma
和vmf
两个参数。但我不确定vma->fault()
内部会做什么,因为我无法在vm_area_struct->vm_ops->fault()
找到有关此字段初始化的代码或文档。
答案 0 :(得分:0)
如果我理解正确,您正在寻找实施vma->fault()
,该实施正在__do_fault()函数mm/memory.c
中执行:
ret = vma->vm_ops->fault(vma, &vmf);
简答: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
回调。