gpt4 book ai didi

c - 使用 mremap() 将两个相同的页面合并为一个物理页面

转载 作者:太空狗 更新时间:2023-10-29 12:32:07 26 4
gpt4 key购买 nike

我有一个 C 代码,我知道 void *p1 指向的页面内容与 page void *p2 指向的内容相同。 p1 和 p2 是动态分配的。我的问题是我可以使用 remap() 让这两个页面指向同一个物理页面而不是两个相同的物理页面吗?

编辑:我正在尝试更改此进程页表中的虚拟到物理映射,以便 p1 和 p2 指向相同的物理地址。我不想让 p1 和 p2 实际上指向同一个东西。

最佳答案

如果您尝试使用 linux 页面方案将多个虚拟内存地址映射到单个物理地址,这不是 mremap() 的用途。 mremap 用于移动(重新映射)现有区域,如果您使用它映射到特定的新地址,则到该地址的任何旧映射都将无效(根据手册页)。 http://man7.org/linux/man-pages/man2/mremap.2.html

请参阅强调部分...

MREMAP_FIXED (since Linux 2.3.31) This flag serves a similar purpose to the MAP_FIXED flag of mmap(2). If this flag is specified, then mremap() accepts a fifth argument, void *new_address, which specifies a page- aligned address to which the mapping must be moved. Any previous mapping at the address range specified by new_address and new_size is unmapped. If MREMAP_FIXED is specified, then MREMAP_MAYMOVE must also be specified.

如果您只是想合并 2 个相同数据结构的存储,则不需要 mremap() 将 2 个“页面”指向相同的相同页面,您需要指向 2 个不同的数据结构指针到同一页面并释放冗余页面。

如果内容相同,则需要将所有指向 p2 的指针转换为 p1 的地址。

即使正确使用 mremap 也需要您处理好自己的指针内务处理,它不会神奇地为您做到这一点;如果你不这样做,在重新映射之后你可能会有悬空指针。

PS:我已经好几年没有进行内核编程了,所以我的下一个陈述可能是错误的或过时的,但我认为你需要使用内核调用(即内核模块/驱动程序级调用)来获得到物理映射,因为 mmap() 和 mremap() 是用户态调用并在虚拟地址空间内工作。 “页面映射”是在用户空间之外的内核级别完成的。

关于c - 使用 mremap() 将两个相同的页面合并为一个物理页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23645596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com