是否可以为(非文件支持的)mmap 区域添加自定义名称?

问题描述 投票:0回答:2

只是好奇是否可以为非文件支持的 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]
linux memory memory-management linux-kernel mmap
2个回答
3
投票

maps
的内容来自
show_map_vma
中的
fs/proc/task_mmu.c
函数。看看它,如果您想要非文件支持的映射的自定义名称,它需要来自
vma->vm_ops->name
arch_vma_name
arch_vm_name
是特定于体系结构的(正如您从名称中所期望的那样),仅用于为某些区域添加一些硬编码名称,因此它对您没有用处。这使得
vma->vm_ops->name
成为您唯一的可能性,但是当您使用
mmap
调用
MAP_ANONYMOUS
时,
vma_set_anonymous
vma->vm_ops
设置为
NULL
。因此,如果没有自定义内核代码,严格来说您所要求的内容是不可能的。

但是,仍然可以做你想做的事。如果您实际上只是希望内存不由磁盘支持,则可以使用

memfd_create
系统调用创建 FD,或者在非磁盘支持的文件系统(例如 tmpfs)中创建文件(例如,
/dev/shm
,如
shm_open 
使用)。这些方法中的任何一种都可以让您控制所使用的文件名(例如,
/memfd:some_name (deleted)
/dev/shm/some_name
)。


0
投票

除了 Joseph 的回答之外,从 Linux 版本 5.17 开始,您可以使用

prctl
命名匿名私有映射。 调用示例:
prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, start, len, "mymemory");

自 Linux 6.2 起,这也适用于共享匿名映射(因此,任何匿名映射都应该有效)。

© www.soinside.com 2019 - 2024. All rights reserved.