概述
在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存,港台称之为记忆体)。我们这里讨论的存储器主要是内存,因为当今的计算机体系中,辅存已经被划分成了I/O设备。
内存又称主存,是CPU能直接寻址的存储空间,由半导体器件制成。内存的特点是存取速度快。内存是计算机的主要部件,它是相对于外存而言的。我们平常使用的程序,如Linux操作系统、打字软件、游戏软件等,一般都是安装在硬盘等外存上的,但仅此是不能使用其功能的,必须把它们调入内存中运行,才能真正使用其功能,我们平时输入一段文字,或玩一个游戏,其实都是在内存中进行的。就好比在一个书房里,存放书籍的书架和书柜相当于电脑的外存,而我们工作的办公桌就是内存。通常我们把要永久保存的、大量的数据存储在外存上,而把一些临时的或少量的数据和程序放在内存上,当然内存的好坏会直接影响电脑的运行速度。
1 存储器的物理概念
内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。其中,RAM是最重要的存储器,又分为DRAM和SDRAM。S(synchronous)DRAM是同步动态随机存取存储器:SDRAM为168脚,这是目前Pentium及以上机型使用的内存。SDRAM将CPU与RAM通过一个相同的时钟锁在一起,使CPU和RAM能够共享一个时钟周期,以相同的速度同步工作,每一个时钟脉冲的上升沿便开始传递数据,速度比EDO内存提高50%。DDR(DOUBLE DATA RATE)RAM :SDRAM的更新换代产品,他允许在时钟脉冲的上升沿和下降沿传输数据,这样不需要提高时钟的频率就能加倍提高SDRAM的速度。
1、只读存储器(ROM)
ROM表示只读存储器(Read Only Memory),在制造ROM的时候,信息(数据或程序)就被存入并永久保存。这些信息只能读出,一般不能写入,即使机器停电,这些数据也不会丢失。ROM一般用于存放计算机的基本程序和数据,如BIOS ROM。其物理外形一般是双列直插式(DIP)的集成块。
2、随机存储器(RAM)
随机存储器(Random Access Memory)表示既可以从中读取数据,也可以写入数据。当机器电源关闭时,存于其中的数据就会丢失。我们通常购买或升级的内存条就是用作电脑的内存,内存条(SIMM)就是将RAM集成块集中在一起的一小块电路板,它插在计算机中的内存插槽上,以减少RAM集成块占用的空间。目前市场上常见的内存条有1G/条,2G/条,4G/条等。
3、高速缓冲存储器(Cache)
Cache也是我们经常遇到的概念,也就是平常看到的一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)这些数据,它位于CPU与内存之间,是一个读写速度比内存更快的存储器。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。当CPU再次需要这些数据时,CPU就从高速缓冲存储器读取数据,而不是访问较慢的内存,当然,如需要的数据在Cache中没有,CPU会再去读取内存中的数据。
(1)一级缓存(L1 Cache)
一级缓存都内置在CPU内部并与CPU同速运行,可以有效的提高CPU的运行效率。一级缓存越大,CPU的运行效率越高,但受到CPU内部结构的限制,一级缓存的容量都很小。
网上经常有人这样打比方,说这个就好比你开汽车的时候,后备箱是整个的二级缓存,假如说车门扶手里面有一个小箱子,那是你的一级缓存。受到汽车车厢结构的影响,车门扶手里面的小箱子一般不大。那么一级缓存大好在哪里呢?就是你随时开车的时候,随时在里面都可以取东西了。假如你一级缓存小的话,你还得把车停下来,到后备箱里取东西。
(2)二、三级缓存(L2 Cache)
那么,二级缓存的作用又是什么呢?简单地说,二级缓存就是一级缓存的缓冲器:一级缓存制造成本很高因此它的容量有限,二级缓存的作用就是存储那些CPU处理时需要用到、一级缓存又无法存储的数据。同样道理,三级缓存和内存可以看作是二级缓存的缓冲器,它们的容量递增,但单位制造成本却递减。需要注意的是,无论是二级缓存、三级缓存还是内存都不能存储处理器操作的原始指令,这些指令只能存储在CPU的一级指令缓存中,而余下的二级缓存、三级缓存和内存仅用于存储CPU所需数据。
随着CPU制造工艺的发展,二级缓存也能轻易的集成在CPU内核中,容量也在逐年提升。现在再用集成在CPU内部与否来定义一、二级缓存,已不确切。而且随着二级缓存被集成入CPU内核中,以往二级缓存与CPU大差距分频的情况也被改变,此时其以相同于主频的速度工作,可以为CPU提供更高的传输速度。
二级缓存是CPU性能表现的关键之一,在CPU核心不变化的情况下,增加二级缓存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二级缓存上有差异,由此可见二级缓存对于CPU的重要性。目前的CPU产品中,一级缓存的容量基本在4KB到64KB之间,二级缓存的容量则分为512KB、1MB、2MB、4MB、8MB等。一级缓存容量各产品之间相差不大,而二级缓存容量则是提高CPU性能的关键。二级缓存容量的提升是由CPU制造工艺所决定的,容量增大必然导致CPU内部晶体管数的增加,要在有限的CPU面积上集成更大的缓存,对制造工艺的要求也就越高
自P4时代开始,Intel开始采用全新的“数据代码指令追踪缓存”设计。基于这种架构的一级数据缓存不再存储实际的数据,而是存储这些数据在二级缓存中的指令代码(即数据在二级缓存中存储的起始地址)。假设处理器需要读取“INTEL P4 IS GOOD”这一串数据,那么所有数据将被存储在二级缓存中,而一级数据代码指令追踪缓存需要存储的仅仅是上述数据的起始地址。由于一级数据缓存不再存储实际数据,因此“数据代码指令追踪缓存”设计能够极大地降CPU对一级数据缓存容量的要求,降低处理器的生产难度。但这种设计的弊端在于数据读取效率较“实数据读写缓存设计”低,而且对二级缓存容量的依赖性非常大。
3、物理存储器地址空间
物理存储器和存储地址空间是两个不同的概念。但是由于这两者有十分密切的关系,而且两者都用B、KB、MB、GB来度量其容量大小,因此容易产生认识上的混淆。初学者弄清这两个不同的概念,有助于进一步认识内存储器和用好内存储器。
物理存储器是指实际存在的具体存储器芯片。如主板上装插的内存条和装载有系统的BIOS的ROM芯片,显示卡上的显示RAM芯片和装载显示BIOS的ROM芯片,以及各种适配卡上的RAM芯片和ROM芯片都是物理存储器。
存储地址空间是指对存储器编码(编码地址)的范围。所谓编码就是对每一个物理存储单元(一个字节)分配一个号码,通常叫作“编址”。分配一个号码给一个存储单元的目的是为了便于找到它,完成数据的读写,这就是所谓的“寻址”(所以,有人也把地址空间称为寻址空间)。
地址空间的大小和物理存储器的大小并不一定相等。举个例子来说明这个问题:某层楼共有17个房间,其编号为801~817。这17个房间是物理的,而其地址空间采用了三位编码,其范围是800~899共100个地址,可见地址空间是大于实际房间数量的。
对于386以上档次的微机,其地址总线为32位,因此地址空间可达2的32次方,即4GB。(虽然如此,但是我们一般使用的一些操作系统例如windows xp、却最多只能识别或者使用3.25G的内存,64位的操作系统Vsta或Win7则能识别并使用4G和4G以上的的内存。好了,现在可以解释为什么会产生诸如:常规内存、保留内存、上位内存、高端内存、扩充内存和扩展内存等不同内存类型。
2 IBM PC内存体系发展史
1、最早的内存体系
1980年,IBM推出的第一台PC机采用的CPU是8088芯片,它只有20根地址线,也就是说,它的地址空间是1MB。我们前面讲了,IBM PC内存是由高地址向低地址生长的,所以当时PC机1MB中的低端640KB用作RAM,供DOS及应用程序使用,高端的384KB则保留给ROM、视频适配卡等系统使用。从此,这个界限便被确定了下来并且沿用至今。
低端的640KB就被称为常规内存即PC机的基本RAM区。保留内存中的低128KB是显示缓冲区,高64KB是系统BIOS(基本输入/输出系统)空间,其余192KB空间保留。从对应的物理存储器来看,基本内存区只使用了512KB芯片,占用0000至7FFFF这512KB地址。显示内存区虽有128KB空间,但对单色显示器(MDA卡)只需4KB就足够了,因此只安装4KB的物理存储器芯片,占用了B0000至B0FFF这4KB的空间,如果使用彩色显示器(CGA卡)需要安装16KB的物理存储器,占用B8000至BBFFF这16KB的空间,可见实际使用的地址范围都小于允许使用的地址空间。
在当时(1980年末至1981年初)这么“大”容量的内存对PC机使用者来说似乎已经足够了,但是随着程序的不断增大,图象和声音的不断丰富,以及能访问更大内存空间的新型CPU相继出现,最初的PC机和MS-DOS设计的局限性变得越来越明显。
2、扩充内存
到1984年,即286被大规模投入市场不久,人们越来越认识到640KB的限制已成为大型程序的障碍,这时,Intel和Lotus,这两家硬、软件的杰出代表,联手制定了一个由硬件和软件相结合的方案,此方法使所有PC机存取640KB以上RAM成为可能。而Microsoft也刚推出Windows1.0不久,对内存空间的要求也很高,因此它也及时加入了该行列(事后被证明,微软的这个决定奠定了后来的成功)。
在1985年初,Lotus、Intel和Microsoft三家共同定义了LIM-EMS,即扩充内存规范,通常称EMS为扩充内存。当时,EMS需要一个安装在I/O槽口的内存扩充卡和一个称为EMS的扩充内存管理程序方可使用。但是I/O插槽的地址线只有24位(ISA总线),这对于386以上档次的32位机是不能适应的。所以,现在内存扩充卡已经消失了。现在微机中的扩充内存通常是用软件如DOS中的EMM386把扩展内存模拟或扩充内存来使用。所以,扩充内存和扩展内存的区别并不在于其物理存储器的位置,而在于使用什么方法来读写它。后面将作进一步介绍。
前面已经说过扩充存储器也可以由扩展存储器模拟转换而成。EMS的原理和XMS不同,它采用了页帧方式。页帧是在1MB空间中指定一块64KB空间(通常在保留内存区内,但其物理存储器来自扩展存储器),分为4页,每页16KB。EMS存储器也按16KB分页,每次可交换4页内容,以此方式可访问全部EMS存储器。符合EMS的驱动程序很多,常用的有EMM386.EXE、QEMM、TurboEMS、386MAX等。DOS和Windows中都提供了EMM386.EXE。
3、扩展内存
前面讲了,286有24位地址线,它可寻址16MB的地址空间,而386有32位地址线,它可寻址高达4GB的地址空间,为了区别起见,我们把1MB以上的地址空间称为扩展内存XMS(eXtend memory)。
在386以上档次的微机中,有两种存储器工作方式,一种称为实地址方式或实方式,另一种称为保护方式。在实方式下,物理地址仍使用20位,所以最大寻址空间为1MB,以便与8086兼容。保护方式采用32位物理地址,寻址范围可达4GB。DOS系统在实方式下工作,它管理的内存空间仍为1MB,因此它不能直接使用扩展存储器。为此,Lotus、Intel、AST及Microsoft公司建立了MS-DOS下扩展内存的使用标准,即扩展内存规范XMS。我们常在Config.sys文件中看到的Himem.sys就是管理扩展内存的驱动程序。
4、EDO DRAM时代
在1988 ~1990 年当中,PC 技术迎来另一个发展高峰,也就是386和486时代,此时CPU 已经向分页技术发展,所以30pin SIMM 内存再也无法满足需求,其较低的内存带宽已经成为急待解决的瓶颈,所以此时72pin SIMM 内存出现了,72pin SIMM支持32bit快速页模式内存,内存带宽得以大幅度提升。72pin SIMM内存单条容量一般为512KB ~2MB,而且仅要求两条同时使用,由于其与30pin SIMM 内存无法兼容,因此这个时候PC业界毅然将30pin SIMM 内存淘汰出局了。
EDO DRAM(Extended Date Out RAM 外扩充数据模式存储器)内存,这是1991 年到1995 年之间盛行的内存条,EDO DRAM同FPM DRAM(Fast Page Mode RAM 快速页面模式存储器)极其相似,它取消了扩展数据输出内存与传输内存两个存储周期之间的时间间隔,在把数据发送给CPU的同时去访问下一个页面,故而速度要比普通DRAM快15~30%。工作电压为一般为5V,带宽32bit,速度在40ns以上,其主要应用在当时的486及早期的Pentium电脑上。
在1991 年到1995 年中,让我们看到一个尴尬的情况,那就是这几年内存技术发展比较缓慢,几乎停滞不前,所以我们看到此时EDO DRAM有72 pin和168 pin并存的情况,事实上EDO 内存也属于72pin SIMM 内存的范畴,不过它采用了全新的寻址方式。EDO 在成本和容量上有所突破,凭借着制作工艺的飞速发展,此时单条EDO 内存的容量已经达到4 ~16MB 。由于Pentium及更高级别的CPU数据总线宽度都是64bit甚至更高,所以EDO DRAM与FPM DRAM都必须成对使用。
5、SDRAM时代
自Intel Celeron系列以及AMD K6处理器以及相关的主板芯片组推出后,EDO DRAM内存性能再也无法满足需要了,内存技术必须彻底得到个革新才能满足新一代CPU架构的需求,此时内存开始进入比较经典的SDRAM时代。
第一代SDRAM 内存为PC66 规范,但很快由于Intel 和AMD的频率之争将CPU外频提升到了100MHz,所以PC66内存很快就被PC100内存取代,接着133MHz 外频的PIII以及K7时代的来临,PC133规范也以相同的方式进一步提升SDRAM 的整体性能,带宽提高到1GB/sec以上。由于SDRAM 的带宽为64bit,正好对应CPU 的64bit 数据总线宽度,因此它只需要一条内存便可工作,便捷性进一步提高。在性能方面,由于其输入输出信号保持与系统外频同步,因此速度明显超越EDO 内存。
不可否认的是,SDRAM 内存由早期的66MHz,发展后来的100MHz、133MHz,尽管没能彻底解决内存带宽的瓶颈问题,但此时CPU超频已经成为DIY用户永恒的话题,所以不少用户将品牌好的PC100品牌内存超频到133MHz使用以获得CPU超频成功,值得一提的是,为了方便一些超频用户需求,市场上出现了一些PC150、PC166规范的内存。
尽管SDRAM PC133内存的带宽可提高带宽到1064MB/S,加上Intel已经开始着手最新的Pentium 4计划,所以SDRAM PC133内存不能满足日后的发展需求,此时,Intel为了达到独占市场的目的,与Rambus联合在PC市场推广Rambus DRAM内存(称为RDRAM内存)。与SDRAM不同的是,其采用了新一代高速简单内存架构,基于一种类RISC(Reduced Instruction Set Computing,精简指令集计算机)理论,这个理论可以减少数据的复杂性,使得整个系统性能得到提高。
在AMD与Intel的竞争中,这个时候是属于频率竞备时代,所以这个时候CPU的主频在不断提升,Intel为了盖过AMD,推出高频PentiumⅢ以及Pentium 4 处理器,因此Rambus DRAM内存是被Intel看着是未来自己的竞争杀手锏,Rambus DRAM内存以高时钟频率来简化每个时钟周期的数据量,因此内存带宽相当出色,如PC 1066 1066 MHz 32 bits带宽可达到4.2G Byte/sec,Rambus DRAM曾一度被认为是Pentium 4 的绝配。
尽管如此,Rambus RDRAM 内存生不逢时,后来依然要被更高速度的DDR“掠夺”其宝座地位,在当时,PC600、PC700的Rambus RDRAM 内存因出现Intel820 芯片组“失误事件”、PC800 Rambus RDRAM因成本过高而让Pentium 4平台高高在上,无法获得大众用户拥戴,种种问题让Rambus RDRAM胎死腹中,Rambus曾希望具有更高频率的PC1066 规范RDRAM来力挽狂澜,但最终也是拜倒在DDR 内存面前。
6、DDR时代
DDR SDRAM(Double Data Rate SDRAM)简称DDR,也就是“双倍速率SDRAM”的意思。DDR可以说是SDRAM的升级版本, DDR在时钟信号上升沿与下降沿各传输一次数据,这使得DDR的数据传输速度为传统SDRAM的两倍。由于仅多采用了下降缘信号,因此并不会造成能耗增加。至于定址与控制信号则与传统SDRAM相同,仅在时钟上升缘传输。
DDR 内存是作为一种在性能与成本之间折中的解决方案,其目的是迅速建立起牢固的市场空间,继而一步步在频率上高歌猛进,最终弥补内存带宽上的不足。第一代DDR200 规范并没有得到普及,第二代PC266 DDR SRAM(133MHz时钟×2倍数据传输=266MHz带宽)是由PC133 SDRAM内存所衍生出的,它将DDR 内存带向第一个高潮,目前还有不少赛扬和AMD K7处理器都在采用DDR266规格的内存,其后来的DDR333内存也属于一种过度,而DDR400内存成为目前的主流平台选配,双通道DDR400内存已经成为800FSB处理器搭配的基本标准,随后的DDR533 规范则成为超频用户的选择对象。
7、DDR2时代
随着CPU 性能不断提高,我们对内存性能的要求也逐步升级。不可否认,紧紧依高频率提升带宽的DDR迟早会力不从心,因此JEDEC 组织很早就开始酝酿DDR2 标准,加上LGA775接口的915/925以及最新的945等新平台开始对DDR2内存的支持,所以DDR2内存将开始演义内存领域的今天。
DDR2 能够在100MHz 的发信频率基础上提供每插脚最少400MB/s 的带宽,而且其接口将运行于1.8V 电压上,从而进一步降低发热量,以便提高频率。此外,DDR2 将融入CAS、OCD、ODT 等新性能指标和中断指令,提升内存带宽的利用率。从JEDEC组织者阐述的DDR2标准来看,针对PC等市场的DDR2内存将拥有400、533、667MHz等不同的时钟频率。高端的DDR2内存将拥有800、1000MHz两种频率。DDR-II内存将采用200-、220-、240-针脚的FBGA封装形式。最初的DDR2内存将采用0.13微米的生产工艺,内存颗粒的电压为1.8V,容量密度为512MB。
8、DDR3时代
我们很幸运,现在处于了DDR3的时代。DDR3相比起DDR2有更低的工作电压,从DDR2的1.8V降落到1.5V,性能更好更为省电;DDR2的4bit预读升级为8bit预读。DDR3目前最高能够达到2000Mhz的速度,尽管目前最为快速的DDR2内存速度已经提升到800Mhz/1066Mhz的速度,但是DDR3内存模组仍会从1066Mhz起跳。DDR3在DDR2基础上采用的新型设计:
1.8bit预取设计,而DDR2为4bit预取,这样DRAM内核的频率只有接口频率的1/8,DDR3-800的核心工作频率只有100MHz。
2.采用点对点的拓朴架构,以减轻地址/命令与控制总线的负担。
3.采用100nm以下的生产工艺,将工作电压从1.8V降至1.5V,增加异步重置(Reset)与ZQ校准功能。
3 存储器的逻辑结构
在分析IBM PC主存储器时,首先要明确其总容量,即字数×位数。字数是指可编址单元数,简称单元数;位数指每个编址单元的位数。如果主存按字节编址,那么每个编址单元有8位,当计算机字长超过8位时,为了提高存取速度,有的主存允许按字节编址,也允许按字编址。
然后,需要确定可供选用的存储芯片,即什么类型、型号的存储芯片,每片容量多少。每片容量通常低于总容量,就需要用若干块芯片组成。相应地,可能存在位数与字数扩展的问题。
来,我们来看现在最流行的计算机体系结构——IBM PC微型计算机。在大街上随便买一台Intel或AMD的主流机型,一般内存配置是1G内存,由两根512MB的PC266 DDR SRAM插在主板的内存槽中:
我们隐隐约约地可以看出,这两根内存分别由8颗64MB的芯片构成。两根这样的内存总容量为1G,共需要30位地址A29~A0来对它进行寻址,高2位中的A31舍去,恒为1;A30留作他用,后面会谈到。千万要注意,IBM PC体系是由高向低寻址,所以这里不是0,而是1,32位体系的寻址是从FFFFFFFFH开始的。所以,我们买来这两根内存,插入主板后,物理寻址范围是FFFFFFFFH~C0000000H。
好了,第一步完成,接下来进行集成。当插入主板后,主板上有一个ROM,通常是一个EEROM可擦写持久性存储器。这个ROM容量不大,根据各主板厂商提供的规格有关,从512K到2MB不等。我们假设其为1MB,那么,集成后的PC存储逻辑就如下所示:
那么,有人就要问了,集成以后的存储器总容量就是1G零1M了,A29~A0显然就不够了,这时,A30就参与进来了,作为对ROM寻址的片选逻辑,也就是只有在A30出现低电平的时候,才会定位到ROM进行寻址。
其实作为Linux内核程序员,我们需要重点关注的不是RAM,而是ROM。因为这个ROM来头可不小,就是我们著名的BIOS所存放的位置。
我们看到半导体存储器容量64MB×8位。其中固化区1MB选用EEPROM芯片(1MB×64位),工作区RAM的容量1G。地址总线32位,为A31~A0(低),双向数据总线64位(读/写),D63~D0(低)。对于RAM,共两组,每组8个RAM芯片颗粒,那么低26位地址A25~A0连接到芯片,余下A30~A26作为片选依据。然后根据存储空间分配方案确定片选逻辑:
这个BIOS ROM我还要多说几句,后面讲到的BIOS程序设计中,会谈到,最重要的是BIOS提供的那些服务程序,例如,INT 10H,就是显示服务。INT我们知道是软中断指令,调用相应中断号的服务程序。而这个程序在哪里?就在这1MB的ROM里边。
最后
以上就是健忘大炮为你收集整理的PC 存储器的全部内容,希望文章能够帮你解决PC 存储器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复