cache、虚拟内存、内存的区别以及DMA的概念

本文是参考几篇CSDN和自己做的修改笔记整理:
cache、内存、虚拟内存:
原文:https://blog.csdn.net/Com_ma/article/details/78145333

DMA:
原文:https://blog.csdn.net/dadalan/article/details/2802979
原文:http://www.cnblogs.com/TaigaCon/archive/2012/12/03/2799407.html

TBL和MMU:
原文:https://www.baidu.com/link?url=FtIgOsEXqNyq0Q_JHOYwmr0GeaFyyTwMdYI1K8_4YwDkK2olMbTIe4r4ZMTW2l7eWoUZ_JpYUgjjvcF9XBYCRq&wd=&eqid=ec7ab12700001b44000000035c93172a
https://www.cnblogs.com/findumars/p/4068418.html



一、内存

内存就是RAM
RAMROM是相对的,RAM在断电后会丢失其中的信息,而ROM在断电后信息还会被保存。,

RAM 分为 静态RAM动态RAM
静态RAMSRAM,是仅次于CPU访问速度的RAM,L1 cache就是SRAM。
而我们用的物理内存是动态RAM,即DRAM,DRAM的访问速度比SRAM要慢很多,但是体积小,价格便宜。


二、cache

cache就是高速缓存,是为了调和CPU得过快访问速度和内存过慢的速度的一个硬件,现代计算机一般都有三级高速缓存L1L2L3,访问速度依次递减。
因为CPU要从内存中读取数据的时候会很慢,大部分时间会浪费在等待上,所以引入cache,把预计将要读取的数据先存放到cache中,这样CPU就可以先到cache中读取,从而节约了等待时间,如果cache中没有要读取的数据,那么继续往下到内存中读取,读到后再写入cache。


三、虚拟内存

虚拟内存是为了防止内存不够用,从硬盘上分割出一些空间,给内存扩展使用,这样程序就认为运行内存还够用。
实际上呢,是把内存中一些不常用的数据或指令放到虚拟内存中,等到使用的时候再存放到内存中,因为内存的读取速度虽然比CPU和cache低,但是比硬盘要高很多,从而就加快了程序的运行速度。在内存为4G以上的计算机中,一般这个大小足够用了,虚拟内存就一般无用武之地了。


四、过程小总结

CPU首先得到的是虚拟地址,虚拟地址要翻译成物理地址后才能进行数据访问,这个过程要检查TLB(翻译后备缓冲器)1,如果命中,会得到其物理地址,之后会访问cache,如果cache中有要访问的数据,那么本次访问就结束,如果没有,就到内存中寻找,并更新cache;如果TLB不命中,那么那么系统内核会调用缺页异常处理程序去处理,这个过程中会进行页替换等操作,最终取得要访问的数据。


五、虚拟内存和cache区别?

那么我们来看下cache和虚拟内存的区别。

(1)侧重点不同:cache主要解决主存与CPU的速度差异问题,而虚存主要是解决存储容量问题。

(2)数据通路不同:CPU与cache和主存之间均有直接访问通路,cache不命中时可直接访问主存;而虚拟内存与CPU之间不存在直接的数据通路,当主存不命中时只能通过调页解决,CPU最终还是通过访问主内存。

(3)透明性不同:cache的管理完全由硬件完成,对系统程序员和应用程序员均透明2;而虚存管理由软件(操作系统)和硬件共同完成,由于软件的介入,虚存对实现存储管理的系统程序员不透明,而只对应用程序员透明(段式和段页式管理对应用程序员“半透明”)。

(4)未命中时的损失不同:由于主存的存取时间是cache的存取时间的5~10倍,而主存的存取速度通常比辅存的存取速度快上千倍,故主存未命中时系统的性能损失要远大于cache未命中时的损失。


六、DMA

1.如果没有DMA?

一般来说,计算机进行数据处理时,需要把数据从内存读进CPU的寄存器,再进行进一步的操作(比如运算处理)。

但有些数据并不需要运算处理这一类型的操作,只是单纯的移动数据——把数据从内存读进寄存器,然后再把数据从寄存器写进内存。这以过程会消耗cpu资源,当需要读写大量数据的时候便更是如此,DMA技术就很好地解决了这一问题。

2.什么是DMA?

DMA(Direct Memory Access,直接内存存取) ,顾名思义,就是不占用cpu资源,是一种快速传送数据的机制。数据传递可以从一个硬件存储区域把一部分连续的数据复制到另一个硬件存储区域,不经过CPU处理。其中硬件包括系统总线上的硬件(内存、磁盘3),和外部总线上的硬件(移动硬盘等)4

3.DMA是怎么操作的?

每台电脑主机板上都有DMA控制器,计算机会对其编程;相应的,适配器上也有ROM(如软盘驱动控制器上的ROM)来储存控制DMA传送数据的程序。

