标签: dma

splice() 中的 DMA 复制

我是 linux 内核的新手。最近,我经历了内核 2.6.33 中的 sendfile 系统调用。以下是我的行程顺序:

   do_sendfile()
=> do_splice_direct()
=> splice_direct_to_actor()
=> do_splice_to()
=> do_splice_from()
=> splice_read,splice_write
Run Code Online (Sandbox Code Playgroud)

在整个序列中,我没有找到 splice 使用 DMA 副本的地方。那么DMA复制在哪里发生呢?

linux-kernel splice dma

5
推荐指数
1
解决办法
758
查看次数

为 32 位 PCI 设备编写 Windows 64 位设备驱动程序

我正在评估将我几年前编写的设备驱动程序从 32 位移植到 64 位。物理设备是 32 位 PCI 卡。也就是说,设备是 32 位的,但我需要从 Win7x64 访问它。该设备向 Windows 世界提供一些寄存器,然后将大量总线主数据传输到驱动程序分配的内存块中。

我在 Microsoft 文档中读到过,您可以表明驱动程序是否支持 64 位 DMA。如果不是,则 DMA 是双缓冲的。但是,我不确定是否是这种情况。我的驱动程序将/可能是一个完整的 64 位驱动程序,因此它可以支持处理器地址空间中的 64 位地址,但实际的物理设备不会支持它。实际上,设备 BAR 必须映射到 4 GB 以下,并且设备必须获得 PC RAM 地址才能执行 4 GB 以下的总线主控。这是否意味着我的驱动程序将始终通过双缓冲?这是一个对性能非常敏感的过程,双缓冲可能会阻止整个系统工作。

当然,设计新的 64 位 PCI(或 PCI-E)板是没有问题的。

任何人都可以为我提供此过程的一些资源(除了 MS 页面)?

非常感谢!

windows 64-bit driver dma pci

5
推荐指数
1
解决办法
1521
查看次数

DMA控制器和I/O处理器有什么区别

给定起始内存地址和字数,DMA 控制器在 CPU 处理其他进程时传输数据。输入输出处理器也处理给定起始地址和字数的 I/O 进程..(如果我有错误,请纠正我)

那么 IOP 和 DMA 控制器在功能上有什么区别呢?

hardware io dma

5
推荐指数
1
解决办法
1万
查看次数

如何在 GPU-CUDA 代码中使用 GPU-DMA 来复制数据?

使用 CUDA SDK 5.5,我可以用来复制数据:

  • 来自主机:cudaMemcpy();如果内存固定则使用 GPU-DMA
  • 来自主机:memcpy();或者cudaMemcpy();如果内存未固定则使用 CPU 内核
  • 来自 gpu:for() { dst[i] = src[i]; }memcpy();使用 GPU 核心
  • 从 GPU:使用 GPU-DMA ???

如何在GPU-CUDA 代码的内核函数中使用 GPU-DMA 来复制数据?

c++ cuda gpgpu dma

5
推荐指数
1
解决办法
5282
查看次数

用于不同大小阵列的 UART DMA

将 MPLAB X 1.70 与 dsPIC33FJ128GP802 微控制器一起使用。

我有一个应用程序,它以不同的采样率(一个为 50Hz,另一个为 1000Hz)从两个传感器收集数据,两个传感器数据包的大小也不同(一个是 5 字节,另一个是 21 字节)。到目前为止,我一直使用手动 UART 传输,如下所示:

void UART_send(char *txbuf, char size) {
    // Loop variable.
    char i;

    // Loop through the size of the buffer until all data is sent. The while
    // loop inside checks for the buffer to be clear.
    for (i = 0; i < size; i++) {
        while (U1STAbits.UTXBF);
        U1TXREG = *txbuf++;
    }
}
Run Code Online (Sandbox Code Playgroud)

不同大小的数组(5 或 21 字节)被发送到这个函数,它们的大小和一个简单的 for 循环遍历每个字节并通过 UART tx 寄存器 U1TXREG 输出它。

