只是好奇是否可以为非文件支持的 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]
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
)。
除了 Joseph 的回答之外,从 Linux 版本 5.17 开始,您可以使用
prctl
命名匿名私有映射。
调用示例:prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, start, len, "mymemory");
自 Linux 6.2 起,这也适用于共享匿名映射(因此,任何匿名映射都应该有效)。