Linux kernel 是否使用mmap_sem调用mmap回调?
当我们在Linux内核模块中访问Linux kernel 是否使用mmap_sem调用mmap回调?,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,当我们在Linux内核模块中访问struct file_operations的mmap回调时,我们是否可以假设在调用回调之前,vma->vm_mm->mm_sem已被保持? 或者,在执行重新映射pfn\u范围之前,我们是否必须显式地调用down\u write(&vma->vm\u mm->mmap\u sem)?mmap文件操作处理程序应该假设mmap锁在被调用时已经被写锁定。mmap文件处理程序是通过call_mmap()通过mmap_region()通过do_mmap()调用的,下面的注释
struct file_operations
的mmap
回调时,我们是否可以假设在调用回调之前,vma->vm_mm->mm_sem
已被保持?
或者,在执行
重新映射pfn\u范围之前,我们是否必须显式地调用down\u write(&vma->vm\u mm->mmap\u sem)
?mmap
文件操作处理程序应该假设mmap锁在被调用时已经被写锁定。mmap
文件处理程序是通过call_mmap()
通过mmap_region()
通过do_mmap()
调用的,下面的注释出现在“mm/mmap.c”中的do_mmap()
函数之前:
注意:在Linux内核5.8中,mmap锁已从mmap\u sem
重命名为mmap\u 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()
系统调用处理程序调用。(注意:从内核版本5.9开始,do_mmap()
直接从vm_mmap_pgoff()
调用)mmap锁在vm_mmap_pgoff()
中被写锁定,我们在vm_mmap_pgoff
函数中保持锁。@soham很好的观点。我会在回答中提到这一点。
/*
* The caller must hold down_write(¤t->mm->mmap_sem).
*/