现在,我想实现DMA来减轻传输大量数据时对系统的压力。我已将 …

c microcontroller pic dma mplab

5
推荐指数
1
解决办法
3955
查看次数

任何适用于 AXI 突发类型设备的内置 Linux 方法?

我需要与基于 AXI-burst 接口的 FPGA 设备进行通信。在不涉及 DMA 的情况下,通过 Linux 访问此类设备的方法有哪些?突发是 AXI 标准的固有属性,通常应在传输大量数据时自动触发。更大的问题是 FPGA 被设计为仅响应 AXI 总线上的突发类型请求。因此,当应用程序尝试顺序复制时,这会导致 Linux 上出现严重问题。我已经尝试过了memcpy,但它不起作用。

linux arm fpga dma amba

5
推荐指数
1
解决办法
2243
查看次数

处理器中的 DMA 控制器有何用途?

DMA 控制器存在于磁盘、网络设备上。因此他们可以直接将数据传输到主存储器。那么处理器芯片内部的DMA控制器有什么用?我还想知道,处理器芯片外部是否有不同的总线(i2c,pci,spi)而处理器内部只有一条总线(AXI)。这是如何工作的?(应该\xe2\x80\x99t它会导致一些瓶颈)

\n

performance memory-management cpu-architecture dma

5
推荐指数
1
解决办法
2541
查看次数

STM32F4 HAL DMA UART TX

我正在尝试让 UART 传输在 stm32f405 上通过 DMA 工作。我的应用程序的这一部分旨在作为命令行界面发送文本字符串。我让 UART 的 RX 部分与 DMA 配合良好(使用 1 字节循环 DMA 来处理传入的任何内容),但 TX 端被证明有点棘手。

我可以使用以下方式发送数据字符串:HAL_UART_Transmit_DMA(&handle, pData[], strlen(pData))前提是函数的连续调用之间存在延迟。一旦我的程序决定依次发送两个字符串,新的数据指针就会被忽略。

通过使用,while(HAL_UART_Transmit_DMA(...) != HAL_OK){}我可以让程序等待所需的时间并发送连续的字符串。

这可以工作一段时间(几十次传输),然后由于 HAL_NOT_OK 而卡住。

作为参考,我的 DMA 设置是:DMA2 stream 7, channel 4, mem to periph, periph inc disabled, mem inc enabled, mem and periph align byte, normal mode (not circular), low priority, fifo disabled

UART 设置为9600 baud, 8 bit word, …

fifo stm32 dma uart stm32f4discovery

5
推荐指数
1
解决办法
3万
查看次数

PCIe卡如何将数据DMA到CPU RAM中?

这是参考对类似 dma/pci 问题给出的答案我从这个答案中得知,PC 没有能够将数据传输到 PCI 卡或从 PCI 卡传输数据的 DMA,并且 PCI 卡必须提供 DMA 功能。我从同事那里收到了类似的答案,他们说:“FPGA(指 PCI 卡)上需要有双向 DMA,以实现与 CPU 内存之间的突发传输。”

我的理解是,当PC收到读取请求时,它需要通过创建包含请求数据的返回数据包来完成读取请求。因此,如果卡请求一页数据(4096 字节),PC 需要返回一个 4096 字节的数据包。卡的 dma 如何到达总线并使用它的 dma 来填充所需的数据包,正如这个答案所建议的那样?

dma pci pci-e

5
推荐指数
1
解决办法
3193
查看次数

Linux 内核 flush_write_buffers() 如何在 x86 上工作?

以下代码来自include/asm-i386/io.h,并且是从调用的dma_map_single()。我的理解是flush_write_buffers()应该在为 DMA 映射内存之前刷新 CPU 内存缓存。但是这个汇编代码是如何刷新 CPU 缓存的呢?

static inline void flush_write_buffers(void)
{
    __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory");
}
Run Code Online (Sandbox Code Playgroud)

c x86 assembly linux-kernel dma

5
推荐指数
2
解决办法
276
查看次数