我有一个C代码,其中我知道void *p1指向的页面的内容与页void *p2所指向的内容相同。动态分配p1和p2。我的问题是,我可以使用remap()来让这两个页面指向同一个物理页面而不是两个相同的物理页面吗?
编辑:我试图将此过程的页面表中的虚拟映射更改为物理映射,以便p1和p2指向相同的物理地址。我不想让p1和p2实际上指向相同的东西。
发布于 2014-05-14 04:31:14
如果您试图使用linux页面方案将多个虚拟内存地址映射到单个物理地址,那么mremap()就不是这样做的。mremap用于移动(重映射)现有区域,如果您使用它映射到特定的新地址,则到该地址的任何旧映射都将无效(按手册页计算)。http://man7.org/linux/man-pages/man2/mremap.2.html
见强调部分..。
MREMAP_FIXED (因为Linux2.3.31)这个标志的用途类似于mmap(2)的MAP_FIXED标志。如果指定了此标志,那么mremap()将接受第五个参数,即void *new_address,该参数指定必须将映射移动到的对页地址。以前在new_address和new_size指定的地址范围内的任何映射都是未映射的。如果指定了MREMAP_FIXED,则还必须指定MREMAP_MAYMOVE。
如果您只是试图合并两个相同数据结构的存储,则不需要mremap()将2个“页面”指向同一个相同的页面,而是需要将两个不同的数据结构指针指向同一个页面并释放冗余页。
如果内容相同,则需要将指向p2的任何指针转换为p1。
即使正确地使用mremap也需要您处理自己的指针管理,但它并不能神奇地为您做到这一点;如果您不能这样做,在重新映射之后,您可能会有悬空的指针。
PS:我已经多年没有做内核编程了,所以我在下一个声明中可能是错的或者过时了,但是我认为您需要使用内核调用(即。内核模块/驱动程序级调用)以获取物理映射,因为mmap()和mremap()是在虚拟地址空间中工作的用户域调用。“页面映射”是在内核级,在用户空间之外完成的。
https://stackoverflow.com/questions/23645596
复制相似问题