DMA的基本概念

DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。

数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输。

在第一种情况下,调用的步骤可以概括如下(以read为例):

(1)在进程调用 read 时,驱动程序的方法分配一个 DMA 缓冲区,随后指示硬件传送它的数据。进程进入睡眠。

(2)硬件将数据写入 DMA 缓冲区并在完成时产生一个中断。

(3)中断处理程序获得输入数据,应答中断,最后唤醒进程,该进程现在可以读取数据了。

第二种情形是在 DMA 被异步使用时发生的。以数据采集设备为例:

(1)硬件发出中断来通知新的数据已经到达。

(2)中断处理程序分配一个DMA缓冲区。

(3)外围设备将数据写入缓冲区,然后在完成时发出另一个中断。

(4)处理程序利用DMA分发新的数据,唤醒任何相关进程。

网卡传输也是如此,网卡有一个循环缓冲区(通常叫做 DMA 环形缓冲区)建立在与处理器共享的内存中。每一个输入数据包被放置在环形缓冲区中下一个可用缓冲区,并且发出中断。然后驱动程序将网络数据包传给内核的其它部分处理,并在环形缓冲区中放置一个新的 DMA 缓冲区。

驱动程序在初始化时分配DMA缓冲区,并使用它们直到停止运行。

转载于:https://www.cnblogs.com/dylancao/p/10119037.html

### DMA(Direct Memory Access)概念详解 #### DMA 的基本定义 直接存储器存取(Direct Memory Access, DMA)是一种硬件机制,允许外部设备或内部外设不通过中央处理器(CPU)而直接与系统的主存储器交换数据。这种方式显著减少了 CPU 在大量数据传输过程中所承担的工作负荷[^1]。 #### DMA 工作原理概述 当需要执行大容量的数据传送任务时,DMA 控制器接管系统总线并负责管理整个数据移动流程。这期间涉及四个主要阶段: - **DMA 请求**:目标外设向 DMA 控制器发出请求信号表明其准备就绪可以开始数据传递。 - **DMA 响应**:一旦接收到有效申请后,DMA 控制器将协调安排合适的时机介入工作,并从当前运行环境中夺取必要的资源权限比如地址/数据通道等。 - **DMA 传输**:在此状态下,DMA 完全掌控着这些线路直到全部预定资料都被成功搬运完毕为止;其间可能采用连续大批量的方式快速灌输信息流至目的地端口——这种策略被称为突发模式(burst mode)[^3]。 - **DMA 结束**:最后一步则是释放之前占用的一切设施返回正常运作条件之下同时触发相应的事件标志告知应用程序层面上该进程已完成。 #### 物理地址限制及其解决方案 值得注意的是,在某些较老式的架构里头比如说 ISA 总线体系结构下的 DMA 控制单元仅仅能够触及有限区间内的 RAM 单元位置(大约是从零起步延伸到十六兆字节处)。为了克服这一局限性问题,则引入了一个特别命名区域叫做 ZONE_DMA ,它扩展了可供分配给那些老旧型号使用的更高层次上的逻辑区块映射表单从而确保即使面对超出初始规划范畴之外的大规模作业也依然具备可行性选项可用[^2]。 ```c // C语言伪代码演示简单的DMA初始化设置过程 void init_dma(int channel, void* src_addr, void* dst_addr, size_t length){ dma_set_channel(channel); dma_configure_source_address(src_addr); dma_configure_destination_address(dst_addr); dma_set_transfer_length(length); dma_enable_interrupt_on_completion(); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值