看一下mremap()在内核中的表现,它看起来确实可以移动并重新定位内存页面,并且在需要时还可以刷新tlb,依此类推。 但是,实际上,似乎不是,而是稍后生成的页面错误将进行实际映射。
所以我的问题是-为什么呢?如果代码在需要时专门调用move_page_tables,move_ptes和flush_tlb。
我已经进行了测试以确认
我通过调用mmap分配了2个内存块。 两者大小相同,标志相等且可访问,匿名,因为我不需要文件,并且可以共享以允许同一区域的多个映射:
a = mmap(NULL, buffs_size, PROT_READ| PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
b = mmap(NULL, buffs_size, PROT_READ| PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
现在,我叫mremap:
mremap(a, 0, buff_size, MREMAP_MAYMOVE | MREMAP_FIXED, b)
在这一点上,b包含a的内容,但是,看来mremap没有映射页面,当我访问b并将内存映射到a的内存并继续执行时,发生页面错误。 / p>
任何想法或指向该决策位置的代码指针吗?