是否使用mmap_sem调用了mmap回调?

问题描述

当我们在Linux内核模块中到达mmap的{​​{1}}的回调时,是否可以假设struct file_operations调用回调之前已经保存? 还是我们必须在执行vma->vm_mm->mm_sem之前显式调用down_write(&vma->vm_mm->mmap_sem)

解决方法

mmap文件操作处理程序应假定在调用mmap锁时已将其写锁。 mmap文件处理程序通过call_mmap()通过mmap_region()通过do_mmap()调用,并且以下注释出现在“ mm / mmap.c”中的do_mmap()函数之前:

/*
 * The caller must write-lock current->mm->mmap_lock.
 */

在Linux内核5.8中,mmap锁从mmap_sem重命名为mmap_lock。 5.7内核中的相应注释为:

/*
 * The caller must hold down_write(&current->mm->mmap_sem).
 */

do_mmap()通过do_mmap_pgoff()(在“ include / linux / mm.h”中)通过vm_mmap_pgoff()(在“ mm / util.c”中)通过ksys_mmap_pgoff()调用(在“ mm / mmap.c”中)通过mmap_pgoff()系统调用处理程序(在“ mm / mmap.c”中)。 (注:从内核5.9版开始,do_mmap_pgoff() is eliminateddo_mmap()直接从vm_mmap_pgoff()调用。)mmap锁写锁定在vm_mmap_pgoff()中。