0

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

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

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

4

1 回答 1

2

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

于 2011-03-29T00:22:53.303 回答