如何解决是否使用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(¤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()
中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。