dma相关内容

如何获取用于DMA的GPU内存的物理地址?(OpenCL)

我正在编写一个OpenCL程序,我希望使用DMA将数据从帧采集卡传输到GPU。如何获取GPU上OpenCL缓冲区的物理地址以执行此操作? 推荐答案 使用OpenCL,您无法获取缓冲区的物理GPU地址。 但是,您可以将缓冲区的一个区域直接映射到主机内存,从而允许使用标准C/C++代码(如memcpy)将内存复制进来和复制出来。请参阅clEnqueue eMapBuffer。 ..
发布时间:2022-03-27 18:53:49 其他开发

DMA 缓存一致性管理

我的问题是:当我在设备驱动程序中正确使用 [pci_]dma_sync_single_for_{cpu,device} 时,如何确定何时禁用缓存监听是安全的? 我正在为通过 PCI Express (DMA) 直接写入 RAM 的设备开发设备驱动程序,并且担心管理缓存一致性.我可以在启动 DMA 时设置一个控制位以在 DMA 期间启用或禁用缓存侦听,显然为了性能我希望尽可能禁用缓存侦听. ..
发布时间:2022-01-04 22:42:29 服务器开发

如何在 linux 内核模块中分配由 1GB HugePages 支持的 DMA 缓冲区?

我正在尝试为 HPC 工作负载分配 DMA 缓冲区.它需要 64GB 的缓冲空间.在计算之间,一些数据被卸载到 PCIe 卡.与其将数据复制到由 pci_alloc_consistent 提供的一堆 4MB 小缓冲区中,我只想创建 64 个 1GB 缓冲区,并由 1GB HugePages 提供支持. 一些背景信息:内核版本:CentOS 6.4/2.6.32-358.el6.x86_64内 ..
发布时间:2022-01-04 22:29:15 服务器开发

Linux内核设备驱动程序从设备到用户空间内存的DMA

我想尽快将数据从启用 DMA 的 PCIe 硬件设备获取到用户空间. 问:我如何将“直接 I/O 与/和/通过 DMA 传输结合到用户空间" 通读LDD3,好像需要进行几种不同类型的IO操作!? dma_alloc_coherent 为我提供了可以传递给硬件设备的物理地址.但是需要设置 get_user_pages 并在传输完成时执行 copy_to_user 类型的调用.这似乎 ..
发布时间:2022-01-04 22:20:46 服务器开发

arm64上的Linux:sendto导致“未处理的错误:对齐错误(0x96000021)"当从 mmapped 相干 DMA 缓冲区发送数据时

我正在构建一个基于配备 arm64 CPU 的 UltraScale+ FPGA 的数据采集系统.数据通过 DMA 传输到 RAM.驱动程序中的 DMA 缓冲区保留如下: virt_buf[i] = dma_zalloc_coherent(&pdev->dev, BUF_SIZE, &phys_buf[i],GFP_KERNEL); 在驱动的mmap函数中,映射到用户空间的方式如下: #if ..
发布时间:2021-11-17 22:44:15 服务器开发

需要帮助在 Xilinx/ARM SoC (Zynq 7000) 上映射预先保留的 **可缓存** DMA 缓冲区

我有一个基于 Xilinx Zynq 7000 的电路板,在具有 DMA 功能(在 AXI 总线上)的 FPGA 结构中有一个外设.我们开发了一个电路,并在 ARM 内核上运行 Linux.我们在从用户空间访问 DMA 缓冲区时遇到性能问题,该缓冲区已被硬件填充. 总结: 我们在启动时预先保留了一部分 DRAM 用作大型 DMA 缓冲区.我们显然使用了错误的 API 来映射这个缓冲区, ..
发布时间:2021-11-17 22:32:33 其他开发

需要帮助在 Xilinx/ARM SoC (Zynq 7000) 上映射预先保留的 **可缓存** DMA 缓冲区

我有一个基于 Xilinx Zynq 7000 的电路板,在具有 DMA 功能(在 AXI 总线上)的 FPGA 结构中有一个外设.我们开发了一个电路,并在 ARM 内核上运行 Linux.我们在从用户空间访问 DMA 缓冲区时遇到性能问题,该缓冲区已被硬件填充. 总结: 我们在启动时预先保留了一部分 DRAM 用作大型 DMA 缓冲区.我们显然使用了错误的 API 来映射这个缓冲区, ..
发布时间:2021-11-17 22:31:45 其他开发

DMA 与中断驱动的 I/O

我有点不清楚 DMA 和中断 I/O 之间的区别.(目前正在阅读操作系统概念,第 7 版). 具体来说,我不确定在这两种情况下中断何时发生,以及在两种情况下 CPU 可以自由做其他工作的时间点.我一直在读的东西,但不一定能调和: 中断驱动 控制器通过驱动程序初始化 控制器检查驱动程序加载的寄存器以决定操作 与外围设备和控制器缓冲区之间的数据传输随之而来. 控制器在以下时间发 ..
发布时间:2021-11-17 01:42:59 其他开发

使用DMA访问高速串口

我在 c# 中使用了串行端口组件,它运行良好!但问题是如何才能更快地处理高速(例如 2 Mbps)数据传输. 由于我对此进行了研究,我发现可以直接访问内存(使用像 此链接 ).谁能告诉我如何在我的应用程序中定义和使用它? 解决方案 不,[c#] 标签使这变得遥不可及.该网页上的代码片段不是真实的,它只是一个“模式".它可以完成在 C# 中无法完成的事情,例如处理中断、获取缓冲区的物理 ..
发布时间:2021-07-20 18:36:53 C#/.NET

