dma

Linux kernel device driver to DMA from a device into user-space memory

杀马特。学长 韩版系。学妹 提交于 2019-11-30 06:12:01
问题 I want to get data from a DMA enabled, PCIe hardware device into user-space as quickly as possible. Q: How do I combine "direct I/O to user-space with/and/via a DMA transfer" Reading through LDD3, it seems that I need to perform a few different types of IO operations!? dma_alloc_coherent gives me the physical address that I can pass to the hardware device. But would need to have setup get_user_pages and perform a copy_to_user type call when the transfer completes. This seems a waste, asking

Linux内存描述之高端内存–Linux内存管理(五)

那年仲夏 提交于 2019-11-30 05:52:49
服务器体系与共享存储器架构 日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 http://blog.csdn.net/vanbreaker/article/details/7579941 #1 前景回顾 前面我们讲到 服务器体系(SMP, NUMA, MPP)与共享存储器架构(UMA和NUMA) #1.1 UMA和NUMA两种模型 共享存储型多处理机有两种模型 均匀存储器存取(Uniform-Memory-Access,简称UMA)模型 非均匀存储器存取(Nonuniform-Memory-Access,简称NUMA)模型 UMA模型 物理存储器被所有处理机均匀共享。所有处理机对所有存储字具有相同的存取时间,这就是为什么称它为均匀存储器存取的原因。每台处理机可以有私用高速缓存,外围设备也以一定形式共享。 NUMA模型 NUMA模式下,处理器被划分成多个"节点"(node), 每个节点被分配有的本地存储器空间。 所有节点中的处理器都可以访问全部的系统物理存储器,但是访问本节点内的存储器所需要的时间,比访问某些远程节点内的存储器所花的时间要少得多。 ##1.2 Linux如何描述物理内存 Linux把物理内存划分为三个层次来管理 层次 描述

How do I allocate a DMA buffer backed by 1GB HugePages in a linux kernel module?

前提是你 提交于 2019-11-30 03:43:46
问题 I'm trying to allocate a DMA buffer for a HPC workload. It requires 64GB of buffer space. In between computation, some data is offloaded to a PCIe card. Rather than copy data into a bunch of dinky 4MB buffers given by pci_alloc_consistent, I would like to just create 64 1GB buffers, backed by 1GB HugePages. Some background info: kernel version: CentOS 6.4 / 2.6.32-358.el6.x86_64 kernel boot options: hugepagesz=1g hugepages=64 default_hugepagesz=1g relevant portion of /proc/meminfo:

AXI-DMA

心已入冬 提交于 2019-11-30 03:08:47
---恢复内容开始--- AXI DMA:为内存与AXI4-Stream外设之间提供高宽带的直接存储访问,scatter/gather功能可将CPU从数据搬移任务中解放出来。 在ZYNQ中,AXI DMA就是FPGA访问DDR3的桥梁,受ARM监管。 AXI-DMA IP核有6个接口 : S_AXI_LITE是ARM配置dma寄存器的接口; M_AXI_SG是从(往)存储器加载(上传)buffer descriptor的接口; 剩下4个构成两对接口:MM2S表示PS向PL传送,S2MM表示PL向PS端(M表示主机代表PS,S表示从机代表PL)            AXI是存储器一侧的接口,AXIS是FPGA一侧的接口。 AXI DMA工作模式分为两种,分别是Direct Register Mode和Scatter/Gather Mode。 Direct Register Mode模式: 具备DMA的基本功能,除了控制寄存器和状态寄存器之外,给出源(目的)地址和传输长度之后就可以开启一次传输了。Direct Register Mode的特点(也是缺点)是配置完一次寄存器之后只能完成存储器连续地址空间的读写,如果有需求往不同地址空间搬运数据的话,那就需要重新配置寄存器开启一次新的传输。S2MM和MM2S不支持多个通道。 scatter gather模式: 把关于传输的基本参数

DMA简介

好久不见. 提交于 2019-11-29 15:05:14
注意: 个人整理,有误无责。 0. CPU控制的数据传输方式介绍 由CPU控制的数据传输方式有两种:查询、中断。 0.1 查询方式    查询方式是由程序控制的,如果CPU中执行的程序需要进行数据传输,CPU查询外设状态,如果外设准备好,那么进行数据传输。 0.2 中断方式    当外设需要与CPU进行数据交换的时候,外设向CPU发出中断请求,CPU中断当前执行的程序,相应外设的数据传输请求。当外设的数据传输结束后,CPU继续执行被中断的程序. 上面两种方式,数据都需经过CPU来传递,下面介绍DMA控制的数据传递。 1. DMA介绍    DMA方式,Direct Memory Access,也称为成组数据传送方式,有时也称为直接内存操作。DMA方式在数据传送过程中,没有保存现场、恢复现场之类的工作。    由于CPU根本不参加传送操作,因此就省去了CPU取指令、取数、送数等操作。内存地址修改、传送字 个数的计数等等,也不是由软件实现,而是用硬件线路直接实现的。所以DMA方式能满足高速I/O设备的要求,也有利于CPU效率的发挥。 (参考自百度) 2. 工作原理    直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传 输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。   

