我正在使用虚拟内存系统的想法,允许我对我已经获得的一些数字数据进行透明数据转换(例如int to float)。基本思想是我正在编写的库mmaps你想要的数据文件,同时mmaps一个适当大小的匿名区域来保存转换后的数据,并将这个指针返回给用户。
匿名区域是读/写保护的,因此每当用户通过指针访问数据时,每个新页面都会引起一个段错误,我可以捕获,然后透明地转换来自mmaped文件的数据并修复允许访问继续的权限。到目前为止,整个事情的这一部分很有效。
然而,有时我会绘制非常大的文件(数百GB),并且匿名内存代理访问它,很快你就会开始吃掉交换空间,因为匿名页面会被丢弃到磁盘上。我的想法是,如果我可以在将转换后的数据写入它们之后将匿名页面上的脏位显式设置为false,那么操作系统只会删除它们,并在以后重新访问时按需填充零。
为了实现这一点,我认为我必须将脏位设置为false 和说服操作系统将页面设置为在换出时被读取保护,所以我可以重新捕获随后的段错误并根据需要重新转换数据。在做了一些研究后,我认为没有内核黑客攻击是不可能的,但我想我会问,看看有更多关于虚拟内存系统的人是否知道可以实现的方法。
答案 0 :(得分:2)
这是一个想法(虽然完全未经测试):对于转换后的数据,mmap
和munmap
个别网页。由于页面由匿名内存支持,因此在取消映射时应将其丢弃。 Linux会将相邻映射合并到一个VMA中,因此这可能具有可接受的开销。
当然,需要一种机制来触发取消映射。当你需要引入一个新的页面时,你可以维护一个LRU结构并逐出旧页面,从而保持映射区域的大小不变。