当前位置:  技术问答>linux和unix

一直不明白DMA(直接内存存储)

    来源: 互联网  发布时间:2015-11-12

    本文导语:  资料上在介绍直接 有这样一段话 "数据直接在源地址和目的地址之间传送, 不需要中间媒介。 如果通过CPU把一个字节从适配卡传送至内存, 需要两步操作。 首先,CPU把这个字节从适配卡读到内部寄存器中, 然后再...

资料上在介绍直接
有这样一段话

"数据直接在源地址和目的地址之间传送,
不需要中间媒介。
如果通过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的作用所在!!!!!!

|
确实我有些晕拉,如果按我平时理解的处理流程应该是
"
 数据从外围设备读入内存,然后cpu从内存读取数据,开始相应的计算
 控制单元负责译码,转发指令,中间的操作数才放在(通用)寄存器,计算完毕
 才回写到内存,然后传送至硬盘,显示器等外围设备 
"
既然如此,为何"
首先,CPU把这个字节从适配卡读到内部寄存器中,
然后再从寄存器传送到内存的适当地址
"为何这时采取一个相反的流程呢?
============================================================================
才看明白你想问什么,拿我告诉你,你对访问数据的理解是错误的,估计你对汇编语言不是
很熟,关键是这句话"cpu从内存读数据",应该是cpu从地址读数据,因为计算机启动后,会有地址映射,所有的外设都分配到了一段地址(有的外设是io地址,看具体情况了),cpu通过访问地址来访问外设,比如访问适配卡,在系统启动后,可能分配了io地址0xc0000000(随便写一个),那么从汇编语言来看,从适配卡读一个数据写入内存,应该是这样的,
           LOAD A,(0XC0000000);
           STA  (0Xxxxxxxxx);  //写入内存
你如果学习一下汇编语言,会对计算体系结构有更好的认识:)

|
DMA的目的是不通过CPU存取内存,减少中间环节,提高性能。

你的理解“数据从外围设备读入内存”,这就是DMA了。内存是CPU的外存,是由CPU控制的,外围设备怎么能够自己读入内存呢,它只能读入自己的缓存(比如硬盘现在都讲这个指标),然后触发中断CPU,CPU设置DMA控制器,由DMA控制器把外围设备的数据直接写入内存,这时CPU就可以完成其它事情了。
看看计算机体系结构的书。

|
学习一下计算机体系结构就清楚了,DMA实际上是盗用了总线时间来传输数据,而且由于是硬件处理,所以大大加速了数据复制速度!

|
mark,空了细看

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 这几个是什么服务,不明白为什么一直开启?一直都没弄明白过
  • 请教大家!!!java如何实现多重继承?接口该如何使用?份数可以再加,只要我明白了
  • 一个问题,有点不明白!!!
  • linux crontab 设定老是想不明白。。。。
  • 有句话不明白,求解释
  • 关于终端的一些小问题,不明白。。。
  • Makefile中的一句不明白,关于shell中sed函数
  • 我在看一个GNU软件时发现有这么一句,不明白什么意思
  • 不明白seteuid()的作用
  • i=$(($i+1))。为什么i=$($i+1)就不行呢?不明白里面那层括号起什么作用。
  • 在init脚本中屡屡看到类似命令,不明白的说:mount -t sysfs /sys /sys
  • VMWare上装了个Fedora,但装不上VMWareTools,新手,不明白为什么
  • 总算明白gettext函数是怎么用的了!散分
  • 想了解LINUX一定能明白汇编语言吗?
  • 请问:什么是组合?看了THINGKING IN JAVA后,还是不是很明白
  • 我不是很明白,请帮忙!
  • method overriding 的意思我明白,但在中文里应该翻译成什么为好?
  • 关于字体的问题?实在是看不明白sun的api文档!!!!!!!!!!!!
  • 灌水贴子,有什么不明白到www.52jsp.com论坛看看
  • 小弟一直弄不明白this这个关键字。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3