我在SO和其他地方看到过的每个Java循环字节缓冲区实现都没有扩展java.nio.ByteBuffer,对我来说这是与SocketChannel一起使用所必需的.有没有人知道扩展ByteBuffer的开源实现.我试着写下我自己的路,但是当我意识到位置和剩余的功能是最终的时候我被卡住了,我将覆盖那些以调整头部并防止缓冲区溢出异常.在通过套接字通道发送5000条消息时,每个人都需要我将东西复制到线性缓冲区的头部,这会增加大约450毫秒或90us的每条消息(其中包含10个数据包,因此每个数据包为9us).现在,我能想到的唯一方法是覆盖每一个方法并重写所有方法.有任何想法吗?
我正在使用高速串行卡进行高速数据传输,从外部源到带有PCIe卡的Linux机箱.PCIe卡带有一些第三方驱动程序,它们使用dma_alloc_coherent分配dma缓冲区来接收数据.但是,由于Linux的限制,这种方法将数据传输限制为4MB.我一直在阅读并尝试多种方法来分配大型DMA缓冲区,并且无法使其工作.
这个系统有32GB的内存,并运行Red Hat,内核版本为3.10,我想为连续的DMA提供4GB的内存.我知道首选的方法是分散/聚集,但在我的情况下这是不可能的,因为有一个硬件芯片将串行协议转换为超出我的控制范围的DMA,我唯一可以控制的是向传入地址(即,从外部系统看到的地址零可以映射到本地总线上的地址0x700000000).
由于这是一次性实验室机器,我认为最快/最简单的方法是使用mem = 28GB启动配置参数.我有这个工作正常,但从虚拟空间访问该内存的下一步是我遇到问题.这是我的代码浓缩到相关组件:
在内核模块中:
size_t len = 0x100000000ULL; // 4GB
size_t phys = 0x700000000ULL; // 28GB
size_t virt = ioremap_nocache( phys, len ); // address not usable via direct reference
size_t bus = (size_t)virt_to_bus( (void*)virt ); // this should be the same as phys for x86-64, shouldn't it?
// OLD WAY
/*size_t len = 0x400000; // 4MB
size_t bus;
size_t virt = dma_alloc_coherent( devHandle, len, &bus, GFP_ATOMIC );
size_t phys = (size_t)virt_to_phys( (void*)virt );*/
Run Code Online (Sandbox Code Playgroud)
在申请中:
// Attempt …Run Code Online (Sandbox Code Playgroud)