1、PIO
总线上的数据的传递有两种形式。一种为程控输入/输出(PIO)另一种为直接存储器访问(DMA)。
使用PIO时,CPU是主模块,总线上数据的读取由CPU上运行的软件程序直接发起,传递的数据一定进过CPU(如下面的一、二所述)。
一、软件指令或者将已经存放在CPU数据寄存器中的数据发送到目标被控模块;
二、或者将目标被控模块里的一个数据读入,放到CPU的数据寄存器中。
例如:需要将数据从模块A---转移到----模块B,软件将这个任务分解为两个PIO操作:
第一步:从模块A读取数据,并存放到CPU的数据寄存器中;
第二步:将存放在CPU数据寄存器中的数据写入到模块B。
由于链接芯片与芯片之间的系统总线的时钟频率比CPU内部的时钟频率要低许多,用PIO读写大量的数据是一种非常低效的方式占用CPU的处理能力。所以需要利用专门的硬件来协助执行,在芯片与芯片之间或者模块与模块之间数据传输。这就是DMA。
2、DMA
此时软件只需要将传输数据要求使用PIO通知DMA硬件,DMA硬件按照要求执行数据的传输。这期间CPU继续进行其他工作。当DMA硬件执行完毕数据的传输任务之后,通过中断信号或这通过向主存储的某个特定地址写入特定的数值,通知软件。
一个DMA硬件通常包括多个DMA通道。每个通道一般用于一对模块之间的数据传输,通道之间相互独立。
DMA描述符用于指定如何传输数据块。一个DMA描述符至少包括数据传输的源地址(SA)、目的地址(DA)、需要传输的数据量(data size)、和每次总线传输的数据量(transfer size)。有些DMA模块要求软件将DMA描述符的数据结构存放在主存储器中,使用这个方法的好处时软件可以十分有效的建立DMA描述符。在DMA执行一个DMA数据传输任务之前,DMA先要用DMA的方法,将存放在CPU主存储的DMA描述符读到DMA模块中。
DMA将一个数据块的传输分为两个步骤。
第一步:从源地址的被控模块读取数据;
第二步:将读取的数据写入目的地址的被控模块。
根据DMA描述符的规定,DMA可以在传输了一个数据块之后,自动的将源地址和目的地址更新到下一个数据块地址,然后DMA开始传输下一个数据块,一直传输完实际要求传输的数量级。假设一个DMA开始传输的数据量是128Byte,每次传输的数据块是16Byte,为了完成这个DMA描述符指定的数据传输,DMA自动进行8次总线读取和8次总线写入。这些传输路径不经过CPU