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(...)
...
我有一个场景,其中 支持 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(...)
...