Memory alignment of arrays

微笑、不失礼 提交于 2019-11-29 13:51:28
I am having trouble aligning memory for DMA transfer on the Cell processor. I need the last 4 bits of an address to be 0. I have 4 arrays of unsigned int where each element must be aligned in memory so that its (hex) adress ends with a zero. E.g. int main() { size_t i; static unsigned int a[2] __attribute__ ((aligned (16))); static unsigned int b[2] __attribute__ ((aligned (16))); static unsigned int c[2] __attribute__ ((aligned (16))); static unsigned int d[2] __attribute__ ((aligned (16))); for (i = 0; i < 2; ++i) { printf("a[%u] = %p\n", &a[i]); printf("b[%u] = %p\n", &b[i]); printf("c[%u]

DMA cache coherence management

人走茶凉 提交于 2019-11-29 02:37:50
问题 My question is this: how can I determine when it is safe to disable cache snooping when I am correctly using [pci_]dma_sync_single_for_{cpu,device} in my device driver? I'm working on a device driver for a device which writes directly to RAM over PCI Express (DMA), and am concerned about managing cache coherence. There is a control bit I can set when initiating DMA to enable or disable cache snooping during DMA, clearly for performance I would like to leave cache snooping disabled if at all

DMA与PIO是什么东西?

懵懂的女人 提交于 2019-11-29 00:07:47
1. DMA全称是什么?   Direct Memory Access 2. PIO全称是什么?   Programming Input/Output 3. DMA与PIO是两种不同的模式   3.1 DMA     不经过CPU而直接从内存了存取数据的数据交换模式   3.2 PIO     通过CPU执行I/O端口指令来进行数据的读写的数据交换模式 来源: https://www.cnblogs.com/dakewei/p/11434003.html

Linux 下的DMA浅析

不打扰是莪最后的温柔 提交于 2019-11-29 00:02:20
DMA是一种无需CPU的参与就可以让外设和系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。DMA经常与硬件体系结构特别是外设的总线技术密切相关。 一、DMA控制器硬件结构 DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。 数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输。 a -- 软件请求数据 调用的步骤可以概括如下(以read为例): (1)在进程调用 read 时,驱动程序的方法分配一个 DMA 缓冲区,随后指示硬件传送它的数据。进程进入睡眠。 (2)硬件将数据写入 DMA 缓冲区并在完成时产生一个中断。 (3)中断处理程序获得输入数据,应答中断,最后唤醒进程,该进程现在可以读取数据了。 b -- 由硬件异步传输 在 DMA 被异步使用时发生的。以数据采集设备为例: (1)硬件发出中断来通知新的数据已经到达。 (2)中断处理程序分配一个DMA缓冲区。 (3)外围设备将数据写入缓冲区,然后在完成时发出另一个中断。 (4)处理程序利用DMA分发新的数据,唤醒任何相关进程。 网卡传输也是如此,网卡有一个循环缓冲区(通常叫做 DMA 环形缓冲区)建立在与处理器共享的内存中

linux内核之dmaengine

可紊 提交于 2019-11-29 00:01:27
dmaengine framwork主要分为两部分:DMA controller 和DMA engine API。涉及内核相关文档:Documentation/damengine目录、Documentation/devicetree/bindings/dma/、Documentation/DAM-API-HOWTO.txt\DMA-API.txt\DMA-attributes.txt 1、dma controller(provider的角度) 基于DMA的硬件地址使用的是总线地址而不是物理地址,总线地址是从设备角度看到的内存地址,物理地址是从CPU mmu控制器外围角度上看到的内存地址。在pc上,对于ISA和PCI而言,总系地址即为物理地址,但并不是每个平台都是如此。接口总线通过桥接电路连接,桥接电路会将I/O地址映射为不同的物理地址,例如在PREP(PowerPC Reference Platform)系统中,物理地址0在设备端看起来是0x80000000,而0通常又被映射为虚拟地址0xC0000000,所以同一个地址就具备了三重身份:物理地址0,总线地址0x80000000及虚拟地址0xC0000000。 (1)重要数据结构之struct dma_device 该结构体抽象了dma controller,部分成员说明如下: channels:一个链表头