是否保留了 mmap_sem 调用的 mmap 回调?
Is mmap callback called with mmap_sem held?
当我们到达 Linux 内核模块中 struct file_operations
的 mmap
的回调时,我们是否可以假设 vma->vm_mm->mm_sem
在回调之前已经保持调用?
或者我们是否必须在执行 remap_pfn_range
之前显式调用 down_write(&vma->vm_mm->mmap_sem)
?
mmap
文件操作处理程序在调用时应假定 mmap 锁已经 write-locked。 mmap
文件处理程序被调用 via call_mmap()
via mmap_region()
via do_mmap()
,下面的注释出现在“mm/mmap 中的 do_mmap()
函数之前。 c":
/*
* The caller must write-lock current->mm->mmap_lock.
*/
N.B。 mmap 锁在 Linux 内核 5.8 中从 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”中)。 (N.B。从内核版本5.9开始,do_mmap_pgoff()
is eliminated和do_mmap()
直接从vm_mmap_pgoff()
调用。)mmap锁是write-locked in vm_mmap_pgoff()
.
当我们到达 Linux 内核模块中 struct file_operations
的 mmap
的回调时,我们是否可以假设 vma->vm_mm->mm_sem
在回调之前已经保持调用?
或者我们是否必须在执行 remap_pfn_range
之前显式调用 down_write(&vma->vm_mm->mmap_sem)
?
mmap
文件操作处理程序在调用时应假定 mmap 锁已经 write-locked。 mmap
文件处理程序被调用 via call_mmap()
via mmap_region()
via do_mmap()
,下面的注释出现在“mm/mmap 中的 do_mmap()
函数之前。 c":
/*
* The caller must write-lock current->mm->mmap_lock.
*/
N.B。 mmap 锁在 Linux 内核 5.8 中从 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”中)。 (N.B。从内核版本5.9开始,do_mmap_pgoff()
is eliminated和do_mmap()
直接从vm_mmap_pgoff()
调用。)mmap锁是write-locked in vm_mmap_pgoff()
.