如何获得C中的“mm信号量”?

时间:2015-12-29 18:37:15

标签: c linux-kernel

如果要在实现mmap的自定义内核驱动程序中使用$(document).ready(function () { var loader = ROOT + '/images/loader.gif")'; }); 函数,您就知道必须获取'mm信号量'。但目前尚不清楚如何从我公开发现的例子中做到这一点。我认为编辑可用的示例对社区有利,我愿意这样做,但我不知道从哪里开始。

根据documentation,只有在调用时保持mm信号量,这才是安全的。

3 个答案:

答案 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_readup_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/