CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  系统维护与使用区

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

楼主jayli426(jayli426)2006-03-04 11:34:08 在 Linux/Unix社区 / 系统维护与使用区 提问

资料上在介绍直接  
  有这样一段话  
   
  "数据直接在源地址和目的地址之间传送,  
  不需要中间媒介。  
  如果通过CPU把一个字节从适配卡传送至内存,  
  需要两步操作。  
  首先,CPU把这个字节从适配卡读到内部寄存器中,  
  然后再从寄存器传送到内存的适当地址。  
  DMA控制器将这些操作简化为一步,  
  它操作总线上的控制信号,  
  使写字节一次完成。  
  这样大大提高了计算机运行速度和工作效率"  
  关键是这句话  
  "  
  如果通过CPU把一个字节从适配卡传送至内存,  
  需要两步操作。  
  首先,CPU把这个字节从适配卡读到内部寄存器中,  
  然后再从寄存器传送到内存的适当地址  
  "  
  确实我有些晕拉,如果按我平时理解的处理流程应该是  
  "  
    数据从外围设备读入内存,然后cpu从内存读取数据,开始相应的计算  
    控制单元负责译码,转发指令,中间的操作数才放在(通用)寄存器,计算完毕  
    才回写到内存,然后传送至硬盘,显示器等外围设备    
  "  
  既然如此,为何"  
  首先,CPU把这个字节从适配卡读到内部寄存器中,  
  然后再从寄存器传送到内存的适当地址  
  "为何这时采取一个相反的流程呢?  
   
   
  我的理解肯定有误,但是问题在哪里阿??  
   
  这里提个更幼稚的问题,不要笑阿,我是蔡鸟:  
  在现实中这个适配卡通常适用与显卡,而非硬盘的的IDE口  
  所有的接口都是可以插适配卡的吗  
  硬盘其实就应该叫作硬盘适配卡???  
  问题点数:50、回复次数:7Top

1 楼robinswan()回复于 2006-03-04 12:02:31 得分 0

呵呵,别看这些无聊的资料,写的人他自己都不明白是怎么回事!  
  随便找个当代的   CPU   和资料,上面的片上外围现在基本都是   DMA.  
  现在的显示、音频...等等设备也基本是   DMA   。  
   
  一看就明白!  
   
  当然,你最好有   ASIC   的基础和知识。Top

2 楼jayli426(jayli426)回复于 2006-03-04 12:58:32 得分 0

资料,网上,书我都查拉哦  
   
  这是取自<<操作系统>>(gary   nutt)上的一段话:  
  "  
  ALU(即CPU的算术逻辑单元)还包括一组通用寄存器来保存  
  将被功能单元使用的操作数  
  通过执行load机器指令,寄存器的内容会从主存储器中加载  
  寄存的内容可以通过store机器指令写回主存储器  
  "  
  load时候应该是先内存后寄存的阿  
  到底该如何理解DMA阿Top

3 楼fierygnu(va_list)回复于 2006-03-04 14:01:51 得分 10

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

4 楼tb01412(tb)回复于 2006-03-04 23:51:53 得分 15

那本书上说得没错的,一般说来,CPU操作外设时,将外设的数据读到内部寄存器中,再将数据传送至内存中,关键就是最后这一句,为什么CPU还把数据送到内存中呢???因为CPU内部寄存器是很少的,不可能用内部寄存器来存储很多数据,所以都是用RAM来临时存储大量的代码与数据,CPU运行的核心就是一个PC指针,这个PC指针指向什么地址,CPU就会把相应地址处的二进制数据送至内部进行译码运行!!!!所以RAM就是一个临时存储代码与数据的地方,CPU要执行代码时就到内存中去取指令。那些外设上的数据也被临时存储到了内存中,有些必要的数据有可能会被操作系统的驱动写入到另一外设中!!!!!  
   
  DMA却是另一个概念,在现代操作系统中,外设有数据到来时,基本上都采用中断方式通知CPU,操作系统响应中断,然后再从外设读取数据,这时,如果外设的数据比较频繁,那么是否每到一个数据都中断一次呢??这样CPU就非常频繁地被外调中断打断,操作系统在处理中断时要浪费一定时间,而且CPU读外部IO速度也很慢,这样的话,大量时间被用在了响应中断上,而去调度其它任务的时间减少,让人感觉系统响应速度不够,也会影响外设的数据传输速度(如果外设传输速度太快,操作系统就有可能丢失部分数据),所以就采用了DMA的传输方式:  
  这种方式下,外设直接将一块数据放在了RAM中,然后再产生一次中断,这样操作系统直接将内存中的那块数据传给想要获取这块数据的一个任务(或者放在内存的另一空闲部分),此时,系统就少了频繁响应外设中断的开销,也少了读取外设IO的时间开销(读取RAM比读取外设IO要快很多),这就是DMA的作用所在!!!!!!Top

5 楼pyh(天天)回复于 2006-03-05 21:29:08 得分 5

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

6 楼pyh(天天)回复于 2006-03-05 21:43:41 得分 15

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

7 楼yjf7888(seeking a place 找工作了location:Chengdu)回复于 2006-03-06 17:58:23 得分 5

mark,空了细看Top

相关问题

  • 存储器是内存?
  • 系统存储器和扩展存储器都在内存条上,是不是?
  • 存储单元与存储元,内存单元三者的区别
  • 请教:如何在数据库内存储图片??急用!
  • 编译系统中文法在内存中的存储结构!
  • 我希望了解一串字符串在内存的存储!
  • 数据结构在内存中存储地址的问题
  • 一个关于内存存储的简单问题
  • 关于static类型成员在内存里的存储问题
  • 整数在TC(内存中)存储的问题?

关键词

  • 内存
  • 数据
  • 中断
  • cpu
  • 操作系统
  • 指令
  • 硬盘
  • 译码
  • 控制器
  • 流程

得分解答快速导航

  • 帖主:jayli426
  • fierygnu
  • tb01412
  • pyh
  • pyh
  • yjf7888

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo