C 将虚拟内存映射到虚拟内存

C 将虚拟内存映射到虚拟内存,c,winapi,posix,C,Winapi,Posix,我被提供了一个位于内存某处的结构。在WinAPI/POSIX中是否可以创建一个内存映射,将结构别名到内存范围的不同部分,以便从两个位置访问相同的字节?我无法控制原始结构的位置,但新结构可以存储在任何地方 我认为,至少在WinAPI中,我可以创建一个临时文件并将包含结构的页面存储在那里,然后(希望)用指向该文件的新页面替换原始页面,然后将该文件映射到内存中的新部分。但是,我担心访问内存的性能。有更好的吗?在Linux中,您可以使用memfd\u create(2)来分配内存,您可以通过文件描述符访

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


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

在Linux中,您可以使用
memfd\u create(2)
来分配内存,您可以通过文件描述符访问这些内存。然后,您将
将(2)
原始数据写入内存文件,并使用
mmap(2)
使用
map\u FIXED
标记将其映射到原始位置,然后使用非固定
mmap(2)
将其映射到另一个位置。请注意,映射必须是基础页面大小的倍数(常规地址空间中为4k,如果memfd是从hugepages分配的,则为hugepages大小)。

;你有“一些”问题,你认为多重映射可以解决它:这个问题到底是什么?从技术上讲,您想要做的事情是可能的,但有一些警告。问题是,任何形式的单内存多地址映射都需要所有参与方了解这一事实。否则,创建要双重映射的原始分配的代码可能会释放、重新分配或移动位置,而无需更新其他映射。在内核模式下,存在MDL-当您可以获取内存位置的物理页,然后在另一个(非分页系统)地址重新映射此(锁定)页时。在用户模式下,没有此类功能。但是你的问题还不清楚——对相同的物理页面有两个内存视图有什么意义?@datenwolf我很清楚这些警告,我能处理它们。我不明白这有什么意义。您需要知道要映射到的对象的位置,以便将其映射到其他位置。如果你知道它在哪里,你就不必映射到它。@illdans4-使它成为“全局的”,并提供我自己的结构的其余部分,使该部分成为“局部的”。-不清楚,也不可能