问题描述
当我们在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(¤t->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 eliminated和do_mmap()
直接从vm_mmap_pgoff()
调用。)mmap锁写锁定在vm_mmap_pgoff()
中。