只是好奇是否可以为非文件支持的mmap区域指定一个名称?下面的例子中的[New VMA area]
:
$ cat /proc/12345/maps
...
7fc062ef2000-7fc062f84000 r-xp 00000000 08:01 22688328 /usr/local/musl/lib/libc.so
7fc062f85000-7fc062f86000 r--p 00092000 08:01 22688328 /usr/local/musl/lib/libc.so
7fc062f86000-7fc062f87000 rw-p 00093000 08:01 22688328 /usr/local/musl/lib/libc.so
7fc062f87000-7fc062f8a000 rw-p 00000000 00:00 0 [New VMA area]
7fff6c384000-7fff6c3a5000 rw-p 00000000 00:00 0 [stack]
7fff6c3bd000-7fff6c3c0000 r--p 00000000 00:00 0 [vvar]
字符串
2条答案
按热度按时间qgzx9mmu1#
maps
的内容来自fs/proc/task_mmu.c
中的show_map_vma
函数。看一下它,如果您想要为非文件支持的Map提供自定义名称,则需要来自vma->vm_ops->name
或arch_vma_name
。arch_vm_name
是特定于体系结构的(正如您从名称中所期望的那样),并且只用于为某些区域添加一些硬编码的名称,因此它对您没有用处。这使得vma->vm_ops->name
成为您唯一的可能性,但是当你用MAP_ANONYMOUS
调用mmap
时,vma_set_anonymous
会将vma->vm_ops
设置为NULL
。因此,如果没有自定义内核代码,严格来说你所要求的是不可能的。如果您实际上只是希望内存不受磁盘支持,则可以使用
memfd_create
系统调用创建FD,或者在非磁盘支持的文件系统(如tmpfs)中创建文件(例如,/dev/shm
,就像shm_open
使用的那样)。这两种方法中的任何一种都将给予您对所使用的文件名的控制权(例如,/memfd:some_name (deleted)
或/dev/shm/some_name
)。ffx8fchx2#
除了Joseph的回答之外,从Linux版本5.17开始,您可以用
prctl
命名匿名私有Map。调用示例:
字符串
在
proc
中,名称将显示为[anon:mymemory]
从Linux 6.2开始,这也适用于共享匿名Map。所以,任何匿名Map都应该可以工作。