将页面插入大型mmap()文件而不复制数据

时间:2010-09-24 05:29:12

标签: linux shared-memory mmap tlb inode

我想知道是否有办法在我用mmap()打开的大(多GB)文件的开头附近插入空白页。显然,可以在最后添加一两页,并使用memcpy()将所有内容向前移动,但这会弄脏每一页并在最终刷新到磁盘时需要很长时间。

我猜测解决方案需要在自定义文件系统和页面表的手动操作之间进行一些复杂的协调:向inode添加一个块,以某种方式更新VMM中的缓存页面以反映这一点,然后以某种方式调整要匹配的页面表。这听起来非常重要,这让我想知道是否有更好的方法。

这是关于Linux上的内存和文件操作的一个有点深层次的问题,尽管我很高兴听到如何在其他系统中完成此操作。我对涉及使复制更有效的解决方法不是特别感兴趣,尽管需要重新映射但避免磁盘IO的技术将是一个良好的开端。

1 个答案:

答案 0 :(得分:2)

在您的文件中嵌入一个简单的FAT。例如,文件的前4k将是FAT页面。数据将在以下页面中。随着文件的增长,第一个FAT页面可以链接到其他FAT页面。 fat中的每个条目都是数据页索引和下一个FAT条目的索引。 FAT条目将是FAT页面和条目本身页面上的索引。我想你应该已经明白了。 FAT条目是链接列表。 FAT页面是链接列表。 FAT条目链接数据页面。这应该是足够的信息来使用remap_file_pages()使您的文件在内存中看起来连续,即使它在磁盘上不连续。