首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以通过修改页表来移动内存页?

问是否可以通过修改页表来移动内存页?
EN

Stack Overflow用户
提问于 2010-04-21 06:13:18
回答 3查看 283关注 0票数 3

是否有可能(在任何合理的操作系统上,最好是Linux上)通过只修改页表而不实际移动任何数据来交换两个内存页的内容?

动机是密集的矩阵转置。如果数据是按页大小阻塞的,那么可以转置页内的数据(在缓存中),然后交换页以将块移动到它们的最终位置。一个大的矩阵会有很多很多的页面被移动,所以希望刷新TLB不会造成麻烦。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-21 06:45:30

我认为内存映射文件可以做到这一点,但我想我自己从来没有尝试过。使用带有MAP_ANONYMOUS的mmap来映射纯虚拟地址(无物理文件备份)。然后,你可以将你的“文件”重新映射到VA的不同区域,从而获得有效的零拷贝语义。在Windows中,您可以使用带有使用CreateMapOfFile(INVALID_HANDLE_VALUE,...)创建的文件映射句柄的MapViewOfFile,但请注意,在NT上,您无法控制重新映射的目标(即.新映射的VA地址是函数调用的输出),并且在Linux上,所需的地址被作为提示。

如果这不起作用,那么您可能需要在内核中创建一个内存管理器模块,这对于任何实际项目都是不可行的。

票数 0
EN

Stack Overflow用户

发布于 2010-04-21 12:42:58

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

#define __USE_GNU
#include <unistd.h>
#include <sys/mman.h>

int main() {
    int PAGE_SIZE = getpagesize();
    char* m = NULL;
    void* temp;

    printf("page size = %d\n", PAGE_SIZE);

    m = (char*)mmap(0, PAGE_SIZE*3, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    temp = m+PAGE_SIZE*2;

    memset(m, '0', PAGE_SIZE);
    memset(m+PAGE_SIZE, '1', PAGE_SIZE);

    printf("before %c %c\n", m[0], m[PAGE_SIZE]);

    mremap(m + PAGE_SIZE, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, temp); 
    mremap(m, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, m+PAGE_SIZE); 
    mremap(temp, PAGE_SIZE, PAGE_SIZE, MREMAP_FIXED | MREMAP_MAYMOVE, m); 


    printf("after %c %c\n", m[0], m[PAGE_SIZE]);
    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2010-04-21 07:08:32

当然,理论上是这样的。在实践中,我认为可以使用mmap()以这种方式移动system V样式的共享内存块。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2679065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档