如果要remap_pfn_range
在实现mmap的自定义内核驱动程序中使用该函数,您就知道必须获取'mm信号量'.但目前尚不清楚如何通过我公开发现的例子来做到这一点.我认为编辑可用的示例会对社区有所帮助,我愿意这样做,但我不知道从哪里开始.
根据文档:只有在调用时保持mm信号量,这才是安全的.
它有助于查看[for remap_pfn_range
] 的实际来源.那是在mm
子目录中,特别是在mm/memory.c
在那里,你会看到struct mm_struct *mm = vma->vm_mm;
这样这就是mm
你想要的.注意也是[可能]current->mm
如果你再浏览一些文件[显然mm/mmap.c
],你会看到down_write(&mm->mmap_sem)
和up_write(&mm->mmap_sem)
[这是内核的信号量原语].请注意,如果您只需要从该区域读取,则有down_read
和up_read
所以,把它们放在一起:
void myfnc(...) { struct vm_area_struct *vma = ...; struct mm_struct *mm = vma->vm_mm; ... down_write(&mm->mmap_sem); remap_pfn_range(vma,...); up_write(&mm->mmap_sem); ... }
除了文档之外,找到这些东西的最好方法之一就是查看源代码本身.我已经写了20多年的Linux内核/驱动程序代码了,当我需要找到一些我不知道的东西时,我就是这么做的.