linux - 如何通过替换为空页映射来取消映射 mmap 文件

标签 linux memory-management mmap virtual-memory

Linux 用户空间是否有一种方法可以用空页(从 /dev/null 映射,或也许是一个空页面,重复映射到从文件映射的页面顶部)?

就上下文而言,我想找到此 JDK 错误的修复程序:

https://bugs.openjdk.java.net/browse/JDK-4724038

总结一下这个错误:目前无法在 Java 中取消文件映射,直到 JVM 可以对包装 mmap 文件的 MappedByteBuffer 进行垃圾回收,因为强制取消映射文件可能会导致由于竞争条件而导致的安全问题(例如, native 代码可能仍然尝试访问文件映射到的同一地址范围,并且操作系统可能已经将新文件映射到同一逻辑地址范围)。

我正在寻找替换逻辑地址范围中的映射页面,然后取消映射该文件。有什么办法可以实现这一点吗?

(如果您也知道在其他操作系统(特别是 Windows 和 Mac OS X)中执行此操作的方法,则会加分。)

请注意,这不必是原子操作。主要目标是将内存的取消映射(或用读取时为零的页面替换映射的文件内容)与文件的关闭分开,因为这将解决 Linux(具有每个进程的文件描述符数量的下限)和 Windows(事实上您无法在映射时删除文件)。

更新:另请参阅:Memory-mapping a file in Windows with SHARE attribute (so file is not locked against deletion)

最佳答案

在 Linux 上,您可以将 mmapMAP_FIXED 结合使用,将映射替换为您想要的任何映射。如果替换整个映射,则对文件的引用将被删除。

关于linux - 如何通过替换为空页映射来取消映射 mmap 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54337460/

相关文章:

c++ - 连续调用 mmap,有缓存吗?

c - 如何将 mmap() 64 位地址转换为 32 位进程?

linux - 当我在命令行中进入 docker 镜像时,如何知道它正在运行什么 Linux?

c - 如何在裸 Linux 内核上安装 glibc?

javascript - 到 Spidermonkey 的管道无法正常工作

c - 为什么 mmap 不能分配内存?

linux - 如何在 Linux 中根据记录数拆分定界文本文件,该文件在数据字段中具有记录结尾分隔符

iphone - 对象被过早释放?

c++ - std::function lambda 优化

c - R 将函数 Realoc 与 .C 接口(interface)一起使用