首页 > 解决方案 > 将虚拟内存映射到虚拟内存

问题描述

我得到了一个位于内存某处的结构。是否可以在 WinAPI/POSIX 中创建一个内存映射,将结构别名到内存范围的不同部分,以便可以从两个位置访问相同的字节?我无法控制原始结构的位置,但新结构可以存储在任何地方。

我认为,至少在 WinAPI 中,我可以创建一个临时文件并将包含该结构的页面存储在那里,然后我可以(希望)用指向该文件的新页面替换原始页面,然后将文件映射到内存中的新部分。但是,我担心访问内存的性能。有更好的吗?

标签: cwinapiposix

解决方案


在 Linux 中,您可以使用memfd_create(2)它来分配可以通过文件描述符访问的内存。然后,您将write(2)原始数据映射到该内存文件,并mmap(2)使用MAP_FIXED标志将其映射到原始位置,然后使用非固定的mmap(2). 请注意,映射必须是底层页面大小的倍数(常规地址空间中为 4k,如果 memfd 是从大页面分配的,则为大页面大小)。


推荐阅读