PCI Express BAR 内存映射基本理解

我试图了解 PCI Express 的工作原理,以便我可以编写一个 Windows 驱动程序,该驱动程序可以在没有板载内存的情况下读写自定义 PCI Express 设备. 我了解 PCIE 配置空间中的基址寄存器 (BAR) 保存 PCI Express 应响应/允许写入的内存地址.(这样理解正确吗?) 我的问题如下: 在谈论 PCIE 时,与物理地址相比,什么是“总线特定地址 ..
发布时间:2021-06-02 19:30:21 其他开发

在Linux中将kmalloc与GFP_DMA一起使用时,为什么得到高地址?

我正在为Linux中的DMA设备编写设备驱动程序.在Linux设备驱动程序,第15章,它说: 对于具有此类限制的设备,应分配内存通过将GFP_DMA标志添加到kmalloc来从DMA区域中删除get_free_pages调用.存在此标志时,只有可以被分配24位地址.或者,您可以使用通用DMA层(我们稍后将讨论)来分配缓冲区解决设备的限制 我这样呼叫 kmalloc : physic ..
发布时间:2021-05-29 22:58:47 服务器开发

DMA控制器如何处理输入设备(例如串行端口)

因此,到目前为止,我了解到的是,只要需要从硬盘驱动器传输数据,CPU就会对源地址,目标地址,字数和到DMA控制器的方向进行编程.但是在此示例中,硬盘驱动器只是一个哑设备,因此很有意义,因为硬盘驱动器永远无法启动数据传输. 但是,如果我们连接了串行端口,那么在某些情况下我们将获得8位数据该怎么办.我知道DMA控制器用于大内存传输,但是我想对这8位进行DMA.但是,CPU上的设备驱动程序无法确定 ..
发布时间:2021-05-04 19:03:32 其他开发

在STM32传输结束时,循环DMA内存中断将如何表现?

我想问一下,在以下情况下,STM32中的DMA SPI rx将如何运行.我有一个称为A的指定的(例如)96字节数组,该数组用于存储从SPI接收的数据.我打开循环SPI DMA,它在每个字节上运行,配置为96字节.是否有可能,当DMA填充我的96字节数组时,传输完成中断将消失,以快速将96字节数组复制到另一个-B,然后循环DMA将开始写入A(并销毁保存在B中的数据)?我想(每次从B中的A获取新数据时 ..
发布时间:2021-05-04 19:01:59 其他开发

关于DMA和CPU并发

我想知道在设备的DMA控制器进行内存操作时,CPU可以处理/执行哪种操作,以提高并发水平?如果CPU缓存/寄存器为空,那么如何在不进行DMA插入的情况下获取另一条指令 Thx 解决方案 通常,在大型 1 硬件上,在进行DMA时CPU可以执行或多或少的任何操作。通常,它只是继续在操作系统的控制下正常执行正在运行的进程或内核任务。 关于您的问题: ...如果CPU高速缓存/寄 ..
发布时间:2020-10-07 21:27:57 其他开发

当时钟频率为480MHz时,STM32H743的FMC能驱动16位8080总线快于1.6MHz吗?

我正在使用STM32H743的FMC来驱动16位8080总线LCD控制器. 我尝试使用DMA,MDMA和CPU循环通过FMC将数据传输到8080总线. 传输频率不取决于使用的是DMA,MDMA还是CPU回路.这让我认为DMA/MDMA/CPU循环不是限制因素. FMC时钟为480MHz时,传输速度仅为1.6MHz,在16位彩色320x240 LCD上,我的传输速度仅为20fps. ..
发布时间:2020-08-06 03:33:53 其他开发

dma vs中断驱动的I/o

我不清楚DMA与中断I/O之间的区别. (当前正在阅读《操作系统概念》,第7版). 具体来说,我不确定这两种情况下何时发生中断,以及在两种情况下的什么时候CPU都有空做其他工作.我一直在阅读的东西,但不一定能调和: 中断驱动 通过驱动程序初始化的控制器 控制器检查驱动程序加载的寄存器以决定操作 随之发生从/向外围设备的数据传输以及控制器的缓冲区. 控制器何时(在读取的每个字 ..
发布时间:2020-05-21 18:56:26 其他开发

glBufferSubData什么时候返回?

我想将非常大的内存块的内容传输到足够大的GPU缓冲区,然后立即更改CPU上的内存内容.伪代码中是这样的: glBindBuffer(/*very_large_buffer*/); glBufferSubData(/*very_large_memory_chunk*/); memset(/*zeros*/, /*very_large_memory_chunk*/); 在此代码中,glBuf ..
发布时间:2020-05-20 23:27:44 其他开发

几分钟后Uart dma接收中断将停止接收数据

我有一个使用过stm32f746g发现板的项目.它顺序地从Uart接收具有固定大小的数据,并通知应用程序每个接收到的数据已完成,并使用dma回调(HAL_UART_RxCpltCallback函数).它在一开始就可以正常工作,但是在运行了几分钟后,dma回调停止被调用,结果,指定的参数值没有得到更新.因为该参数也在另一个线程中使用(实际上是rtos定义的计时器),所以我认为此问题是由于缺乏线程安全 ..
发布时间:2020-05-14 02:18:49 其他开发