当前位置: 技术问答>linux和unix
一直不明白DMA(直接内存存储)
来源: 互联网 发布时间:2015-11-12
本文导语: 资料上在介绍直接 有这样一段话 "数据直接在源地址和目的地址之间传送, 不需要中间媒介。 如果通过CPU把一个字节从适配卡传送至内存, 需要两步操作。 首先,CPU把这个字节从适配卡读到内部寄存器中, 然后再...
资料上在介绍直接
有这样一段话
"数据直接在源地址和目的地址之间传送,
不需要中间媒介。
如果通过CPU把一个字节从适配卡传送至内存,
需要两步操作。
首先,CPU把这个字节从适配卡读到内部寄存器中,
然后再从寄存器传送到内存的适当地址。
DMA控制器将这些操作简化为一步,
它操作总线上的控制信号,
使写字节一次完成。
这样大大提高了计算机运行速度和工作效率"
关键是这句话
"
如果通过CPU把一个字节从适配卡传送至内存,
需要两步操作。
首先,CPU把这个字节从适配卡读到内部寄存器中,
然后再从寄存器传送到内存的适当地址
"
确实我有些晕拉,如果按我平时理解的处理流程应该是
"
数据从外围设备读入内存,然后cpu从内存读取数据,开始相应的计算
控制单元负责译码,转发指令,中间的操作数才放在(通用)寄存器,计算完毕
才回写到内存,然后传送至硬盘,显示器等外围设备
"
既然如此,为何"
首先,CPU把这个字节从适配卡读到内部寄存器中,
然后再从寄存器传送到内存的适当地址
"为何这时采取一个相反的流程呢?
我的理解肯定有误,但是问题在哪里阿??
这里提个更幼稚的问题,不要笑阿,我是蔡鸟:
在现实中这个适配卡通常适用与显卡,而非硬盘的的IDE口
所有的接口都是可以插适配卡的吗
硬盘其实就应该叫作硬盘适配卡???
有这样一段话
"数据直接在源地址和目的地址之间传送,
不需要中间媒介。
如果通过CPU把一个字节从适配卡传送至内存,
需要两步操作。
首先,CPU把这个字节从适配卡读到内部寄存器中,
然后再从寄存器传送到内存的适当地址。
DMA控制器将这些操作简化为一步,
它操作总线上的控制信号,
使写字节一次完成。
这样大大提高了计算机运行速度和工作效率"
关键是这句话
"
如果通过CPU把一个字节从适配卡传送至内存,
需要两步操作。
首先,CPU把这个字节从适配卡读到内部寄存器中,
然后再从寄存器传送到内存的适当地址
"
确实我有些晕拉,如果按我平时理解的处理流程应该是
"
数据从外围设备读入内存,然后cpu从内存读取数据,开始相应的计算
控制单元负责译码,转发指令,中间的操作数才放在(通用)寄存器,计算完毕
才回写到内存,然后传送至硬盘,显示器等外围设备
"
既然如此,为何"
首先,CPU把这个字节从适配卡读到内部寄存器中,
然后再从寄存器传送到内存的适当地址
"为何这时采取一个相反的流程呢?
我的理解肯定有误,但是问题在哪里阿??
这里提个更幼稚的问题,不要笑阿,我是蔡鸟:
在现实中这个适配卡通常适用与显卡,而非硬盘的的IDE口
所有的接口都是可以插适配卡的吗
硬盘其实就应该叫作硬盘适配卡???
|
那本书上说得没错的,一般说来,CPU操作外设时,将外设的数据读到内部寄存器中,再将数据传送至内存中,关键就是最后这一句,为什么CPU还把数据送到内存中呢???因为CPU内部寄存器是很少的,不可能用内部寄存器来存储很多数据,所以都是用RAM来临时存储大量的代码与数据,CPU运行的核心就是一个PC指针,这个PC指针指向什么地址,CPU就会把相应地址处的二进制数据送至内部进行译码运行!!!!所以RAM就是一个临时存储代码与数据的地方,CPU要执行代码时就到内存中去取指令。那些外设上的数据也被临时存储到了内存中,有些必要的数据有可能会被操作系统的驱动写入到另一外设中!!!!!
DMA却是另一个概念,在现代操作系统中,外设有数据到来时,基本上都采用中断方式通知CPU,操作系统响应中断,然后再从外设读取数据,这时,如果外设的数据比较频繁,那么是否每到一个数据都中断一次呢??这样CPU就非常频繁地被外调中断打断,操作系统在处理中断时要浪费一定时间,而且CPU读外部IO速度也很慢,这样的话,大量时间被用在了响应中断上,而去调度其它任务的时间减少,让人感觉系统响应速度不够,也会影响外设的数据传输速度(如果外设传输速度太快,操作系统就有可能丢失部分数据),所以就采用了DMA的传输方式:
这种方式下,外设直接将一块数据放在了RAM中,然后再产生一次中断,这样操作系统直接将内存中的那块数据传给想要获取这块数据的一个任务(或者放在内存的另一空闲部分),此时,系统就少了频繁响应外设中断的开销,也少了读取外设IO的时间开销(读取RAM比读取外设IO要快很多),这就是DMA的作用所在!!!!!!
DMA却是另一个概念,在现代操作系统中,外设有数据到来时,基本上都采用中断方式通知CPU,操作系统响应中断,然后再从外设读取数据,这时,如果外设的数据比较频繁,那么是否每到一个数据都中断一次呢??这样CPU就非常频繁地被外调中断打断,操作系统在处理中断时要浪费一定时间,而且CPU读外部IO速度也很慢,这样的话,大量时间被用在了响应中断上,而去调度其它任务的时间减少,让人感觉系统响应速度不够,也会影响外设的数据传输速度(如果外设传输速度太快,操作系统就有可能丢失部分数据),所以就采用了DMA的传输方式:
这种方式下,外设直接将一块数据放在了RAM中,然后再产生一次中断,这样操作系统直接将内存中的那块数据传给想要获取这块数据的一个任务(或者放在内存的另一空闲部分),此时,系统就少了频繁响应外设中断的开销,也少了读取外设IO的时间开销(读取RAM比读取外设IO要快很多),这就是DMA的作用所在!!!!!!
|
确实我有些晕拉,如果按我平时理解的处理流程应该是
"
数据从外围设备读入内存,然后cpu从内存读取数据,开始相应的计算
控制单元负责译码,转发指令,中间的操作数才放在(通用)寄存器,计算完毕
才回写到内存,然后传送至硬盘,显示器等外围设备
"
既然如此,为何"
首先,CPU把这个字节从适配卡读到内部寄存器中,
然后再从寄存器传送到内存的适当地址
"为何这时采取一个相反的流程呢?
============================================================================
才看明白你想问什么,拿我告诉你,你对访问数据的理解是错误的,估计你对汇编语言不是
很熟,关键是这句话"cpu从内存读数据",应该是cpu从地址读数据,因为计算机启动后,会有地址映射,所有的外设都分配到了一段地址(有的外设是io地址,看具体情况了),cpu通过访问地址来访问外设,比如访问适配卡,在系统启动后,可能分配了io地址0xc0000000(随便写一个),那么从汇编语言来看,从适配卡读一个数据写入内存,应该是这样的,
LOAD A,(0XC0000000);
STA (0Xxxxxxxxx); //写入内存
你如果学习一下汇编语言,会对计算体系结构有更好的认识:)
"
数据从外围设备读入内存,然后cpu从内存读取数据,开始相应的计算
控制单元负责译码,转发指令,中间的操作数才放在(通用)寄存器,计算完毕
才回写到内存,然后传送至硬盘,显示器等外围设备
"
既然如此,为何"
首先,CPU把这个字节从适配卡读到内部寄存器中,
然后再从寄存器传送到内存的适当地址
"为何这时采取一个相反的流程呢?
============================================================================
才看明白你想问什么,拿我告诉你,你对访问数据的理解是错误的,估计你对汇编语言不是
很熟,关键是这句话"cpu从内存读数据",应该是cpu从地址读数据,因为计算机启动后,会有地址映射,所有的外设都分配到了一段地址(有的外设是io地址,看具体情况了),cpu通过访问地址来访问外设,比如访问适配卡,在系统启动后,可能分配了io地址0xc0000000(随便写一个),那么从汇编语言来看,从适配卡读一个数据写入内存,应该是这样的,
LOAD A,(0XC0000000);
STA (0Xxxxxxxxx); //写入内存
你如果学习一下汇编语言,会对计算体系结构有更好的认识:)
|
DMA的目的是不通过CPU存取内存,减少中间环节,提高性能。
你的理解“数据从外围设备读入内存”,这就是DMA了。内存是CPU的外存,是由CPU控制的,外围设备怎么能够自己读入内存呢,它只能读入自己的缓存(比如硬盘现在都讲这个指标),然后触发中断CPU,CPU设置DMA控制器,由DMA控制器把外围设备的数据直接写入内存,这时CPU就可以完成其它事情了。
看看计算机体系结构的书。
你的理解“数据从外围设备读入内存”,这就是DMA了。内存是CPU的外存,是由CPU控制的,外围设备怎么能够自己读入内存呢,它只能读入自己的缓存(比如硬盘现在都讲这个指标),然后触发中断CPU,CPU设置DMA控制器,由DMA控制器把外围设备的数据直接写入内存,这时CPU就可以完成其它事情了。
看看计算机体系结构的书。
|
学习一下计算机体系结构就清楚了,DMA实际上是盗用了总线时间来传输数据,而且由于是硬件处理,所以大大加速了数据复制速度!
|
mark,空了细看