mremap和页面错误

时间:2018-09-26 18:04:32

标签: linux linux-kernel linux-device-driver virtual-memory page-tables

看一下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>

任何想法或指向该决策位置的代码指针吗?

0 个答案:

没有答案