DMA是什么?

DMA是什么?
当我们向计算机中加入了一块新的声卡或其它适配卡时,安装程序可能会提醒我们应该选择一个DMA通道。那DMA是什么呢?
DMA(Direct Memory Access) ,即直接存储器存取,是一种快速传送数据的机制。数据传递可以从适配卡到内存,从内存到适配卡或从一段内存到另一段内存。DMA技术的重要性在于,利用它进行数据传送时不需要CPU的参与。每台电脑主机板上都有DMA控制器,通常计算机对其编程,并用一个适配器上的ROM(如软盘驱动控制器上的ROM)来储存程序,这些程序控制DMA传送数据。一旦控制器初始化完成,数据开始传送,DMA就可以脱离CPU,独立完成数据传送。在DMA传送开始的短暂时间内,基本上有两个处理器为它工作,一个执行程序代码,一个传送数据。
利用DMA传送数据的另一个好处是,数据直接在源地址和目的地址之间传送,不需要中间媒介。如果通过CPU把一个字节从适配卡传送至内存,需要两步操作。首先,CPU把这个字节从适配卡读到内部寄存器中,然后再从寄存器传送到内存的适当地址。DMA控制器将这些操作简化为一步,它操作总线上的控制信号,使写字节一次完成。这样大大提高了计算机运行速度和工作效率。
计算机发展到今天,DMA已不再用于内存到内存的数据传送,因为CPU速度非常快,做这件事,比用DMA控制还要快,但要在适配卡和内存之间传送数据,仍然是非DMA莫属。要从适配卡到内存传送数据,DMA同时触发从适配卡读数据总线(即I/O读操作)和向内存写数据的总线。激活I/O读操作就是让适配卡把一个数据单位(通常是一个字节或一个字)放到PC数据总线上,因为此时内存写总线也被激活,数据就被同时从PC总线上拷贝到内存中。对于每一次写操作,DMA控制器都控制地址总线,通知应将数据写到哪段内存中去。
DMA控制数据从内存传送到适配卡的方法与上面类似。对每一个要传送的单位数据,DMA控制器激活读内存和I/O写操作的总线。内存地址被放到地址总线上,像从适配卡到内存传送数据一样,以数据总线为通道,数据从源地址直接传送到目的地址。
DMA从DMA请求线(DREQ)上接收DMA请求,正像中断控制器从中断请求线(IRQ)上接收中断请求一样。一个典型的从适配卡到内存的数据传送是这样进行的,首先,对DMA控制器编程,写入数据要到达的内存地址和要传送的字节数。适配器可以开始传送数据时,它将激活DREQ线,与DMA控制器连通。DMA控制器在与CPU取得总线控制权后,输出内存地址,发送控制信号,使得一个字节或一个字从适配器读出并写入相应内存中,然后更新内存地址,指向下一个字节(或字)要写入的地址,重复上面的操作,直至数据传送完毕。对控制器进行不同编程,就可以实现单字节传送(即每传送一个字节都要求一个DREQ信号)或块数据传送(即全部数据传送只需要一个DREQ信号)。
如果你要往计算机中插一块适配卡,而且适配卡使用DMA,通常安装程序会让你选择一个DMA通道,设定DIP开关或跳线,来为相应适配器设置DMA通道。尽管从理论上讲,只要不是同时使用DREQ线,不同的适配卡可以共享这条线的,但是按常规,我们最好为每个适配卡单独安排一个DMA通道,这样就可以保证不会发生DMA冲突。附表是DMA的缺省分配情况。
通道 功能 通道 功能
O 空闲 4 用于级联DMA控制器
1 空闲 5 空闲
2 软盘 6 空闲
3 空闲 7 空闲
从中可以看出,DMA通道2和4已被占用,在大多数微机上,通道1、3、5、6和7可由你任意分配。我们平时最好对自己的计算机上DMA通道的分配情况记录下来,以免我们向计算机增加新硬件时出现两个适配卡共用一个通道,导致冲突。
### DMA的定义和功能 DMA(Direct Memory Access,直接存储器存取)是一种允许外部设备与计算机内存之间直接进行数据传输的技术[^1]。在该机制下,数据可以直接从外设(如硬盘、网络适配器等)传递到内存,或者从内存传递到外设,而无需CPU的直接干预[^2]。 #### DMA的功能 1. **减少CPU负担**:在没有DMA的情况下,CPU需要参与每一步的数据传输操作,例如从外设读取数据并写入内存。这种操作会占用大量的CPU时间,尤其是在需要频繁进行I/O操作时。通过使用DMA控制器,CPU只需初始化传输过程,之后可以释放出来执行其他任务。 2. **提高数据传输效率**:DMA技术简化了数据传输的过程。例如,在将数据从外设传送到内存时,传统的做法是先将数据读取到CPU的寄存器中,然后再写入内存。而使用DMA后,数据可以直接从外设通过总线传送到内存,减少了中间步骤,从而提高了传输速度和效率[^2]。 3. **支持并发操作**:在多道程序设计中,DMA使得CPU可以在等待I/O完成的同时切换到其他任务。这显著提高了系统的并发性和整体性能[^1]。 4. **独立的数据传输控制**:DMA控制器在初始化完成后,能够独立于CPU完成数据传输任务。它通过控制地址总线和数据总线来实现数据的读写操作,确保数据准确无误地从源地址传递到目标地址[^2]。 ```python # 示例代码展示如何通过DMA控制器进行数据传输 def dma_transfer(source, destination, size): # 初始化DMA控制器 dma_controller = initialize_dma() # 配置传输参数 dma_controller.set_source_address(source) dma_controller.set_destination_address(destination) dma_controller.set_transfer_size(size) # 启动传输 dma_controller.start_transfer() # 等待传输完成 while not dma_controller.is_transfer_complete(): pass print("Data transfer complete via DMA.") ``` #### DMA工作原理 DMA控制器接收到数据传输请求后,会接管系统总线(包括地址总线、数据总线和控制总线),然后根据配置的参数执行数据传输。一旦传输完成,DMA控制器会释放总线控制权,并通知CPU传输结束[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值