阅读 196

DMA-直接存储器存取(dma是实现储存器与什么直接数据传送)

1、什么是DMA?

目前在块设备的 I/O 系统中,普遍采用直接存储器存取(Direct Memory Access,DMA)I/O控制方式,即DMA控制方式。

DMA控制方式是一种快速传送数据的机制,外部设备在 DMA控制器 的支持下直接与内存交换数据,在每个数据块传送的过程中不需要CPU的干预。

DMA控制器

DMA控制器是采用DMA方式的外部设备与系统总线之间的接口电路,主要用于高速I/O设备与主存之间成块的数据传送,由 主机与DMA控制器的接口、DMA控制器与块设备的接口 和 I/O控制逻辑 三部分组成。

DMA.jpg

DMA控制器与CPU共用地址总线、数据总线以及一些信号控制线。在进行直接内存数据交换时,DMA控制器接管CPU所管理的总线,控制外部设备与内存之间的成批数据传送,在所有数据传送完成后由CPU回收总线控制权。DMA控制方式减少了CPU对I/O过程的干预,从每传输一个字(字节)干预一次减少到每传输一个数据块干预一次,从而提高了传输的效率。

寄存器

为了实现主机与DMA控制器之间成块数据的直接交换,DMA控制器设置了4类寄存器:

(1)命令/状态寄存器(CR)

用于接收从 CPU发来的 I/O命令或控制信息,或者存放设备的状态

(2)内存地址寄存器(MAR)

在输入时(从设备传送到内存)存放数据在设备(如磁盘)的起始地址;在输出时(从内存传送到设备)存放数据在内存的源地址

(3)数据缓冲寄存器(DR)

用于暂存从设备到内存或从内存到设备的数据

(4)数据计数器(DC)

数据计数器也称为字计数器,用于记录本次要读/写的字(字节)数

DMA组成1.jpg

2、DMA工作机制

DMA控制方式传送数据的过程可以分为三个阶段:预处理、数据传送、传送后处理。

预处理阶段

DMA控制器的命令/状态寄存器(CR)接收到CPU发出的I/O命令,将内存起始地址(输入数据到内存)或内存源地址(内存输出数据)写入内存地址寄存器(MAR),同时将要传送的字(字节)数存入字计数器(DC)。随后将外设中的源地址(或目标地址)直接送入 DMA控制器的I/O控制逻辑,然后启动DMA控制器进行数据传送。

数据传送阶段

CPU将总线控制权让给DMA控制器,并且在数据传送期间不再使用总线。DMA控制器按照内存地址寄存器(MAR)的指示,不断在设备与内存之间进行数据传输,并随时修改内存地址寄存器(MAR)和字计数器(DC)的值。

当一个数据块传输完毕或数据计数器的值减少到0时(所有数据都已传输完毕),传输停止并且向CPU发出中断信号。

传送后处理阶段

CPU响应DMA控制器的中断请求。如果数据传送完成,则转向相应的中断处理程序进行后续处理;如果还有数据需要传送,则按照相同方法重新启动剩余数据的传送。

在DMA控制方式中,CPU只是在每个数据块传输的开始和结束实施控制,在数据块的传输过程中则由DMA控制器控制。

3、DMA的实现

现代计算机操作系统较多地采用DMA控制器与DMA接口相分离的方式,也就是将广义的DMA控制器进一步划分为DMA控制器和DMA接口。

DMA控制器

将 申请和接管总线的控制权、发出传输命令和主存地址、控制DMA传输过程的起始和终止 等通用部分抽离,作为控制系统总线的设备之一为各DMA接口公用,并以集成芯片的形式装配在主板上。

DMA接口

DMA接口则实现与设备的连接和数据缓冲,反映设备的特定要求。

DMA组成.jpg

从连接模式上看,将DMA控制器与接口分离的方式,应用于有多台I/O设备连接需求的 多路型DMA控制器模式。I/O接口中含有数据缓冲寄存器或小容量缓冲寄存器,数据经接口与数据总线直接向主存传输,不经过DMA控制器(DMA控制器负责申请并接管总线)。DMA控制器就可以通用并便于集成化,不受具体设备特性的约束。

4、优势与局限性

使用DMA的优势

相对程序中断I/O每个字都需要中断CPU的工作方式相比,DMA控制方式在数据块传送完成后中断一次CPU,减少了CPU中断处理的次数。同时,DMA控制方式下的数据传送是在DMA控制器的控制下完成的,在每个数据库传送的过程中无须CPU的干预,减轻了CPU的开销(减少了CPU的工作量并缩短了CPU占用时间),从而提高了系统的效率。

使用DMA的局限性

DMA控制方式虽然能够满足高速数据传输的需求,但是每传送一个数据块都需要向CPU发出中断,并且每个数据块传送开始或结束时,CPU都要介入其中进行处理,以实现CPU与设备的并行操作,因此效率仍不够高。

另一方面,CPU发出的每条I/O指令只能读、写同一块内存区域中的连续数据块,不能满足复杂I/O操作的需求。

5、Scatter-Gather模式

DMA控制器在进行数据传输的过程中,要求源物理地址和目标物理地址必须是连续的。但是在现实计算机体系中,连续的存储器地址在物理上不一定是连续的(CPU以虚拟地址寻址),所以DMA传输可能要分成多次完成。DMA控制器在传输完一块物理上连续的数据后引起一次中断,然后再由CPU触发进行下一块物理存储空间上的数据传输,这种方式被称为 Block DMA。

与Block DMA方式相对应的是Scatter-Gather DMA(S-G DMA,分散/聚集模式)。Scatter-Gather DMA是对Block DMA的增强,通过减少重复的DMA传送请求来提高效率。Scatter-Gather DMA将物理上分散的多个不连续存储空间以链表(struct scatterlist,链表或数组实现)形式组织起来,然后通过一次DMA的传输操作在主存RMA和设备之间传输数据。

Scatter-Gather DAM在完成一块物理连续的数据传送后,不用发起CPU中断操作,而是根据链表来传输下一块物理存储空间上的数据,直到所有数据传输完毕后再发起一次中断。


作者:张小胜
链接:https://juejin.cn/post/7031187738871365646


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