开始是有CPU的介入的,但一旦控制器初始化完成,数据开始传送了,DMA就可以脱离CPU,独立完成数据传送,之后,在传送完成了,DMA的程序再利用中断通知CPU。

在DMA传送开始的短暂时间内,基本上有两个处理器为它工作,一个执行程序代码,一个传送数据。

传送中,数据直接在源地址和目的地址之间传送,没有中间媒介——DMA控制器将操作总线上的控制信号,使写字节一次完成。这样大大提高了计算机运行速度和工作效率。(如果没有DMA,过程是这样的,通过CPU把一个字节从适配卡传送至内存,需要两步操作:首先,CPU把这个字节从适配卡读到内部寄存器中,然后再从寄存器传送到内存的适当地址。)

要从适配卡到内存传送数据,DMA同时触发从适配卡读数据总线(即I/O读操作)和向内存写数据的总线。激活I/O读操作就是让适配卡把一个数据单位(通常是一个字节或一个字)放到PC数据总线上,因为此时内存写总线也被激活,数据就被同时从PC总线上拷贝到内存中。

直接内存访问(DMA)方式是一种完全由硬件执行I/O交换的工作方式。DMA控制器从CPU完全接管对总线的控制。数据交换不经过CPU,而直接在内存和I/O设备之间进行。DMA控制器采用以下三种方式:
①停止CPU访问内存:当外设要求传送一批数据时,由DMA控制器发一个信号给CPU。DMA控制器获得总线控制权后,开始进行数据传送。一批数据传送完毕后,DMA控制器通知CPU可以使用内存,并把总线控制权交还给CPU。
②周期挪用:当I/O设备没有 DMA请求时,CPU按程序要求访问内存:一旦 I/O设备有DMA请求,则I/O设备挪用一个或几个周期。
③DMA与CPU交替访内:一个CPU周期可分为2个周期,一个专供DMA控制器访内,另一个专供CPU访内。不需要总线使用权的申请、建立和归还过程。

4.DMA传输会占用系统总线资源

DMA虽然不会占用cpu资源,但是如果DMA的源DMA的目的都为内存的时候,由于内存位于系统总线上,DMA会占用总线资源,此时由于系统总线忙,cpu会由于得不到总线资源而无法进行跟外部的交流操作。

如果DMA的源或目的为内存的时候,我们需要为其分配一块在物理上连续的内存。如果用kmalloc等函数分配的内存,虽然在虚拟地址看起来是连续的,但是物理上可能不连续,因此需要用到分配物理上连续的内存的函数(dma_alloc_writecombine)。

为什么要分配连续的内存空间呢,因为平时cpu使用的时候,寻址会经过mmu内存管理单元1进行虚拟地址到物理地址的转换,而DMA是不经过mmu直接对内存进行读写的,直接对物理地址进行操作。

4.使用DMA

当我们要使用到DMA的时候,需要把传输的源(物理地址)、目的(物理地址)、大小告诉DMA,然后启动DMA,就能进行数据移动了。

那么什么时候DMA会结束呢,当DMA传输结束的时候会发出一个中断,我们可以在该中断处理程序内部做进一步的操作(如打印消息等)。


  1. MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。
    TLB(Translation Lookaside Buffer)传输后备缓冲器是一个内存管理单元用于改进虚拟地址到物理地址转换速度的缓存。TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE组成的块。如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。 ↩︎ ↩︎

  2. 什么叫透明性?透明是指什么都能看见吗?
    在计算机领域中,站在某一类用户的角度,如果感觉不到某个事物或属性的存在,即“看”不到某个事物或属性,则称为“对该用户而言,某个事物或属性是透明的”。这与日常生活中的“透明”概念(公开,看得见)正好相反 ↩︎

  3. 硬盘(外部存储器)是不是外设?
    计算机系统包括:软件系统硬件系统
    其中硬件系统包括:主机外设,外设就是外部设备的简称。
    主机包括:Cpu存储器。其中Cpu主要包含运算器和控制器。存储器包含内存储器和外存储器。
    外设包括:输入设备输出设备
    所以,如果说硬件系统由哪两大部分组成,那就是主机和外设
    如果说硬件系统由哪五大部件组成,就是 运算器、控制器、存储器、输入设备、输出设备
    硬盘是外部存储器,归于主机当中,不属于外部设备。
    只有在说磁盘驱动器的时候,磁盘驱动器才是外部设备,既可以读又可以写,即是输入设备又是输出设备。 ↩︎

  4. 计算机发展到今天,DMA已不再用于内存到内存的数据传送,因为CPU速度非常快,做这件事,效率更高,但要在适配卡和内存之间传送数据,仍然是非DMA莫属。 ↩︎


版权声明:本文为yongganzhe02原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。