java 缓冲区在物理内存中的位置

Location of a java buffer in physical memory

我有一个场景,其中 支持 DMA 的设备想要从 JAVA 代码 创建的缓冲区中读取数据。但是,除非提供 java 缓冲区的 物理内存地址 ,否则 DMA 设备无法工作。

因此,我的问题是是否有一种机制可以让我直接从 JAVA 在物理内存中分配缓冲区,而缓冲区既不受 JVM 堆控制 space 也不OS 内存,缓冲区不受虚拟内存和分页影响。 java NIO 1/2 包有帮助吗?

谢谢。

JVM 是在主机 OS 管理的虚拟地址 space 中运行的进程。典型的 OS 不允许非特权进程控制物理内存映射或关闭分页等。

但是,特权进程(至少在 Linux 上)能够访问内核内存,并将其映射到自己的地址 space。这就是 vgalib 所做的;见 http://www.tldp.org/LDP/khg/HyperNews/get/devices/fake.html

鉴于上述情况,可以实现满足您要求的自定义内存映射 Buffer class。您在本机代码中完成设置映射内存区域的工作,然后使用本机代码方法或 Unsafe class 来实现 Buffer class 的部分需要访问映射内存。

Can the java NIO 1/2 package help?

也许如果您在“/dev/kmem”的文件句柄上使用 FileChannel.map(...) ...