如果要在实现mmap的自定义内核驱动程序中使用$(document).ready(function () {
var loader = ROOT + '/images/loader.gif")';
});
函数,您就知道必须获取'mm信号量'。但目前尚不清楚如何从我公开发现的例子中做到这一点。我认为编辑可用的示例对社区有利,我愿意这样做,但我不知道从哪里开始。
根据documentation:,只有在调用时保持mm信号量,这才是安全的。
答案 0 :(得分:5)
查看[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内核/驱动程序代码,当我需要找到一些我不了解的东西时,我就是这么做的。
答案 1 :(得分:3)
首先,我真的不懂一点linux :)我不知道为什么要搜索你:)
这是我发现的:
1- mm指的是 15.1.7下的记忆图here。过程记忆图标题:
内存管理难题的最后一部分是进程内存映射结构,它将所有其他数据结构保存在一起。系统中的每个进程(除少数内核空间辅助线程外)都有一个struct mm_struct(定义),它包含进程的虚拟内存区域,页表和各种其他内存管理列表。管家信息,以及信号量(mmap_sem)和自旋锁(page_table_lock)。在任务结构中可以找到指向此结构的指针;在驾驶员需要访问它的极少数情况下,通常的方法是使用current-> mm。注意,内存管理结构可以在进程之间共享;例如,线程的Linux实现以这种方式工作。
2- mm_struct
定义为:
struct mm_struct {
int count;
pgd_t * pgd;
unsigned long context;
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack, start_mmap;
unsigned long arg_start, arg_end, env_start, env_end;
unsigned long rss, total_vm, locked_vm;
unsigned long def_flags;
struct vm_area_struct * mmap;
struct vm_area_struct * mmap_avl;
struct semaphore mmap_sem; /**this what you are looking for**/
};
3-最后,here有一些锁定和解锁(down_write和up_write)mmap_sem属性的示例。
我必须再次承认,我真的不明白发生了什么:)不知怎的,我想找到一个解决方案。
希望它有所帮助, 格克汗。
答案 2 :(得分:0)
要增加Craig的答案,从Linux 5.8开始,VMA锁定已更改为mmap_lock
。您必须执行以下操作:
down_write(&mm->mmap_lock);
remap_pfn_range...
up_write(&mm->mmap_lock);
此外,正在开发一套新的API: https://elixir.bootlin.com/linux/v5.8.2/source/include/linux/mmap_lock.h
此VMA锁定在Linux社区中是一个有争议的问题: https://lwn.net/Articles/787629/