计算机系统概论
冯诺依曼计算机
1945年,数学家冯·诺依曼(vonNeumann)在研究EDVAC机时提出了“存储程序”的概念。以此概念为基础的各类计算机通称为冯·诺依曼机,它的特点可归结如下:
- 计算机由运算器、控制器、存储器、输入设备、输出设备五大部件组成
- 指令和数据以同等地位存放于存储器内,按地址寻访
- 指令和数据均用二进制数表示
- 指令由操作码和地址码构成,操作码指明操作性质,地址码指明操作数位置
- 指令在存储器中通常顺序存放和执行,但能根据特定条件或运算结果改变执行顺序
- 冯诺依曼机以运算器为中心,输入输出设备与存储器之间传输数据需要经过运算器(这会显著增加运算器的压力,因此现代计算机已经修改为以存储器为中心)
五大件的功能
- 运算器用来完成算术运算和逻辑运算
- 存储器用来存放数据和程序
- 控制器用来指挥计算机的五大部件有条不紊地工作,包括控制、指挥程序和数据的输入、运行以及处理运算结果等
- 输入设备用来将人们熟悉的信息形式转换为机器能识别的信息形式,常见的输入设备有键盘、鼠标等
- 输出设备可将机器运算结果转换为人们熟悉的信息形式,如打印机输出、显示器输出等
现代计算机中,由于运算器和控制器在逻辑关系和电路结构上联系十分紧密,在大规模集成电路制作工艺出现后,这两大部件往往集成在同一芯片上,因此,通常将它们合起来统称为中央处理器(Central Processing Unit,CPU)。把输入设备与输出设备简称为I/O设备(Input/Output Equipment)。这样,现代计算机可认为由三大部分组成:CPU、I/O设备、主存储器(这里指内存,MainMemory,MM),CPU与主存储器结合起来又可称为主机,I/O设备又可称为外部设备。
计算机硬件的衡量标准
- 机器字长:指CPU一次能处理数据的位数,通常与CPU寄存器位数有关。字长越长,数的表示范围越大,精度越高,运算速度越快。
- 存储容量:包括主存(内存)容量和辅存(如硬盘)容量,通常用字节数表示
- 运算速度:通常使用单位时间内执行指令的平均条数来衡量,单位为MIPS(Miion In-slruction Per Second,百万条指令每秒),2MIPS表示每秒能执行200万条指令。也可以用CPI(Cycle Per Instruction)即执行一条指令所需的时钟周期数(机器主频的倒数),或用FLOPS(Floating Point Operation Per Second,浮点运算次数每秒)来衡量运算速度。
总线
计算机系统的五大件之间的互联方式有两种,一种是各部件之间使用单独的连线,称为分散连接,另一种是将各部件连接到一组公共信息传输线上,称为总线连接。
早期的计算机多数使用分散连接方式,由于I/O设备的增多,目前主要使用总线连接方式,且同一时刻只允许有一个部件向总线发送信息,但多个部件可以同时从总线上接收相同的信息。
总线的分类
片内总线:芯片内部的总线,用于如CPU内部寄存器与其他寄存器、与算逻单元ALU之间的连接
系统总线:CPU与I/O设备各大件之间的信息传输线,通常位于主板或插件板上,因此又称为板级总线或板间总线,根据传输信息的不同,系统总线又分为:
- 数据总线:用于各功能部件之间传输数据,可以双向传输,其位数与机器字长、存储字长有关,一般为8、16、32或64位。
- 地址总线:用来输送主存单元或I/O设备的地址,由CPU输出,单向传输,其位数与存储单元个数有关。
- 控制总线:用来发送各种控制信号,可以双向传输,常见的控制信号包括:
时钟:用来同步各种操作。
复位:初始化所有部件。
总线请求:表示某部件需获得总线使用权。
总线允许:表示需要获得总线使用权的部件已获得了控制权。
中断请求:表示某部件提出中断请求。
中断响应:表示中断请求已被接收。
存储器写:将数据总线上的数据写至存储器的指定地址单元内。
存储器读:将指定存储单元中的数据读到数据总线上。
I/O读:从指定的 I/O端口将数据读到数据总线上。
I/O写:将数据总线上的数据输出到指定的I/O端口内。
传输响应:表示数据已被接收,或已将数据送至数据总线上。
通信总线:用于计算机系统与外部设备或与其他系统之间的通信,如:USB、HDMI、以太网线等
总线标准
- ISA总线:1980年代IBM为IBM PC(16位CPU)而推出的总线标准,又称AT总线,它使用独立于CPU的总线时钟,因此允许CPU使用更高频率的时钟而不需要管总线,但由于ISA总线没有支持总线仲裁的硬件逻辑,因此它不支持多台主设备系统,而且ISA上的所有数据的传送必须通过CPU或DMA接口来管理,因此CPU需要花费了大量时间来控制与外部设备交换数据。
- EISA总线:一种在ISA基础上扩充开放的总线标准,与ISA可以完全兼容,从CPU中分离出了总线控制权,能支持多个总线主控器和突发方式传输。
- VESA(VL-BUS)总线:由VESA(视频电子标准协会)提出的局部总线标准,又称为VL-BUS(Local BUS)总线。VL-BUS是由CPU总线演化而来的,可以将高速I/O设备直接挂在CPU上,实现CPU与高速I/O设备之间的高速数据交换,已被PCI替代
- PCI总线:随着图形用户接口(GUI)和多媒体技术的发展,ISA总线和EISA总线受带宽的限制,已不能适应系统工作的要求,因此,1991年下半年,Intel公司首先提出PCI(Peripheral Component Interconnect,外围部件互连)总线的概念。PCI总线接口不依附于某个特定的处理器,以支持不同结构的处理器,并且与ISA、EISA兼容,支持即插即用、对数据和地址的奇偶校验等
- AGP总线:Intel于1996年推出的显卡专用局部总线,以提升对三维技术的支持,其带宽是传统PCI总线的2倍,已被PCIe取代
- RS-232C总线:由美国电子工业协会EIA推荐的一种串行通信总线标准,它是最经典的古老串行标准,应用于串行二进制交换的数据终端设备(DTE)和数据通信设备(DCE)之间,已逐渐被USB取代
- USB总线:(Universal Serial Bus)通用串行总线是IBM、Intel、Microsoft等公司于1994年11月联合开发的计算机串行接口总线标准,它是一种开放性的不具有版权专利的工业标准,广泛用于键盘、鼠标、数码相机、U盘等设备,支持不关机即插即用,标准USB 2.0使用4芯电缆,2条用于信号连接,2条用于电源/接地,能为外设提供+5V直流电源。在充电领域,快充头默认首先输出5V,然后通过快充协议协商,将电压从最初的5V升到9V、12V、20V等值。USB 3.0在保留4芯电缆的基础上,额外增加了5根高速线用于数据传输。
- PCIe:由Intel、IBM、AMD等公司于2002年发布的一种高速串行、点对点、全双工系统总线,它采用了类似TCP/IP协议的分层结构和数据帧逐层传递的模式,以确保数据的可靠性,总线由一条或多条”通道”组成,每条通道包含两对差分线。可以灵活组合x1、x4、x8、x16等通道数来提供不同的带宽,主要用于显卡、网卡、支持NVMe协议的高速固态硬盘等
- SATA:由SATA-IO组织(由Intel、APTI、Dell等公司牵头)制定,用串行传输方式,支持热插拔,是当前连接硬盘和光驱等存储设备的主流方案
- HDMI:由HDMI Forum制定(创始公司包括日立、松下、飞利浦、索尼等),是一种串行、单向传输的音视频通信总线
- DisplayPort:由VESA组织制定,串行、单向传输的音视频通信总线,与HDMI不同的是,它将视频、音频和数据都打包成微小的数据包,通过一条主链路进行传输,提供了更高的带宽
- DDR(Double Data Rate SDRAM):DDR其实是现代计算机使用的主内存技术标准,同时也是该技术标准使用的CPU内存控制器与主存(DRAM)之间的专用高速内存总线,负责程序和数据的读写访问。其特点是延迟低、带宽高,并采用双倍数据率技术,在时钟上升沿和下降沿均传输数据。当前主流标准包括DDR4和DDR5,其中DDR5在带宽、容量和能效方面进一步提升,并采用双32位子通道结构提高并行访问能力。
总线结构
单总线结构
将CPU、主存、I/O设备都挂在一组总线上,允许I/O设备之间、I/O设备与CPU之间或I/O设备与主存之间直接交换信息。这种结构简单,也便于扩充,但所有的传送都通过这组共享总线,不允许两个以上的部件在同一时刻向总线传输信息,因此极易形成计算机系统的瓶颈。

双总线结构
双总线结构的特点是将速度较低的I/O设备从单总线上分离出来,形成主存总线与I/O总线分开的结构。图中通道是一个具有特殊功能的处理器,CPU将一部分功能下放给通道,使其对I/O设备具有统一管理的功能,以完成外部设备与主存储器之间的数据传送,其系统的吞吐能力可以相当大,这种结构大多用于大、中型计算机系统。

多总线结构
如果将速率不同的I/O设备进行分类,然后将它们连接在不同的通道上,那么计算机系统工作效率将会更高,由此衍生出多总线结构,多总线结构有多种。
下图中主存总线用于CPU与主存之间的传输,I/O总线供CPU与各类I/O设备之间传递信息,DMA 总线用于高速I/O设备(磁盘等)与主存之间直接交换信息。在三总线结构中任一时刻只能使用一种总线。主存总线与DMA总线不能同时对主存进行存取,I/O总线只有在CPU 执行I/O指令时才能用到。

总线控制
总线控制的核心是解决多个主设备如何合理使用共享总线的问题,主要分为总线仲裁和通信控制两大部分,总线上连接的各类设备,按其对总线有无控制功能可分为:
- 主设备(模块):对总线有控制权
- 从设备(模块):从设备只能响应从主设备发来的总线命令,对总线没有控制权
总线仲裁
总线仲裁(Bus Arbitration,又称为总线判优控制)解决“谁能用总线”的问题,决定哪个主设备获得总线控制权。总线判优控制分为集中式和分布式,集中式将控制逻辑集中在诸如CPU之类的某处,分布式将控制逻辑分散在与总线连接的各个部件或设备上。
集中式总线仲裁
集中控制优先权仲裁方式有以下几种(下图中有3根线用于总线控制,BS用于表示总线忙、BR用于总线请求、BG用于表示总线同意):
(1)链式查询:总线同意信号BG串行地从一个I/O接口送到下一个I/O接口。如果BG到达的接口有总线请求,BG信号就不再往下传,意味着该接口获得了总线使用权,并建立总线忙BS信号,表示它占用了总线。
- 特点:按照设备物理连接顺序获得总线控制权,离总线控制部件越近的设备具有越高的优先级,实现简单,容易扩充设备
- 缺点:对电路故障敏感,一个设备故障可能阻塞后续设备,优先级固定,不便改变

(2)计数器定时查询:与链式查询相比,计数器定时查询方式多了一组设备地址线,少了一根总线同意线BG。总线控制部件接到由总线请求线BR送来的请求信号后,在总线未被使用(BS=0)的情况下,总线控制部件中的计数器开始计数,并通过设备地址线,向各设备发出一组地址信号。当某个设备地址与计数值一致时,就获得总线使用权,并终止计数查询
- 特点:计数器的起始值和计数方式决定了设备优先级:
- 固定优先级:计数从0开始,此时设备地址0优先级最高,1次之,依次递减。优先级顺序固定为 0, 1, 2…
- 循环/平等优先级:计数从上次的终止点继续,此时所有设备获得总线的机会均等,优先级平等
- 可编程优先级:计数器的初始值可由程序设置,因此优先级顺序可以按需灵活改变
- 缺点:增加了设备地址线,且控制复杂

(3)独立请求:每一台设备均有一对总线请求线BR,和总线同意线BG。当设备要求使用总线时,便发出该设备的请求信号。总线控制部件中有一排队电路,可根据优先次序确定响应哪一台设备的请求。
- 特点:响应速度快,优先次序控制灵活
- 缺点:控制线数量多,总线控制更复杂。链式查询中仅用2根线确定总线使用权属于哪个设备,在计数器査询中大致用log2n根线,其中n是允许接纳的最大设备数,而独立请求方式需采用2n根线

总线通信控制
总线通信控制(Bus Communication Control)解决通信双方如何获知传输开始和传输结束,以及通信双方如何协调如何配合。通常将完成一次总线操作的时间称为总线周期,可分为以下4个阶段:
- 申请与分配:想用总线的主模块(如CPU或DMA控制器)提出申请。总线仲裁机构收到申请后,决定把下一个传输周期的总线使用权交给谁
- 寻址:取得使用权的主模块通过总线发出本次要访问的从模块的地址及有关命令,启动参与本次传输的从模块
- 传输数据:主模块和从模块进行数据交换,数据由源模块发出,经数据总线流入目的模块
- 结束阶段:主模块从总线上撤销所有控制信息和地址信号,最后交出总线使用权
总线通信通常用四种方式:同步通信、异步通信、半同步通信和分离式通信
同步通信
同步通信由统一的时钟信号(通常由CPU的总线控制部件发出时钟信号)控制,发送方和接收方永远按照固定时钟周期进行数据传输。在一个总线周期内,主模块在时钟前沿发出地址和命令,从模块在时钟后沿或下一个时钟前沿做出响应并传输数据,CPU内部通信、CPU与DDR内存之间的数据传输通常就是同步通信
- 优点是模块间的配合简单一致,由于双方预先约定好传输时序,因此不需要额外的握手过程,通信效率较高,控制电路也较简单
- 缺点是要求总线上各设备的速度差异不能过大,否则传输速度受到最慢设备的限制,缺乏灵活性
异步通信
异步通信克服了同步通信的缺点,允许各模块速度的不一致性,它的通信不依赖统一时钟,而是通过应答方式工作。当主模块发出请求(Request)信号时,需要等待从模块返回应答(Acknowledge)信号后才开始通信。
- 优点是不要求设备工作速度一致,因此能够连接不同速度的设备,扩展性好
- 缺点是握手过程会带来额外开销,传输效率低于同步通信,且控制逻辑较复杂
异步通信的应答方式又可分为以下几种方式:
- 不互锁:主模块发出请求信号后,不必等待接到从模块的回答信号,而是等待一段固定时间后便撤销信号,不管从设备是否收到,可靠性较低。同样,从模块接到请求信号后,在条件允许时发出回答信号,并且经过一段时间后默认主模块已收到回答信号后,自动撤销回答信号,通信双方无互锁关系。
- 半互锁:主设备发出请求,必须等到从设备的回答才撤销;但从设备发出回答后,等一段时间就自动撤销,不管主设备是否收到,如,在多机系统中,某个CPU需访问共享存储器时,该CPU发出访存命令后,必须收到存储器未被占用的回答信号,才能进行访存操作,此时就可以使用该方式
- 全互锁:主设备请求必须等到从设备回答才撤销;从设备回答也必须等到主设备请求已撤销后才撤销,通常用于对可靠性要求比较高的部分嵌入式系统
半同步通信
半同步通信是同步通信与异步通信的折中方案。系统仍采用统一时钟控制,但允许设备在必要时插入等待周期(Wait State),为此,半同步通信增加了一条等待(WAIT)线。当某个设备无法在规定时钟周期内完成操作时,可以将等待线置为低电平信号,来通知主模块延长传输时间,主模块会再等待一个时钟周期才从数据线上取数,该过程可以重复,让主模块多等待几个时钟周期。这样既保留了同步通信的高效率,又提高了对不同速度设备的适应能力,CPU访问慢速外设时常用该通信方式
- 优点是既保持了同步通信的简单性,又能兼容不同速度的设备
- 缺点是插入等待周期会降低总线带宽,且等待周期数通常只能是时钟的整数倍,存在一定浪费
分离式通信
分离式通信将请求和响应过程分离。主设备发出请求后即可释放总线,不必一直等待结果返回;从设备完成处理后,再通过总线发送响应。这样在等待期间,总线可以被其他设备使用,从而显著提高总线利用率。该方式特别适合访问延迟较大的设备,是现代高性能总线的重要设计思想,例如PCIe采用的事务层机制使用该设计方式
- 优点是极大地提高了总线利用率,尤其适用于多主设备(如多CPU、DMA控制器)且从模块响应慢的系统。避免了等待慢速设备时总线空闲的浪费
- 缺点每个设备都需要具备总线申请/仲裁能力(即“主设备”能力),控制逻辑非常复杂
存储器
存储器分类
按存储介质分类
- 半导体存储器(Semiconductor Memory):其存储元件由半导体器件组成,按其材料可分为双极型(TTL)存储器和MOS存储器。其优点是体积小、功耗低、存取速度快、易于集成,因此成为现代计算机最主要的存储器类型。但传统半导体存储器大多具有易失性,断电后数据会丢失;后来又发展出 EEPROM、Flash等非易失性半导体存储器,克服了这一缺点。常见的半导体存储器有:RAM、ROM、闪存Flash(存储卡、U盘)、SSD(固态硬盘,以Flash为存储介质)
- 磁表面存储器(Magnetic Surface Storage):通过在金属或塑料基体表面涂覆磁性材料来记录信息,工作时,载磁体高速旋转或移动,磁头利用磁场变化完成数据的读写。由于磁性材料具有剩磁特性,因此断电后仍能长期保存数据,属于非易失性存储器。根据载磁体形状的不同,可分为磁盘、磁带和磁鼓等类型。常见的磁表面存储器有:HDD(机械硬盘)、软盘(Floppy Disk)、磁带(Tape )
- 磁芯存储器(Magnetic Core Memory):磁芯存储器以铁氧体磁芯作为存储单元,每个磁芯都穿有驱动线和读出线,通过改变磁芯的磁化方向来表示二进制信息。磁芯具有断电后保持状态的能力,因此属于非易失性存储器。20世纪50~70年代曾广泛用作计算机主存,但由于体积大、功耗高、制造工艺复杂,后来被半导体存储器全面取代
- 光存储器(Optical Storage):利用激光在光学介质上进行数据读写,通过记录介质表面的物理或磁光特性变化来存储信息。其具有非易失性、存储密度高、保存时间长、可互换性好等特点,广泛用于软件发行、影音存储和数据归档,常见的光存储器有:CD(光盘)、DVD、Blu-ray(蓝光光盘)、磁光盘
按存取方式分类
- 随机存储器(Random Access Storage):能够按照地址直接访问任意存储单元,且访问时间不受存储单元物理位置影响。无论访问首地址还是末地址,其访问延迟通常保持一致,因此具有较高的存取效率。现代计算机中的主存储器和大多数半导体存储器均采用随机存取方式,如:RAM、ROM、Flash、SSD
- 顺序存取存储器(Sequential Access Storage):又称为串行访问存储器,读写数据时必须按照存储介质上的物理顺序依次访问,无法直接定位到目标数据位置。访问某个数据之前,需要先经过其前面的所有数据,因此存取时间与数据所在位置密切相关。此类存储器结构简单、单位容量成本较低,适用于大容量数据的长期保存和批量处理,但随机访问性能较差。顺序存取存储器有:磁带存储器(Tape)
- 直接存取存储器(Direct Access Storage):介于随机存取和顺序存取之间。访问时可先直接定位到某个较大的存储区域,然后在该区域内进行顺序查找,因此不同位置的访问时间并不完全相同。以机械硬盘为例:需要先通过寻道将磁头移动到目标磁道,然后等待盘片旋转到目标扇区才能读写数据,前段是直接访问,后段是串行访问。常见的直接存取存储器有HDD(机械硬盘)、软盘(Floppy Disk)、CD/DVD、Blu-ray 光盘
- 相联存取存储器(Associative Access Storage):又称按内容寻址。访问时不需要给出存储单元地址,而是根据存储内容的特征进行匹配查找,硬件自动返回匹配结果。这种方式查询速度极快,但实现成本较高,因此容量通常较小。常见实例有:CAM(Content Addressable Memory,内容寻址存储器)、TLB(快表,地址转换缓冲区)、某些高速网络交换设备中的查找表
按读写属性分类
- 可读写存储器RAM(Read/Write Memory):允许系统在运行过程中随时读取和修改其中的数据。RAM 通常作为主存储器使用,用于存放正在执行的程序和当前处理的数据。绝大多数 RAM 属于易失性存储器,断电后其中的信息会丢失。据存储信息原理的不同,RAM 又分为SRAM(静态RAM,通过触发器存储信息,常用于 Cache)和DRAM(动态RAM,通过电容充放电存储信息,常用于主存)
- 只读存储器ROM(Read Only Memory):只能读出存储的内容而不能重新写入。ROM 具有非易失性,断电后仍能保持存储内容,通常用它存放固定不变的程序、汉字字库、操作系统的固化等,其内容通常在制造阶段或专门编程阶段写入,正常工作时主要用于读取。早期的ROM由厂家通过掩模工艺,把原始信息记录在芯片中,一旦制成后无法更改,称为掩模型只读存储器MROM(Masked ROM)。随着技术发展, ROM 发展出多种可编程和可擦除形式:可编程只读存储器PROM(Programmable ROM,允许用户烧录一次)、可擦除可编程只读存储器EPROM(Erasable Programmable ROM,通过紫外线擦除重写多次)、电可擦除可编程只读存储器 EEPROM(Electrically Erasable Programmable ROM,可用电擦除重写多次)等。常见应用有:BIOS/UEFI 固件存储芯片、单片机程序存储器。(实际上,固态、U盘等使用的闪存芯片就是从EEPROM发展而来的,但它们已经不再属于ROM家族)
按在计算机的作用分类
按在计算机系统中的作用不同,存储器主要分为主存储器、辅助存储器、缓冲存储器。

存储器的层次结构

主存储器
主存的组成
主存工作是按存储单元的地址来实现对数据的读/写,工作时需要搭配两个寄存器(MAR、MDR寄存器)完成:
- MAR(Memo-ryAddress Register):存储器地址寄存器,用来存放将访问的存储单元的地址,其位数对应存储单元的个数(如 MAR为10位,则有210=1024 个存储单元,记为1K)。
- MDR(Memory Data Reg-ister):存储器数据寄存器,用来存放已经取出/将要写入存储单元的数据,其位数与存储字长相等。
- 进行读操作时,由CPU将需要读取存储字的地址送到MAR,经地址总线送至主存,并发出读命令。主存接到读命令后,将该地址单元的内容读出并送到数据总线上,写入操作类似
- 现代计算机中,MAR、MDR寄存器位于CPU中loading

存储单元的地址分配
主存中各存储单元的空间位置通过单元地址来标识,计算机可按字寻址,也可按字节寻址。当一个多字节数据存放到按字节编址的存储器中时,需要规定各个字节在内存中的排列顺序,这种规则称为字节序(Byte Order)。常见的字节序有大端方式和小端方式:
- 小端方式(Little-Endian):低位字节存放在低地址处,高位字节存放在高地址处,常用于x86、ARM等系统的主存访问。如,存储32位数据 0x12345678 从地址 1000H 开始存放时,内存中的排列为:1000H→78H、1001H→56H、1002H→34H、1003H→12H
- 大端方式(Big-Endian):的高位字节存放在低地址处,低位字节存放在高地址处,即按照人们书写数字的习惯进行存储,常见于网络协议、部分嵌入式系统的数据存放。如:存储32位数据 0x12345678 从地址 1000H 开始存放时,内存中的排列为:1000H→12H、1001H→34H、1002H→56H、1003H→78H
主存的技术指标
- 存储容量:存储容量是指主存能存放二进制代码的总位数,存储容量 = 存储单元个数 x 存储字长
- 存储速度:存储速度由存取时间和存取周期表示:
- 存取时间:又称为存储器的访问时间(Memory Access Time),是指进行一次读或写操作所需的时间,分读出时间和写入时间。读出时间是从存储器接收到有效地址开始,到产生有效输出所需的全部时间。写入时间是从存储器接收到有效地址开始,到数据写入存储单元为止所需的全部时间。
- 存取周期(Memory Cycle Time):指存储器进行连续两次独立的存储器操作(如连续两次读操作)所需的最小间隔时间,通常存取周期大于存取时间。现代MQS型存储器的存取周期可达100 ns;双极型TTL存储器的存取周期接近于10 ns。
- 存储器带宽:表示单位时间内存储器存取的信息量,单位可用字/秒或字节/秒或位/秒表示。如存取周期为500 ns,每个存取周期可访问16位,则它的带宽为32M位/秒。为了提高存储器的带宽,可以采用以下措施:缩短存取周期。增加存储字长(使每个存取周期可读/写更多的二进制位数),增加存储体
半导体存储芯片简介
半导体存储芯片采用超大规模集成电路制造工艺,在一个芯片内集成具有记忆功能的存储矩阵、译码驱动电路和读/写电路:
- 存储芯片:通过地址总线、数据总线和控制总线与外部连接,地址线和数据线的位数共同反映存储芯片的容量。如:地址线为10根,数据线为4根,则芯片容量为210 x 4 =4K bit
- 译码驱动:负责把地址总线送来的地址信号翻译成对应存储单元的选择信号,其译码驱动方式有两种:线选法和重合法(参考P76)
- 读/写电路:包括读出放大器和写入电路,用于完成读/写操作
RAM随机存取存储器
随机存取存储器按其存储信息的原理不同,可分为静态RAM 和动态RAM 两大类。
静态RAM
静态随机存取存储器SRAM(Static RAM)的基本存储单元是一个由6个MOS管构成的稳态触发器,它能在信息读出后,仍保持其原状态,不需要刷新。但电源掉电时,原存信息会丢失,故SRAM是易失性半导体存储器。
动态RAM
动态随机存取存储器DRAM(Dynamic RAM)的基本存储单元电路分为三管式和单管式两种,它们的共同特点都是靠电容存储电荷的原理来寄存信息,由电容上的电荷一般只能维持1~2ms,因此即使电源不掉电,信息也会自动消失。为此,必须在2 ms内对其所有存储单元恢复一次原状态,这个过程称为再生或刷新。由于它与静态RAM相比,具有集成度更高、功耗更低等特点,目前被各类计算机广泛应用。
动态RAM的刷新
刷新的过程实质上是先将原存信息读出,再由刷新放大器形成原信息并重新写入的再生过程。由于存储单元被访问是随机的,有可能某些存储单元长期得不到访问,其存储单元内的原信息将会慢慢消失,因此DRAM需要定时刷新(通常2ms,该时间又称为刷新周期或再生周期),通常有三种方式刷新:
- 集中刷新:在规定的一个刷新周期内,对全部存储单元进行逐行刷新,刷新时必须停止读/写操作。无法进行读/写操作的时间称为死时间,此时称系统/访存死区,该刷新方式的优点是刷新控制逻辑简单
- 分散刷新:对每行存储单元的刷新分散到每个存取周期内完成,由于刷新变成了单个存取周期的一部分,因此该方式延长了系统的平均存取周期,在高速系统中效率低,优点是系统没有连续的死区,控制也较简单
- 异步刷新:上述两种方法的折中,它将整个刷新间隔划分为相等的多个小时间段,在每一小段内,利用CPU访存或执行空闲指令的间隙,逐行完成刷新。其关键是合理安排刷新时序,既避免了集中刷新的长时间“死区”,又不会像分散刷新那样频繁打断系统节奏,缺点是控制复杂,这是目前最常用的刷新方式
静态RAM与动态RAM比较
- SRAM的读写速度快,且不需要刷新,但它集成度低、功耗大且成本高。因此,它主要用于对速度要求极高、但容量需求相对较小的关键部件,常用于高速缓冲存储器(CPU内部的L1、L2和L3缓存)、各种嵌入式系统的片上内存,以及网络设备中的路由表缓冲、数字信号处理器(DSP)的紧耦合内存等需要极低延迟的暂存场景
- DRAM的优势在于结构极简,集成度极高,能够以低成本实现大容量,主要用于计算机主存,此外,显存也广泛采用DRAM的一种变体(GDDR),以应对图形处理对高带宽和大容量的双重需求。数字电视、相机等消费电子产品中也使用DRAM作为大容量的帧缓冲或工作内存
ROM只读存储器
早期对ROM的定义为一旦写入原始信息就不能修改,但随着技术和需求的增长,发展出了PROM、EPROM和EEPROM等可以修改的ROM。半导体ROM分为两种:MOS型和TTL型。
掩膜只读存储器MROM
MROM的存储内容在芯片制造的最后一道光刻掩膜工序中就被直接固化,出厂后用户无法再做任何修改。它的原始存储单元是一个简单的MOS管,依靠其是否与位线连接来永久表示“0”或“1”。这种结构使其在所有ROM中成本最低、可靠性最高,但由于设计周期长、初期投入大且完全没有灵活性,仅适合量产后程序永久不变的成熟产品
可编程只读存储器PROM
ROM的基本单元电路由一个双极型电路和熔丝构成,出厂时所有存储单元均为统一状态(通常为全“1”),允许用户使用专用编程器进行一次性的现场编程。其机理是每个单元都串接有熔丝或反熔丝,编程时施加高电压/大电流选择性地烧断特定熔丝来写入数据,该过程物理上不可逆。这为小批量产品提供了灵活性,但一次写入便无法更改
可擦除可编程只读存储器EPROM
EPROM使用带有浮栅的特殊MOS管,通过高压注入电子到浮栅来编程。其最大的进步是支持数据擦除:芯片顶部有一个石英窗口,用紫外线照射若干分钟即可清除浮栅中的电子,使所有单元恢复初始状态,从而可以重新编程。但它擦除时必须整片进行且耗时较长
电可擦除可编程只读存储器EEPROM
EEPROM的改进在于实现了电擦除,无需紫外线,可以在系统中以字节为单位在线修改数据,这得益于更精细的隧道效应控制。不过,其写入速度较慢,且可擦写次数有限。它主要用来存储那些需要偶尔更新的系统关键数据,如配置参数、固件设置等
特殊:闪存
闪存(Flash Memory)基于EEPROM技术发展而来的,但为了提高密度和速度,改为按“块”进行擦除,它不属于传统意义上的ROM。它牺牲了字节级擦写的灵活性,换来了远大于EEPROM的集成度和更快的访问速度。根据单元连接方式的不同,NAND闪存适合追求低成本、大容量的数据存储(如固态硬盘、存储卡);而NOR闪存提供直接读取和就地执行程序的能力,常用于存放系统启动代码。
存储器与CPU的连接
核心部分为存储器的拓展
- 位拓展:增加存储字长,例如,2片 1 K x 4 位的芯片可组成 1 K x 8 位的存储器,只需要将它们的地址线连到一起,数据线则分开,其中一片的数据线连接高4位,另一片的数据线连接低4位
- 字拓展:增加存储器字的容量,例如,用2片1Kx8位的存储芯片可组成一个2Kx8
- 字、位拓展:综合上述二者,既增加存储字的数量,又增加存储字长。
存储器的校验
存储器中的数据在存储、读出、写入和传输过程中可能受到电磁干扰、硬件故障、宇宙射线等因素影响,从而发生比特翻转,为此,现代计算机普遍采用基于ECC的内存检错。
汉明距离
两个等长码字对应位不同的位置个数,称为这两个码字之间的汉明距离,对于一个编码系统,通常关注的是最小汉明距离 d,即任意两个合法码字之间的最小距离,根据编码纠错理论,有:
- 可以检错 d -1 位
- 可以纠错 [ ( d - 1 ) / 2 ] 位(向下取整)
- 可以同时检错e位,纠错t位:d ≥ e+t+1 (e≥t)
汉明码
汉明码是一种具有单错纠正(SEC,Single Error Correction)能力的编码,其核心思想是将校验位穿插在整个码串2的幂次方位置,让其交叉监督,该编码方式本质上是给每个数据位建立唯一的错误地址(称为指误字),使得系统在检错时不仅能发现单比特错误,更能直接定位并进行纠正。
汉明码中,如果要检测的二进制数据有n位,为使其具有纠错能力,需要增添k位检测位,组成n+k位的二进制码,n与k需要满足:
即k检错位有2k种可能,它应当能够表示n+k个可能出错的位置,再加上“没有错误”这一种情况。一些代码长度与k值的关系示例:
| 代码长度 | k (最小) |
|---|---|
| 1 | 2 |
| 2-4 | 3 |
| 5-11 | 4 |
| 12-26 | 5 |
| 27-57 | 6 |
检测码的放置位置
汉明码的数据和检验会混合放置,校验位会被放置在特定位置,来实现给每个数据位建立唯一的错误地址的能力。具体而言,校验位被放在索引为2的幂次方的位置,即第1、2、4、8、16…位,如:
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| 内容 | P1 | P2 | D1 | P4 | D2 | D3 | D4 | P8 |
| 类型 | 校验位 | 校验位 | 数据 | 校验位 | 数据 | 数据 | 数据 | 校验位 |
校验位放在2的幂位置,这样每个位置都能用唯一的二进制编号表示,如:位置1对于0001,位置2对应0010,位置3对应0011…,由此,每个校验位监督一组特定的、位置编号具有一定规律的数据位:
- P1(它的位置为1:0001):监督所有位号二进制最低位为1的位(1,3,5,7,9…)
- P2(它的位置为2:0010):监督所有位号二进制第二位为1的位(2,3,6,7,10,11…)
- P4(它的位置为4:0100):监督所有位号二进制第三位为1的位(4,5,6,7,12,13…)
- P8(它的位置为8:1000):监督所有位号二进制第四位为1的位(8,9,10,11,12…)
- 以此类推
这种分组方式形成了多重重叠的监督关系,是精确定位错误位置的基础
生成检测码
汉明码的校验位采用偶校验的方式生成,每个校验位由其所监督的数据位通过异或操作生成。
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 内容 | P1 | P2 | 0 | P4 | 1 | 0 | 1 |
| 类型 | 校验位 | 校验位 | 数据 | 校验位 | 数据 | 数据 | 数据 |
汉明码与纠错
存储器读出数据后,接收方收到生成的汉明码后,会重新计算各校验位,所有位的校验结果均为0表示无错误。若某几位的结果为1,将这些结果按校验位的高低顺序排列成一个二进制数构成指误字,其数值就直接指出了出错比特的物理位置编号。最后,仅需将该位置的比特取反,即可完成单比特错误的纠正。
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 内容 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
| 类型 | 校验位 | 校验位 | 数据 | 校验位 | 数据 | 数据 | 数据 |
提高访存速度的措施
为了解决CPU和主存之间的速度不匹配问题,尽可能提高访存速度,现代计算机通常从调整主存结构、采用层次结构(引入多级高速缓存Cache)、使用高速的存储芯片等方面进行优化
单体多字系统
通常情况下,程序和数据在存储器中是连续存放的,当CPU访问某个存储单元时,其附近的数据往往也会在短时间内被访问,这种现象称为空间局部性。基于这一特点,主存可以采用单体多字结构,即在一次存取操作中不仅读取目标字,还同时读取其后若干连续字,从而减少后续访存次数,提高数据传输效率。现代计算机中,这一思想主要体现在Cache块(Cache Line)的装入过程中:当发生Cache缺失时,主存通常不会只返回所需数据,而是一次返回整个Cache块,以利用程序的空间局部性。单体多字系统结构简单、实现容易,但由于系统仅包含一个存储体,同一时刻只能执行一次存取操作,因此只能提高单次访存的数据传输效率,而不能提高存储器的并行工作能力和整体带宽
多体并行系统
多体并行系统中的多体指主存使用多个相互独立的存储体(Bank),它们有相同的容量和存取速度,各自又都有独立的地址译码、驱动电路和读/写电路,它们能并行工作,也能交叉工作。当CPU连续访问数据时,不同地址的数据可由不同存储体分别提供,从而缩短连续数据的获取时间,提高主存的数据吞吐率。现代计算机中的DDR内存普遍采用多Bank结构,并结合交叉编址、通道并行等技术实现存储器并行访问。多体并行系统能够有效提高主存带宽,缓解CPU与主存之间的速度差距,但其硬件结构和控制逻辑相对复杂,需要额外的地址映射和存储体调度机制。
高位交叉编址
使用高位交叉编址时,数据会按地址顺序存放,一个存储体满后再存入下一个存储体,此时,高位地址可用于选择存储体号,低位地址可指出该存储体内的地址。这种编址方式的主要作用是将地址空间按大块划分到不同存储体中,便于存储容量扩展和地址管理,其地址译码逻辑简单,但连续地址通常落在同一个存储体中,无法发挥多体并行访问的优势,因此对提高访存速度帮助有限。
低位交叉编址
现代DDR内存基本都基于低位交叉编址,其特点是数据交叉存储在相邻存储体中,低位地址用来表示体号,高位地址为体内地址(这种编址方法又称为模M编址,M为存储体数)。低位交叉编址的优点是当CPU以流水线方式访问一个地址序列时,可以让多个存储体分时启动,以同样流水线的方式工作,实现时间上的并行,能极大地提高存储器带宽。
存控(存储器控制部件)
多体模块存储器不仅要与CPU交换信息,还要与辅存、I/O等设备交换信息,当多个设备同时提出访存请求时,需要由存储器控制部件(简称存控)来决定主存究竟与哪个部件交换信息,存控具有合理安排各部件请求访问的顺序以及控制主存读/写操作的功能。它由排队器、控制线路、节拍发生器及标记触发器等组成

- 排队器:当多个请求源请求访问同一个存储体时,排队器负责决定请求源的优先级别。由高到低的大致优先级如下:
- 刷新请求:DRAM若不及时刷新会丢失数据,因此刷新优先级最高
- DMA请求:磁盘、网卡等设备需要写入主存的数据通常实时要求高,且容易因为接收缓冲区溢出导致丢包,因此优先级也较高
- CPU访存请求:普通取指令和数据访问,CPU允许一定等待,且有Cache机制,优先级通常比DMA低
- 来自其他通道的优先级较低
- 节拍发生器:负责生成时序控制脉冲信号,可在交叉存取模式下产生连续的读/写节拍,使各存储体按流水方式交替启动,并与系统主时钟同步
- 存控标记触发器:用来接受排队器的输出信号,一旦响应某请求源的请求,就可以启动节拍发生器工作
- 控制线路:由它将排队器给出的信号与节拍发生器提供的节拍信号配合,向存储器各部件发出各种控制信号,用以实现对总线控制及完成存储器读/写操作,并向请求源发出回答信号,表示存储器已响应了请求等
高性能RAM芯片
采用高性能存储芯片也是提高主存速度的措施之一。DRAM集成度高,价格便宜,广泛应用于主存。为了进一步提高 DRAM的性能,人们开发了许多对基本 DRAM 结构的增强功能,出现了 SDRAM、RDRAM 和 CDRAM:
- 同步动态随机存储器SDRAM:传统DRAM与CPU异步工作,需要插入等待状态;SDRAM与系统时钟同步,在时钟上升沿即可精确传输数据,避免了信号传递的随机延迟,使读写更流畅,现代内存基本都是基于此类型发展而来的DDR SDRAM
- 总线式动态随机存储器RDRAM:核心是“高带宽”。它改变了宽并行总线设计,采用窄的、类似网络的高速串行总线传输数据,时钟频率很高。虽然总线位宽不大,但凭借极高的传输频率获得了可观的总带宽。它由Rambus公司设计,需要授权,曾用于部分游戏机和早期奔腾4电脑
- 缓存型动态随机存储器CDRAM:CDRAM是一种把Cache集成到DRAM芯片内部的方案,它将一个小容量、高速的SRAM缓存直接集成到DRAM芯片内部。由于内部总线远比外部总线宽,可以实现极高的内部数据交换,相当于把Cache-主存层次微缩到了芯片内,适合需要频繁突发访问的图形处理
高速缓冲存储器
随着处理器性能的不断提升,存储器的读写速度远远跟不上处理器的运算速度,这导致了著名的“存储墙”问题,即CPU大多数时间都在等待数据和指令从内存中取出。为缓解这一矛盾,现代计算机在 CPU 与主存之间加入了高速缓冲存储器Cache。CPU 访问数据时优先与 Cache 交换信息,仅在 Cache 中找不到所需数据时才访问主存,从而显著提高系统整体性能。
Cache 能够有效工作的基础是程序访问的局部性原理:当CPU从主存取指令或数据时,在一定时间内,只会对主存的局部区域进行访问,这是由于指令和数据在主存内都是连续存放的,且有些指令和数据往往会被多次调用(如子程序、循环程序和一些常数),即指令和数据在主存的地址分布不是随机的,而是相对的簇聚,使得CPU在执行程序时,访存具有相对的局部性。利用这一特点,系统会将主存中近期可能使用的指令和数据预先调入 Cache。当 CPU 后续访问这些内容时,可直接从 Cache 中读取,从而减少对主存的访问次数,提高系统性能。
为了与CPU的高速运行相匹配,Cache一般采用高速SRAM(静态随机存取存储器) 制作,其价格比主存所使用的DRAM贵,但Cache容量相对较小,因此能够在成本可接受的前提下有效解决存储器速度与容量之间的矛盾。
Cache的工作原理
为了便于主存与Cache之间的映射和数据交换,两者都会按照相同大小的块(Block)(现代CPU该块大小为64 字节)进行划分。主存和Cache都会被划分为若干块,每个块中包含多个连续的字(或字节),每个块的大小一致,由于主存大小远大于Cache大小,因此主存的块数量也远大于Cache的块大小。假设主存中每个字的地址是一个 n 位地址,分块后分为两段,使用高 m 位地址表示主存的块地址,低 b 位表示块内地址,主存的块数为 M = 2m。同理,缓存地址也类似地使用高 c 位表示缓存的块号,低 b 位表示块内地址,缓存块数位 C = 2 c 。由以上,C应该远小于M,主存和缓存块大小都为 2 b 。任何时刻都有一些主存块处在缓存块中。CPU需要读取主存的数据时,有两种可能:
- 缓存命中(Hit):CPU 访问的数据或指令已经存在于 Cache 中,可直接从 Cache 读取,无需访问主存,缓存命中时数据访问速度很快。
- 缓存不命中(Miss):CPU 访问的数据或指令不在 Cache 中,需要到主存中读取,系统会将该数据/指令所在的字块整个调入Cache中,并在主存块与缓存块之间建立映射关系,这种方式访问速度较慢。

命中率
命中率:在一个程序执行期间,设 Nhit 为Cache的总命中次数,Nmiss为访问主存的总次数,则命中率 h 为:
平均访问时间:设 t hit 为命中时的Cache访问时间,t miss为未命中时的主存访问时间, 1-h 为未命中率,则Cache-主存系统的平均访问时间 t a 为:
- 访问效率:以较小的硬件代价使 Cache-主存系统的平均访问时间 t a 越接近 t hit 越好,因此有访问效率 e:
Cache的容量与块长是影响Cache命中率的重要因素。一般而言,Cache容量越大,命中率越高,但成本也越高。对于块长,当块由小到大增长时,起初会因局部性原理使命中率有所提高,因为初始时增大块长,可以将更多有用字存入缓存,提高其命中率。但当块长增大到一定值后,倘若继续增大块长,反而会导致命中率的下降。这是因为,块长太大,容易导致所装入缓存块的有用数据反而少于被替换掉的有用数据。且增大块长,会导致Cache所能容纳的块数减少,使得新装入的块可能马上会被替换,需要该块的内容时又需要重新装载。块长的最优值是很难确定的,一般每块取4至8个可编址单位(字或字节)较好,也可取一个主存周期所能调出主存的信息长度。
Cache的基本结构
Cache主要由Cache存储体、地址映射变换机构、Cache替换机构几大模块组成:
- Cache 存储体:Cache存储体以块为单位与主存交换信息,为加速Cache与主存之间的信息交换,Cache访存的优先级较高。
- 地址映射变换机构:负责将CPU送来的主存地址转换为Cache地址。由于主存和Cache二者的块大小相同,因此它们的块内地址都是相对于块起始地址的偏移量(即低位地址相同),因此地址变换主要是主存的块号(高位地址)与Cache块号间的转换。如果转换后的Cache块已与CPU欲访问的主存块建立了对应关系,即已命中,则CPU可直接访问Cache存储体。如果转换后的Cache块与CPU欲访问的主存块未建立对应关系,即不命中,此刻CPU在访问主存时,不仅将该字从主存取出,同时将它所在的主存块一并调入Cache,供CPU使用。
- 替换机构:当Cache内容已满,且需要调入新块时,由替换机构按替换算法决定移出哪个块。Cache对用户是透明的,用户编程时所用到的地址是主存地址,用户根本不知道这些主存块是否已调入Cache内,替换工作由机器硬件自动完成。
对Cache的读写操作
- 读操作:当CPU需要读取数据,发出主存地址后,首先判断该存储字是否在Cache中。若命中,直接访问Cache,将该字送至CPU。若未命中,则需要访问主存,将该字传送给CPU的同时,要将该字所在的主存块装入Cache,如果此时Cache 已装满,就要执行替换算法,腾出空位才能将新的主存块调入。
- 写操作:写操作比较复杂,因为要考虑Cache与主存内容的一致性问题,即对Cache块内写入的信息,必须与被映射的主存块内的信息完全一致,写操作目前有以下不同方法:
- 直写(Write-through):书上称为写直达法,又称为存直达法(Store-through),即CPU修改Cache中的数据时,同时写入Cache和主存,该方法能随时保证主存和Cache的数据始终一致,但增加了访存次数,写操作时间为访问主存需要的时间。
- 回写(Write-back):书上称为写回法,又称为拷回法(Copy-back),写操作时,只把数据写入Cache而不写入主存,只有当Cache数据被替换出去时才写回主存。该方法写操作所需时间仅为访问Cache的时间,能显著提高系统性能,且对Cache数据的多次修改,只需要一次写入主存操作,能够显著减少对主存的写访问次数,因此现代通用处理器(x86、ARM)中的 Cache一般都采用回写策略,但其缺点是增加了Cache的复杂性。由于回写法会带来Cache和主存数据不一致问题,为了识别Cache中的数据是否与主存一致,Cache中的每个存储块会增设脏位(Dirty Bit)作为标志位,该标志位有两个状态:脏位为1表示数据被修改过,与主存不一致;脏位为0表示数据未修改过,与主存一致。在Cache进行块替换时,Dirty位为0的Cache块不必写回主存,因为此时主存中相应块的内容与Cache块是一致的;如果Dirty位为1,则需要先将其内容写回主存,再释放该块,并将该块Dirty位置为0
多核处理器的缓存一致性
在多核处理器中,每个核心都拥有独立缓存,但是都共享主存。这会带来更复杂的缓存一致性(Cache Coherence)问题,即当一个缓存中数据被修改时,不仅主存中相对应的字无效,连同其他缓存中相对应的字也无效(假设恰好其他缓存也有相应的字)。
为解决这一问题,现代处理器普遍采用缓存一致性协议(Cache Coherence Protocol),如MESI、MESIF、MOESI等。以MESI协议为例,其基本思想为:
- 每个Cache行都带状态:
- M(Modified):数据已修改,该数据的最新值仅本核拥有,主存、其他Cache的信息已过期
- E(Exclusive):数据未修改,仅本Cache拥有,与主存一致
- S(Shared):数据由多个Cache共享,与主存一致
- I(Invalid):缓存副本失效,不能再使用,必须重新获取
- 使用目录记录数据块的状态,如:该数据块当前在哪几个core中同时拥有
- 当某个core第一次从主存读入该数据块,根据目录信息,如果没有其他Cache拥有该块,则装入后状态为E;若存在其他Cache副本,则状态为S
- 当某个核心需要对共享的数据进行修改时,处理器会通过片上互连网络向其他核心发送一致性消息,使其他核心中对应的Cache块状态置为I,然后进行修改
- 当其他核心再次访问该数据时,由于发现本地Cache块已失效,必须从其他core获取最新数据
多级Cache
早期处理器主频较低,芯片集成度有限,SRAM Cache位于主板上,现代处理器将Cache和CPU制作在同一个芯片内,称为片载缓存或片内缓存
统一缓存和分立缓存
统一缓存指指令和数据都存放在同一缓存内的Cache,分立缓存指指令和数据分别存放在两个缓存中,一个称为指令Cache,一个称为数据Cache。
- 当机器采用超前控制或流水线控制方式时,一般都采用分立缓存
- 超前控制:指在当前指令执行过程尚未结束时就提前将下一条准备执行的指令取出,又称为超前取指或指令预取。
- 流水线控制实质上是多条指令同时执行,又可视为指令流水,要实现同时执行多条指令,机器的指令译码电路和功能部件也需多个。
- 超前控制和流水线控制特别强调指令的预取和指令的并行执行,因此,这类机器必须将指令Cache和数据Cache分开,否则可能出现取指和执行过程对统一缓存的争用
现代CPU的多级Cache
现代处理器通常都是片载缓存,并使用三级缓存结构:
- L1 Cache(一级缓存):最靠近执行单元,速度最快,容量较小,通常几十KB,访问延迟一般仅数个时钟周期,通常每个核心独享。L1处于流水线最前端,需要同时向取指单元和执行单元提供数据,因此通常采用分立缓存,以i7-7700CPU为例,其一级数据缓存大小为32KB
- L2 Cache(二级缓存):容量大于L1,速度略慢,通常每个核心独享,容量一般为数百KB至数MB,通常是统一缓存
- L3 Cache(三级缓存):容量进一步增大,多数处理器由多个核心共享,容量可达数十MB甚至上百MB,通常使用统一缓存
部分服务器处理器还会设计L4 Cache,通常作为片上Cache与主存之间的额外缓冲层。
Cache-主存地址映射
由主存地址映射到Cache地址称为地址映射。地址映射方式很多,有直接映射(固定的映射关系)、全相联映射(灵活性大的映射关系)、组相联映射(上述两种映射的折中)。
直接映射
直接映射是一种最简单、硬件实现成本最低的映射方式,其基本思想是:主存中的每个数据块只与唯一确定的缓存块相对应,映射关系为:
其中,i 为缓存块号,j 为主存块号, C 为缓存总块数。
当 CPU 访问某个主存块时,不需要在整个 Cache 中查找,只需根据主存块号计算出其对应的 Cache 块号,然后比较标记位(Tag)即可判断是否命中。
直接映射方式的缺点是不够灵活,因为每个主存块只能固定地对应某个缓存块,即使缓存内还空着许多位置也不能占用,使缓存的存储空间得不到充分的利用。此外,如果程序恰好要重复访问对应同一缓存位置的不同主存块,就要不停地进行替换,从而降低命中率。
全相联映射
全相联映射允许主存中每一字块映射到Cache中的任何一块位置上,这种映射方式可以从已被占满的Cache中替换出任一旧字块。显然,这种方式灵活,命中率也更高,缩小了块冲突率。与直接映射相比,它的主存字块标记从位增加到 t+c 位,这就使Cache“标记”的位数增多,而且访问Cache时主存字块标记需要和Cache的全部“标记”位进行比较,才能判断出所访问主存地址的内容是否已在Cache内。
这种方式所需的逻辑电路复杂,成本较高,实际的Cache还要采用各种措施来减少地址的比较次数。
组相联映射
组相联映射是对直接映射和全相联映射的一种折中,它把Cache分为 Q 组,每组有 R 块,并有以下关系:
其中,i为缓存的组号,j为主存的块号。组相联映射的特点为第 j 块将永远只映射到Cache的第 i 组内(直接映射的特性),但它可以映射到该组内的任意一个字块(全相联映射的特性),其性能和复杂性也介于二者之间。
组相联映射是现代CPU的通用映射方式,但术语有所不同,现代CPU中,Cache被分为多个组(set),每个组内会有多路(way,对应字块),通常而言:
- L1 Cache每组通常包含 8 路
- L2 Cache每组通常包含 8-16路
- L3 Cache每组通常包含 12-24路
- 8 路组相联是目前最常见的设计之一
替换策略
当新的主存块需要调入Cache并且它的可用空间位置又被占满时,需要替换掉Cache的数据,这就产生了替换策略(算法)问题。
在直接映射的Cache中,由于某个主存块只能缓存到Cache的固定位置,因此直接替换即可,无需替换算法。而在组相联和全相联映射的Cache中,主存块可以写入Cache中若干位置,这就有一个选择替换掉哪一个Cache字块的问题,常用的替换算法有以下几种:
- 先进先出(First-In-First-Out,FIFO)算法:FIFO算法选择最早调入Cache的字块进行替换,它不需要记录各字块的使用情况,比较容易实现,开销小,但没有根据访存的局部性原理,故不能提高Cache的命中率。因为最早调入的信息可能以后还要用到,或者经常要用到,如循环程序。
- 随机法:随机法是随机地确定被替换的块,比较简单,可采用一个随机数产生器产生一个随机的被替换的块,但它也没有根据访存的局部性原理,故不能提高Cache的命中率。
- 近期最少使用(Least Recently Used,LRU)算法:LRU算法比较好地利用访存局部性原理,替换出近期用得最少的字块。它需要随时记录Cache中各字块的使用情况,以便确定哪个字块是近期最少使用的字块。LRU算法的平均命中率比FIFO的高,现代CPU使用的是LRU的一种近似算法,能在命中率接近 LRU 的前提下大幅降低硬件开销
i7-7700HQ分析案例
以Intel Core i7 7700HQ为例,其核心信息如下:

- 4核8线程
- 采用三级Cache结构
一级缓存 - 采用分立缓存,数据和指令分开存放
- 四个核心都有自己独享的 32KB(指令) + 32KB(数据) 一级缓存,因此 4 × 32KBytes中4表示有4个独立的L1 Cache实例
- 采用组相联映射,8-way意味着使用8路组相联,每个组内有8个字块
- Intel常见的Cache Line(块)大小是 64 Bytes,因此每个组大小为 8 × 64 = 512 Bytes
- 数据/指令缓存分别有 32 × 1024 ÷ 512 = 64 组
- 64位地址中,组号需要占用 6 位(因为有64个组),块内偏移地址需要占用 6 位(因为每块64Bytes),因此地址组成为Tag | 组号(6位) | 块内偏移(6位),CPU取出组号找到组,取出Tag比较8个块的Tag找到块,块内通过偏移地址找到数据位置
二级缓存 - 采用统一缓存,指令和数据都存放在同一缓存
- 四个核心都有自己独享的 256KB 二级缓存,共有有4个独立的L2 Cache实例
- 采用组相联映射,4-way意味着使用4路组相联,每个组内有4个字块
- 共有 262144 ÷ (64 × 4) = 1024 组
三级缓存 - 采用统一缓存
- 4个核心共享 6 MB 三级缓存
- 使用12路组相联,每个组内 12 个块
- 共有 6291456 ÷ (64 × 12) = 8192 个组
辅助存储器
辅助存储器又称为外部存储器,简称外存,它作为主存的后援设备,与主存一起组成了存储器系统的主存-辅存层次。辅存具有容量大、速度慢、价格低、可脱机保存信息等特点,属“非易失性”存储器。广泛用于计算机系统的辅助存储器有硬磁盘(HDD)、固态硬盘(SSD)、光盘,以及用于冷数据存储或备份的磁带等,软盘辅助存储器属于已经被淘汰的历史产品,其中,硬磁盘与磁带属于磁表面存储器,固态硬盘则基于闪存颗粒,属于半导体存储器
磁表面存储器
磁表面存储器的原理,是在特定形状的载体(如盘状、带状)上涂覆磁性材料层,利用磁层来记录信息。工作时,载磁体高速运动,磁头在其表面对磁层进行读/写操作。信息在磁层上留下的轨迹称为磁道,其中,磁盘的磁道是一组同心圆,磁带的磁道是沿磁带长度方向的直线
技术指标
- 记录密度:指单位长度内所存储的二进制信息量,它由道密度和位密度组成:记录密度 = 道密度 × 位密度
- 道密度:为了避免干扰,磁道与磁道之间需保持一定距离,相邻两条磁道中心线之间的距离称为道距。而道密度就是指垂直于磁道方向上,单位长度内包含的磁道数,道密度Dt等于道距P的倒数,即:Dt = 1 / P,单位是TPI(Track Per Inch,道每英寸)或tpm(道每毫米),它决定了磁盘径向能划分多少个同心圆。
- 位密度:指单位长度磁道能记录二进制信息的位数,又称为线密度,单位是bpi(Bits Per Inch,位每英寸)或bpm(位每毫米),它反映磁道上数据排得有多密。磁带存储器主要用位密度来衡量,常用的磁带有800bpi、1600bpi、6250 bpi等。对于磁盘,由于磁盘内外圈磁道周长不同,通常按最内圈的位密度来标称,以保证所有磁道存储容量一致,位密度Db可按下式计算,其中f t为每道总位数,dmin为同心圆最小直径:
- 存储容量:指外存所能存储的二进制信息总数量,一般以位或字节为单位。磁盘存储器的存储容量 = 存放信息的盘面数 × 每个盘面的磁道数 × 每条磁道上记录的二进制代码数。磁盘有格式化容量和非格式化容量两个指标。非格式化容量是磁表面可以利用的磁化单元总数。格式化容量指刨去地址码、同步信息、校验位等控制信息所需空间之后的容量,即用户可以使用的容量,现代存储设备格式化容量一般为非格式化容量的85%-95%以上
- 平均寻址时间:由存取方式分类可知,磁盘采取直接存取方式,寻址时间分为两个部分,其一是磁头寻找目标磁道的找道时间Ts,其二是找到磁道后,磁头等待欲读/写的磁道区段旋转到磁头下方所需要的等待时间Tw。由于从最外圈磁道找到最里圈磁道和寻找相邻磁道所需时间是不等的,而且磁头等待不同区段所花的时间也不等,因此,寻址时间取其平均值,称为平均寻址时间Ta,它是平均找道时间和平均等待时间之和。磁带存储器采取顺序存取方式,磁头不动,磁带移动,不需要寻找磁道,但要考虑磁头寻找记录区段的等待时间,所以磁带寻址时间是指磁带空转到磁头应访问的记录区段所在位置的时间
- 数据传输率:指单位时间内磁表面存储器向主机传送数据的位数或字节数,它与记录密度 Db 和记录介质的运动速度 V 有关:Dr = Db x V
- 误码率:误码率是衡量磁表面存储器出错概率的参数,它等于从辅存读出时,出错信息位数和读出信息的总位数之比。为了减少出错率,磁表面存储器通常采用循环冗余码来发现并纠正错误
记录原理
- 写入原理(电到磁的转换):写入时,记录介质在磁头下方匀速通过,写入线圈导通一定方向和大小的电流,使磁头导磁体磁化,产生一定方向和强度的磁场。由于磁头与磁层表面间距非常小,磁力线直接穿透磁层表面,将对应磁头下方的微小区域磁化(称为磁化单元)。根据写入驱动电流的不同方向,磁层表面会被磁化的极性方向不同(比如S→N极指向),以区别记录“0”或“1”。
- 读出原理(磁到电的转换):读出时,记录介质在磁头下方匀速通过,磁头相对于一个个被读出的磁化单元作切割磁力线的运动,从而在磁头读线圈中产生感应电势,其方向正好和磁通的变化方向相反。由于原来磁化单元的剩磁通的方向不同,感应电势方向也不同,便可读出“1”或“0”两种不同信息。
磁记录方式
磁记录方式又称为编码方式,它是按某种规律将一串二进制数字信息变换成磁表面相应的磁化状态。磁记录方式对记录密度和可靠性都有很大影响,常用的记录方式有以下几种:

- 归零制(RZ):记录1时通一个正向脉冲电流,记录0通一个反向脉冲电流,但每次脉冲后电流都迅速回归到零。每位数据对应介质上两个独立的磁化区域,磁化翻转次数多,记录密度极低,目前已被淘汰。
- 不归零制(NRZ):写电流不再归零。记录1时一直通正向电流,记录0时一直通反向电流。只有在相邻两位数据不同时,边界才发生磁化翻转。减少了翻转,但连续记录相同数据时无翻转,无法提取时钟。
- 见1就翻不归零制 (NRZ1):NRZ的改进版。只在记录1时翻转电流方向,记录0时电流方向维持不变。翻转次数依然较少,同样无法解决连续0时的同步问题
有自同步能力的编码: - 调相制 (PM):利用磁化翻转的相位来同步。它规定每位数据的边界必须翻转,作为强制性的同步信号。1规定为位周期中心由正到负的翻转;0规定为位周期中心由负到正的翻转。当连续两个相同数据时,中间边界也发生翻转来保证正确的相位。其优势是翻转规律性强,自同步能力强
- 调频制 (FM):在每位数据的起始处强制发生一次翻转,作为同步时钟信号。记录1时在位中心和位起始边界各翻转一次,共两次;记录0时只在位起始边界翻转一次,位中心不翻转。其特征是记录1的翻转频率是记录0的两倍,“调频”由此得名。
- 改进调频制 (MFM):这是对FM的优化,旨在减少不必要的时钟翻转以提升密度。它保留了位中心记录数据的规则,但有选择地插入时钟。记录数据1仍在位中心发生翻转;记录数据0在位中心不翻转。其关键特性是时钟插入条件:只有当当前位是0,且前一位也是0时,才在当前位起始边界插入一个时钟翻转。其他情况一律不插入。优势点是相比FM,磁化翻转次数大幅减少,在相同长度的介质上可以记录更高密度的数据,同时保持了自同步能力,它是现代磁盘的主要记录方式
硬磁盘存储器
硬磁盘存储器的盘片是由硬质铝合金材料制成的,其表面涂有一层可被磁化的硬磁特性材料,它有以下分类:
- 按磁头的工作方式分为:
- 固定磁头磁盘存储器:磁头位置固定不动,磁盘上的每一个磁道都对应一个磁头,省去了磁头沿盘片径向运动所需寻找磁道的时间,存取速度快,只要磁头进人工作状态即可进行读写操作
- 移动磁头磁盘存储器:在存取数据时,磁头在盘面上作径向运动,这类存储器可以由一个盘片组成,也可由多个盘片装在一个同心主轴上,每个记录面各有一个磁头,所有这些磁头连成一体,固定在一个支架上可以移动,任何时刻各磁头都位于距圆心相等距离的磁道上,这组磁道称为一个柱面。目前,这类结构的硬磁盘存储器应用最广泛,最典型的就是温切斯特磁盘。
- 按磁盘是否具有可换性可分为:
- 可换盘磁盘存储器:盘片可以脱机保存。这种磁盘可以在互为兼容的磁盘存储器之间交换数据,便于扩大存储容量。
- 固定盘磁盘存储器:指磁盘不能从驱动器中取下,更换时要把整个头盘组合体一起更换
温切斯特磁盘是一种可移动磁头固定盘片的磁盘存储器,简称温盘。它是目前用得最广,最有代表性的硬磁盘存储器。它于1973年首先应用在IBM3340硬磁盘存储器中。其特点是采用密封组合方式,将磁头、盘片、驱动部件以及读/写电路等制成一个不能随意拆卸的整体,称为头盘组合体。因此,它的防尘性能好,可靠性高,对环境要求不高。
硬磁盘存储器的结构
硬磁盘存储器由磁盘驱动器、磁盘控制器、盘片三部分组成
磁盘驱动器
磁盘驱动器是物理机电设备,核心部件包括主轴系统、定位驱动及数据控制等部分:
- 主轴系统:主要部件是驱动盘片以恒定高速旋转的主轴电机,提高主轴转速能一定程度提高磁盘的数据存取速率,现代机械硬盘转速通常为5400 RPM或7200 RPM(RPM,每分钟转速)。
- 定位驱动系统:由音圈电机驱动,负责整体移动磁头快速定位到目标磁道,现在主流是闭环控制的音圈电机。磁头具备浮动的特性,即当盘面作高速旋转时,依靠盘面形成的高速气流将磁头微微“托”起,使磁头与盘面不直接接触而是形成微小的气隙。
- 数据控制部分:负责数据转换及读/写控制操作。在写操作时,首先接收选头选址信号,用以确定道地址和扇段地址。再根据写命令和写数据选定的磁记录方式,并将其转化为按一定变化规律的驱动电流注入磁头的写线圈中。读操作时,首先也要接收选头选址信号,然后通过读放大器以及译码电路,将数据脉冲分离出来。

磁盘控制器
主机与驱动器间之间的接口,它通常是一块电路板,其作用是接收由主机发来的命令,将它转换成磁盘驱动器的控制命令,并进行数据串并转换、校验纠错、坏道管理等,相当于硬盘的“大脑”。书上的接口ST-506、ESDI等早期接口已完全淘汰,IDE也已过时,现在主流是SATA接口。
盘片
存储介质本体,现代硬盘通常将多片盘片固定在同一主轴上,磁头同步移动,组成一个盘组。在盘组中,最上和最下两个盘的外出面通常作为保护面,但也可作为记录面使用。因此,一组6个盘片的盘组,记录面可能是10个或12个。现代主流的机械硬盘使用氦气封装技术,3.5英寸桌面/企业级机械硬盘内通常有1-5个盘片,最高能做到 10片或更多,2.5英寸的笔记本硬盘内通常有1-2个盘片。
磁道记录格式
磁盘的信息串行排列在磁道上,以字节为单位,若干字节组成数据块,多个数据块可构成记录,多个记录进一步组成文件。为了便于寻址,数据块在盘面上的分布遵循一定规律,称为磁道记录格式。具体而言,磁盘记录格式用于规定磁道上数据的构成方式,它可分为定长记录格式和不定长记录格式,一个记录可能包括以下字段:
- 同步字段:帮助读写电路与磁盘上的位流建立同步,确定数据开始位置
- 地址标识字段:用于标识后续内容是地址信息
- 地址字段:记录柱面号、磁头号、扇区号等位置信息,用于帮助数据控制系统确认当前是哪个扇区
- 数据字段:磁盘实际存储数据的位置
- 长度字段:在不定长记录格式中记录数据长度,用于确定记录边界
- CRC/ECC字段:用于检测或纠正读写过程中产生的错误,提高可靠性
- 间隔字段:相邻记录或扇区之间预留的空白区域,用于补偿转速误差、控制器处理延迟以及磁头切换时间
- 结束标志:标识记录或数据块结束,某些记录格式中会使用
磁道/柱面/扇区
磁道(Track)是磁盘盘面上的同心圆形记录区域,用于存放磁记录信息。每个盘面由内向外(或由外向内)划分为若干条磁道,每条磁道具有唯一编号
每个盘面上的磁道被进一步划分为若干扇区(Sector),扇区本质上是磁道的一段圆弧,它是磁盘进行数据读写和寻址的基本单位。
一个具有n个盘片的磁盘组,各盘面上具有同一半径的2n个磁道共同构成一个柱面(Cylinder)。在可移动磁头磁盘中,由于所有磁头由同一执行机构驱动,一次寻道即可同时定位到某一柱面的所有磁道,因此柱面常作为磁盘数据组织和访问的重要单位。

传统磁盘采用CHS寻址方式,通过柱面号、磁头号和扇区号唯一确定数据位置。访问数据时需依次完成寻道、选头和扇区定位三个过程。由于柱面个数正好等于磁道数,因此柱面号就是磁道号,磁头号则是盘面号。在定长记录格式中,磁盘寻址时的地址由磁道号(选中柱面)、盘面号(选中磁头)、扇区号(选中扇区)组成,书上还有台号作为地址组成部分,台号是磁盘设备编号,已被淘汰。
通常而言,一个机械硬盘包含多个盘面(如盘面 A、B、C 等),各盘面上半径相同、编号相同的磁道共同构成一个柱面。为了减少磁头寻道次数,连续数据通常优先存放在同一柱面的不同盘面上,即在盘面 A 的某条磁道写满后,继续写入盘面 B、盘面 C 上对应的磁道,而不是先写满盘面 A 的全部磁道再切换到其他盘面。采用柱面组织方式后,访问连续数据时通常只需进行磁头切换,而无需移动磁臂重新寻道,从而降低寻道时间,提高顺序读写效率。当一个柱面中的空间使用完毕后,磁头组件再移动到下一个柱面继续存取数据。要注意的是,传统机械硬盘虽然能够在同一柱面的不同盘面之间快速切换磁头,但通常一次只有一个磁头处于工作状态,因此数据仍然是依次读写的,而非多个盘面同时并行传输数据。柱面组织的主要作用是减少磁头移动开销,而不是提供类似磁盘阵列(RAID)的并行读写能力
磁盘阵列RAID
磁盘阵列 RAID(Redundant Array ofIndependent Disks)的基本原理是将并行处理技术引入到磁盘系统,使用多台小型温盘构成同步化的磁盘阵列,然后将数据展开分放在磁盘设备上,读取时,它们能并行提供数据,显著提到磁盘在中大型机中的工作效率。
定长记录格式
定长记录格式的特点是每条记录长度固定,并按固定边界顺序存放,一条记录结束后,下一条记录从新的记录区或扇区边界开始写入,而不会紧接前一条记录的剩余空间存放。这会造成一定的内部空间浪费,但由于记录长度固定,系统可根据记录号直接计算其存储位置,寻址简单、随机访问效率高。现代磁盘采用固定大小扇区(如512B或4KB),本质上继承了定长记录格式便于寻址和管理的思想
不定长记录格式
不定长记录格式中,各记录可根据实际数据长度占用不同大小的存储空间,一条记录结束后,下一条记录紧接其后存放,无需等待新的扇区或固定边界开始写入。这样能够充分利用磁道空间,减少内部碎片,提高存储容量利用率。但由于记录长度不固定,系统难以直接根据记录号计算其位置,通常需要借助记录头、长度字段或索引信息进行定位,因此寻址和管理相对复杂
软盘与磁带
软磁盘存储器是一种利用柔软的聚酯薄膜盘片、通过磁头接触式读写的移动存储设备,其典型代表是容量仅为1.44MB的3.5英寸软盘。软盘盘片的盘基是由厚约为76μm的聚酯薄膜制成,其两面涂有厚约为2.3-3μm的磁层,盘片装在塑料封套内,套内有一层无纺布,用来防尘、保护盘面、消除静电。使用时,盘片连封套一起插入软盘机中,盘片在塑料套内旋转,磁头通过槽孔与盘片上的记录区接触进行读写,其存储原理和记录方式与硬磁盘存储器相同,区别在于:
- 硬盘转速高,存取速度快,靠浮动磁头读/写,磁头不接触盘片,通常是固定磁头、固定盘组
- 软盘转速低,存取速度慢,磁头直接接触盘片进行读/写,可快速更换盘片(类似于光盘),其盘片裸露的部分极易受灰尘和磁场影响,再加上磁头直接接触,易造成盘面磨损和误码,可靠性极差。它曾在20世纪八九十年代广泛用于文件存储和传递,但其历史使命被容量、速度、体积和可靠性全面碾压的U盘迅速终结,现已基本被淘汰
磁带存储器是一种利用涂覆磁性材料的塑料带作为记录介质。磁带通常卷绕在磁带盒内,工作时由驱动机构带动磁带高速运动,磁头在磁带表面记录和读取数据。其存储原理与硬盘、软盘相同,都是利用磁介质记录二进制信息,但数据按带长方向顺序排列存储。磁带存储器容量大、单位存储成本低、离线保存方便,且断电后数据可长期保存,因此长期被用于大型计算机系统的数据备份、归档和容灾存储。但由于其只能顺序访问,数据检索速度远低于硬盘和固态硬盘,不适合作为日常在线存储设备。目前磁带并未被淘汰,仍广泛应用于数据中心、云服务和企业级冷数据归档等场景
光盘存储器
光盘(Optical Disk)是利用光学方式进行读写的圆盘,由激光视频唱片和数字音频唱片发展而来。用激光在介质上写入并读出信息的技术称为光存储技术;若介质为磁性材料,则称磁光存储。采用非磁性介质、不可擦写的光存储为第一代光存储技术;磁光存储作为第二代,主要特点是可擦除重写。根据光存储性能和用途的不同,光盘存储器可分为三类:
- 只读型光盘(CD-ROM):光盘内的数据和程序是由厂家事先写入,用户只能读出,不能修改或重写,主要用于电视唱片、数字音频唱片、文献数据库等领域,因它具有ROM 特性,故称为 CD-ROM(Compact Disk-ROM)。
- 只写一次型光盘(WORM)(Write Once Read Many):只能写入一次,可多次读出,主要用于计算机系统中的文件存档,或写入的信息不再需要修改的场合
- 可擦写型光盘:可以反复进行读写,具有较好可重用性,从原理上分为光磁记录(利用热磁反转效应改变磁化方向)和相变记录(利用材料在晶态与非晶态之间转换改变反射率)两种。常见可擦写光盘如CD-RW约700MB,DVD-RW/ RAM为4.7GB(双层8.5GB),BD-RE(蓝光)可达25GB(双层50GB),读取速度可达到数十MB/s,刻录速度一般为数十MB/s
存储原理
光盘利用激光束在记录介质上烧蚀出不同长度的凹坑(pit)和未烧蚀的平坦区域(land)来表示二进制信息“0”和“1”。写入时,高功率激光束在介质上烧出凹坑;读取时,低功率激光束照射盘面,凹坑处反射光弱,平地反射光强,通过检测反射光强度的变化即可读出存储的数据。对于可擦写光盘(如相变型),利用激光加热使介质在晶态与非晶态之间可逆转变,晶态反射率高(对应“0”),非晶态反射率低(对应“1”),从而实现重复擦写。
光盘存储器的组成
光盘存储器与磁盘存储器类似,但它除了机械电子结构外,还有光学结构。它也由盘片、驱动器和控制器组成。

光盘利用激光进行信息的记录和读取。激光器发出的光束经分离器分成记录光束(90%的光束)和读出光束(10%的光束),记录时,高功率激光经调制和聚焦后照射盘面,在记录层形成微小凹坑以存储数据;读取时,低功率激光照射盘面,不同区域对激光的反射特性不同,反射光经分光系统导向光电二极管,转换为电信号后恢复出数据
光盘盘片外形与磁盘盘片相似,但采用光学方式存储信息,并使用非接触式读/写信息,光学头与盘面的距离几乎比磁盘的磁头与盘面的间隙大1万倍,互不摩擦,介质不会被破坏,大大提高了光盘的耐用性,其使用寿命可长达数十年以上。只读型光盘和一次写入型光盘通常由基板、反射层和记录层构成。基板一般采用透明聚碳酸酯材料,反射层多为铝膜,记录层则由对激光敏感的材料组成。写入时,高功率激光使记录层局部熔化形成凹坑(Pit),未改变的区域称为平地(Land)。读取时,通过检测凹坑和平地反射光强的差异来识别数据。由于凹坑与平地会导致反射光产生不同的干涉效果,因此光电探测器能够将其转换为数字信息。
CRC错误检测
CRC(循环冗余校验)是一种常用的检错编码技术,在存储器系统中主要用于检测数据在存储、读取或传输过程中是否发生错误。数据写入时,根据数据内容计算并附加CRC校验码;读取时重新计算CRC并与原校验码比较,若结果不一致则说明数据可能已损坏。由于CRC具有较强的检错能力且实现简单,因此广泛应用于硬盘、光盘、磁带、SSD等辅助存储设备的数据完整性校验。CRC本身通常只具备检错能力,不负责纠错,发现错误后一般通过重读数据、ECC纠错或上层恢复机制进行处理
输入输出系统
随着计算机系统的不断发展,I/O设备的数量和种类也越来越多,它们与主机的联络及信息交换方式主要依赖程序查询、中断和 DMA三种控制方式。
I/O系统的发展
历史上,输入输出系统的发展经历了以下四个阶段:
- 早期阶段:CPU直接控制I/O
早期计算机中没有专门的输入输出管理机构,I/O设备与主存交换信息都必须通过CPU,输入输出过程是穿插在CPU执行程序过程之中进行的,当I/O设备与主机交换信息时,CPU需要停止其他运算。程序通过查询设备状态的方式判断设备是否准备就绪,CPU需要长时间等待设备响应,导致系统效率较低 - 通过接口和DMA进行数据交换
随着外设种类和数量的增加,在CPU与外设之间增加了I/O接口,接口负责设备控制、状态管理和数据缓冲,使CPU不必直接操作设备硬件。之后又进一步发展后引入中断技术和DMA(Direct Memory Access,直接存储器访问)技术,允许外设与主存直接交换数据,仅在传输开始和结束时需要CPU参与,并在结束时通过中断方式通知CPU,而不需要CPU持续查询设备状态,有效减轻了CPU负担,提高系统吞吐量。 - 通过I/O通道进行数据交换
当外设数量进一步增加、数据传输任务更加复杂时,中大型机仅依靠DMA已难以满足需求,于是出现了I/O通道(Channel)。I/O通道是一种专门负责输入输出工作的硬件部件,它能够执行通道程序,独立管理设备与主存之间的数据传输。CPU只需启动通道并下达任务,之后通道即可自主完成大量I/O操作。 - 通过I/O处理机进行数据交换
I/O处理机(IOP,Input/Output Processor)是在通道基础上的进一步发展。它本质上是一种专门用于管理输入输出工作的通用CPU,具备更完整的指令系统和处理能力。此阶段I/O系统拥有独立处理能力,CPU只需发出I/O指令启动通道或I/O处理机即可,此后完全由I/O子系统自主完成数据传输,实现了输入输出操作与CPU计算的真正并行及高度独立性
I/O系统的组成
输入输出系统由I/O软件和I/O硬件两部分组成:
- I/O软件负责控制I/O设备与主机之间的数据交换,分为:
- I/O指令:是CPU指令系统的一部分,用于操作I/O接口中的寄存器。典型格式包括操作码、命令码、设备码等,执行如启动设备、测试状态、数据传送等操作
- 通道指令:专用于通道或I/O处理机的指令,存放在主存中形成通道程序。它描述了数据在内存中的位置、传送方向、传送字节数等信息,由通道独立执行
- I/O硬件包括I/O设备、I/O接口及系统总线,是数据传送的物理载体
I/O设备与主机的联系
解决CPU如何对I/O设备编址,如何寻找I/O设备号,I/O设备与主机是怎么通信的等等,具体如下:
- I/O设备的编址方式:通常将I/O设备码看做地址码,对I/O地址码的编址可采用两种方式:
- 统一编址(存储器映射方式):I/O地址与内存单元共用同一地址空间,使用访存指令即可访问I/O端口,其优点是指令丰富,无需专用I/O指令,缺点是需要占用内存地址空间
- 独立编址(I/O映射编址):为I/O端口设置独立的地址空间,需要使用专用的I/O指令(如IN、OUT)进行访问,有点是不占用内存地址,指令清晰,缺点是需专用指令,编程灵活性较低
- I/O设备的寻址方式:由于每台设备都拥有一个设备号,因此,当要启动某一设备时,可由I/O指令的设备码字段直接指出该设备的设备号,然后通过接口电路中的设备选择电路,来可选中要交换信息的设备
- I/O数据的传送方式分为:
- 并行传送:在同一瞬间,n位信息同时从CPU输出至I/O设备,或由I/O设备输入到CPU,其特点是传送速度较快,但要求数据线多
- 串行传送:在同一瞬间只传送一位信息,在不同时刻连续逐位传送一串信息,其特点是传送速度较慢,但它只需一根数据线和一根地线。当I/O设备与主机距离很远时,采用串行传送较为合理,例如远距离数据通信
- 联络方式:即I/O设备与主机之间互相了解彼此状态,如:是否可以传送、传送是否已结束等。按I/O设备工作,速度的不同,可分为三种联络方式:
- 立即响应方式:对于一些工作速度十分缓慢的I/O设备,当它们与CPU发生联系时,通常都已使其处于某种等待状态,因此,只要CPU的I/O指令一到,它们便立即响应,故这种设备无须特殊联络信号
- 异步工作采用应答信号联络:当I/O设备与主机工作速度不匹配时,通常采用异步工作方式。这种方式在交换信息前,I/O设备与CPU各自完成自身的任务,一旦出现联络信号,彼此才准备交换信息,接口通常有缓存设备,CPU或I/O准备好数据时都先缓存到该处,则通知对方取走
- 同步工作采用同步时序联络:同步工作要求I/O设备与CPU的工作速度完全同步,这种联络互相之间还得配有专用电路,用以产生同步时序来控制同步工作。
- 连接方式:I/O设备与主机之间的连接方式通常有两种:辐射式和总线式,辐射式要求每台I/O设备都有一套独立连接线,总线式则通过一组(数据、控制、地址)总线进行连接,总线式是现代计算机的主流连接方式。
传输控制方式
I/O设备与主机交换信息时,共有5种控制方式:程序查询方式、程序中断方式、直接存储器存取方式(DMA)、I/O通道方式、I/O处理机方式。计算机组成原理主要介绍前3种方式,计算机体系结构会进一步详细介绍包括后两种在内的控制方式
程序查询方式
程序查询方式下I/O接口内会设置一个能反映I/O设备是否准备就绪的状态标记,CPU通过程序不断查询该状态标记来确认I/O设备是否已做好准备,从而控制I/O设备与主机交换信息。程序查询方式的工作流程如下:
- CPU一开始在执行某程序
- 当现行程序需要启动某个I/O设备(例如从磁带读入一个数据块至主存)时,CPU会将相应的I/O查询子程序插入当前运行的程序中
- CPU在启动I/O设备后,会开始反复查询该设备的状态。若设备尚未准备就绪,CPU就继续查询,无法进行其他工作
- 若查询到设备准备就绪,CPU便将数据一个字一个字地从I/O接口取到CPU,再从CPU再送入主存,直到整个数据块传输完成
- CPU返回继续执行原程序
- 在整个查询期间和数据传输期间,CPU都无法继续执行原程序。在查询阶段,CPU如“原地踏步”般不断检测设备状态,完全终止了原程序的执行;在数据传输阶段,CPU也必须逐字处理数据传送,同样不能执行原程序。这种工作方式使得CPU和I/O设备只能串行操作,CPU的工作效率因此很低。
程序中断方式
程序中断方式下CPU在启动I/O设备后,,不再反复查询和等待设备是否准备就绪,而是继续执行自身程序。当I/O设备准备就绪时,会主动向CPU发出中断请求,CPU响应后,暂停现行程序,转入中断服务程序,从I/O接口存取数据,待数据处理完成后,再返回到原程序的断点处继续执行。
与程序查询方式相比,在I/O设备进行准备的阶段,CPU无需时刻查询设备状态,不会出现“原地踏步”现象。这意味着CPU执行程序与I/O设备做准备可以同时进行,从而极大地提高了CPU的工作效率。
DMA方式
DMA(Direct Memory Access,称为直接存储器存取或直接内存访问)方式在程序中断方式的基础上,进一步减少了CPU在I/O-内存数据传输过程中的参与度。虽然程序中断方式消除了程序查询方式的“踏步”现象,提高了CPU资源的利用率,但CPU在响应中断请求后,仍须暂停当前程序并转入中断服务程序,且为了完成I/O设备与主存之间的信息交换,可能需要占用CPU内部的一些寄存器,这同样是对CPU资源的消耗。如果I/O设备能直接与主存交换信息而不占用CPU,则CPU的资源利用率可进一步提高,由此便出现了DMA方式。
在DMA方式中,主存与I/O设备之间设有专门的数据通路,数据块的传送由DMA控制器负责,传送过程中不需要CPU参与,也不需要调用中断服务程序。CPU只需要数据传输前进行DMA的初始化(设置主存起始地址、传送长度、方向/模式等控制信息)、启动DMA控制器,以及在传送结束或发生错误时处理中断,而不需要参与数据传输过程。
当DMA与CPU同时需要访问主存时,需要通过总线仲裁决定总线使用权。在多数系统中,DMA的优先级较高,因此总线占有权会优先交给DMA。这种DMA占用了本可能属于CPU的存取周期,使CPU暂时无法访问主存的现象,称为周期窃取或周期挪用,窃取的时间一般为一个或多个存取周期,因此又将DMA占用的存取周期称为窃取周期或挪用周期。而且,在DMA窃取存取周期期间,CPU不能进行需要访问主存的操作,仍可继续执行内部操作(如某些算术逻辑运算)。因此,与程序查询方式和程序中断方式相比,DMA方式减少了CPU对大量数据传送的直接干预,提高了数据传送效率和CPU资源利用率
现代计算机的传输控制
在现代计算机中,上述三种传输控制的使用场景:
- DMA:高速I/O设备进行数据传输的主要方式,广泛用于需要传输大量数据、且对传输效率要求较高的场景,如NVMe SSD通过PCIe总线直接访问内存,网卡通过DMA将网络数据报写入内存的接收缓冲区。显卡通过DMA在显存与主存之间传输纹理、模型和计算结果等,使用DMA的设备包括固态硬盘(SSD)、机械硬盘、网卡、显卡、USB控制器、声卡以及各种高速采集设备等
- 中断方式:通常和DMA搭配使用,如:DMA负责数据搬运,数据传输完成后由DMA控制器产生一次中断,最后由CPU响应中断并处理数据。此外,也有设备单独使用中断方式,如:用于键盘、鼠标、电源按钮、串口控制信号等产生的数据极少,没有必要专门启动DMA传输的场景
- 程序查询方式:常用于极低速或简单的嵌入式系统中,例如单片机读取按键状态、检测传感器数据、驱动简单LCD等场景,由于数据量很小且系统结构简单,使用DMA或中断反而会增加设计复杂度
I/O设备
中央处理器和主存构成了主机,除主机之外,用于输入、输出、存储和通信的设备统称为I/O设备,也称外部设备或外围设备,简称外设,I/O设备大致分为三类:
- 人机交互设备:用于用户与计算机之间的互相交流信息,包括键盘、鼠标、扫描仪、摄像机、语音识别器等输入设备,以及显示器、打印机、绘图仪、音响等输出设备
- 计算机信息的存储设备:大多为计算机系统的辅助存储器,如磁盘、光盘、磁带等
- 机-机通信设备:用来实现一台计算机与其他计算机或与其他系统之间完成通信任务的设备,如:调制解调器(Modem)、D/A、A/D转换设备等
输入设备
- 键盘:现代键盘使用编码键盘法来识别用户按下了哪个按键,其特点是采用硬件来确认按键,键盘内部自带专用微控制器,独立完成按键行列扫描、硬件消抖,并直接生成按键对应的扫描码或ASCII码,USB接口发送给主机,主机只需读取编码,无需参与扫描过程
- 鼠标:分为机械式和光电式,机械式鼠标通过底座金属球与电位器的接触,测量得出用户鼠标移动的相对位移量,光电式鼠标通过底座的光电转换器确定鼠标移动。
- 麦克风:将声音信号转换为电信号的输入设备。通过声波引起振膜振动,经换能器(如电容、动圈)转化为模拟电压,再经放大器处理或ADC转换为数字信号供计算机使用
- 触摸屏:是一种对物体的接触或靠近能产生反应的定位设备,按工作原理可分为电阻式、电容式、表面超声波式、扫描红外线式和压感式
- 其他输入设备:摄像机、图文扫描仪、画笔与图形板等设备
输出设备
- 显示器:用于将数字信号转换为人类可识别的视觉信息,分为CRT显示器(阴极射线管)、LCD显示器(液晶显示器)、LED显示器(背光源的LCD)、OLED显示器(每个像素自发光,无需背光)几种类型,其性能指标有分辨率、刷新率、色域/色深等
- 音响:将电信号还原为声音的输出设备。接收来自声卡的模拟音频信号,经功率放大器放大后驱动扬声器单元振动发声,可实现单声道、立体声或多声道环绕声效果
- 打印设备分为
- 点阵针式打印机:通过打印头中的多根钢针(如9针、24针)撞击色带,在纸张上形成点阵字符或图形。它支持单字打印,也能按单行顺序打印,打印速度通常用每秒字符数(cps)表示,一般介于50 – 200 cps(即每分钟约300 – 1200字)
- 激光打印机:通过激光扫描感光鼓形成静电潜像,吸附碳粉后转印到纸张上,再经高温定影。它不支持单字即时打印,而是整页输出(每次打印一页),因此无法单独打印一行或一个字。打印速度通常以每分钟页数(ppm)衡量,普通型号约20–60 ppm(等效约6000–18000字/分钟,按每页300字估算)
- 喷墨打印机:通过喷头将微小墨滴喷射到纸张上形成字符或图像。它支持单字和单行打印,但实际使用时多为逐行或整页打印。速度以每分钟页数(ppm)或字符数表示,普通家用型号约5–15 ppm(等效约1500–4500字/分钟),它也是是目前主流的彩色打印方式
I/O接口
I/O接口指主机与I/O设备之间设置的硬件电路及其相应的软件控制,是主机与I/O设备之间的桥梁
I/O接口的功能
其核心功能可概括为五点:
- 实现设备的选择:一台机器通常配有多台I/O设备,它们各自有其设备号(地址),通过接口可实现I/O设备的选择
- 实现数据缓冲与锁存:I/O设备与CPU速度相差很大,接口中通常设有数据缓冲寄存器(Data Buffer Register,DBR),可实现数据缓冲,同时能暂存数据,平衡速度差异
- 实现串/并行数据转换:完成串行(设备常用)与并行(主机常用)数据格式的相互转换
- 传递控制命令和状态信息:CPU通过接口向设备发出启动、停止等命令;设备则通过接口向CPU反映“忙”、“就绪”等状态,为程序查询提供依据。
- 实现电平与功率匹配:进行主机与设备间的电平转换,并为设备控制信号提供足够的驱动功率
接口的组成
接口通常包含以下部分:
- I/O总线:I/O设备通过I/O接口和I/O总线挂到系统总线上,I/O总线包括数据线、设备选择线(传输设备码)、命令线(传输CPU命令)、状态线(反馈设备状态)
- 数据缓冲寄存器(Data Buffer Register,DBR):缓冲I/O设备与CPU速度差异,暂存输入/输出的数据,还用于串/并行传输转换
- 状态寄存器(Status Register,SR):记录设备的当前状态(如忙/闲、就绪、出错),供CPU查询
- 控制寄存器(Control Register,CR):存放CPU发来的控制命令,决定设备的操作与工作方式
- 地址译码电路:识别设备选择线和总线上的地址,产生选中信号,激活本接口
- 中断控制逻辑:当设备准备就绪或发生异常时,向CPU发出中断请求
- DMA控制逻辑:用于高速成块数据传送,实现设备与主存直接交换数据,无需CPU干预
I/O接口类型
- 按数据传送方式,分为并行接口和串行接口
- 按功能选择灵活性分为可编程接口和不可编程接口
- 按通用性分为通用接口和专用接口
- 按数据传输控制分为程序型接口和DMA接口
程序查询方式
程序查询方式的核心在于CPU通过主动、反复地查询外设状态来控制数据传输,但也因此导致工作效率较低。在程序查询方式中,CPU需要执行三类关键指令来完成一次数据交换:
- 测试指令:用于查询外设是否已准备就绪
- 传送指令:当外设准备就绪后,用该指令进行实际的数据传送
- 转移指令:若外设未就绪,则用转移指令让程序转回去继续测试
程序查询流程
程序查询方式分为独占查询和定时查询两种,其核心流程如下:
- 准备工作:I/O通过程序查询方式与主存交换数据时,需要使用CPU寄存器,因此需要先把寄存器原内容保护起来,即保护CPU寄存器现场,并设置好传送的计数值和数据缓冲区首地址。
- 启动外设:CPU向指定的I/O设备发出启动命令。
- 循环查询:CPU不断读取设备状态标志,若未就绪则持续等待(踏步等待),直至设备准备就绪。
- 数据交换:从I/O接口的数据缓冲寄存器中读取一个数据,或将一个数据写入其中,并复位状态标志。
- 循环控制:修改主存地址和计数值,判断一批数据是否传送完毕。
- 未传完:则继续重启外设传送下一个数据。
- 传完:结束此次I/O传送,恢复现场,继续执行原程序。
程序查询方式的接口电路
程序查询方式的接口电路的基本组成包括:
- 设备选择电路:实现选址功能,通过地址线选中指定的外设
- 命令寄存器和译码器:实现传送命令功能,对CPU发出的命令进行译码,产生控制信号
- 数据缓冲寄存器:实现传送数据功能,作为暂存器,解决CPU与外设速度不匹配的问题
- 设备状态标记:通常用触发器实现,反映I/O设备工作状态
程序中断方式
中断的概念与产生
中断指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回到现行程序的间断处,继续执行原程序的行为
中断的产生可能是计算机出现了异常情况,或有特殊任务需要处理,需要打断程序运行。在I/O系统中,由于I/O设备工作速度通常较低,与CPU速度无法匹配,因此I/O系统工作中断方式下时,CPU不会做无谓等待,而是会等到I/O设备准备就绪后,才通过中断响应I/O设备进行处理,该方式也会产生中断。
计算机在处理中断的过程中,有可能出现新的中断请求,此时如果CPU暂停现行的中断服务程序,转去处理新的中断请求,这种现象称为中断嵌套或多重中断。倘若CPU在执行中断服务程序时,对新的中断请求不予理睬,这种中断称为单重中断。
程序中断方式的接口电路
程序中断方式下,可能会有多个中断源同时发出中断请求,I/O接口电路需要有一些特殊部件:
- 数据缓冲寄存器、设备选择电路等基础电路与程序查询方式一致
- 中断请求触发器(INTR):中断方式新引入的核心部件,用于向CPU发出中断请求。当设备已就绪(D=1)且未被屏蔽(MASK=0)时,INTR会在CPU发出中断查询信号后被置“1”,以此向CPU发出中断请求
- 中断屏蔽触发器(MASK):中断方式新引入的核心部件,当多个中断源同时发起中断请求时,应当只接收级别最高的中断源的请求,而由中断屏蔽触发器屏蔽低优先级设备的中断请求。当MASK=1时,会封锁该设备的中断请求。它通常用于实现中断的优先级管理,例如让高优先级中断打断低优先级的中断服务程序
- 排队器:当多个中断源同时向CPU提出请求时,CPU只能按中断源的不同性质对其排队,给予不同等级的优先权,并按优先等级的高低予以响应,设备优先权就是通过排队器实现,它既可以采用硬件方法,也可以采用软件方法
- 设备编码器:又称中断向量地址形成部件,它的输入是排队器的输出,即排队器产生当前需要响应的设备,然后由设备编码器为其生成一个独一无二的中断向量地址,这个地址通常指向该设备对应的中断服务程序的入口地址,从而正确开始执行服务程序。
中断服务程序的执行流程
中断服务程序是CPU响应中断后执行的特定程序,它需要在不破坏原程序运行环境的前提下完成数据交换,并正确返回,其流程分为以下步骤:
- 保护现场:分为两部分,其一是保护原程序断点,即将被中断的原程序下一条指令的地址压入堆栈或存入特定单元保存;其二是保护寄存器,将原程序寄存器(如通用寄存器、状态寄存器等)的内容保存到堆栈中
- 设备服务(数据交换):CPU会根据中断源的具体需求,执行数据交换,通常,这个步骤只完成一次数据传送,传送数据量大小取决于缓冲区。因此当需要传输很大的数据块时,需要外设每准备好一批数据,就发出一次中断请求,重复整个中断响应步骤
- 恢复现场:在数据传送完成后,返回原程序之前,需要用一系列出栈指令将之前保存在堆栈中的各寄存器内容弹回CPU的相应寄存器中,使其恢复原程序的运行状态
- 中断返回:中断服务程序的最后一条指令通常是一条中断返回指令,使其返回到原程序的断点处,以便继续执行原程序。
DMA方式
DMA方式的特点
DMA直接存储器访问(Direct Memory Access)方式是一种由硬件直接控制数据传送的I/O方式,该方式下,主存和DMA接口之间有一条数据通路,因此主存和I/O设备交换信息时,不通过CPU,CPU只负责启动和结束控制,不参与每个数据字节(或字)的传输过程,其特点为:
- 数据通路独立:主存与I/O设备间有直接数据通路,数据传输无需CPU寄存器参与
- 工作高效并行:CPU仅在传送开始和结束时参与,传送过程中CPU和I/O设备可以并行工作,处理CPU自己的任务
- 数据块为单位:它以“数据块”为单位进行信息交换,非常适合高速外设的大批量数据传输
- 硬件控制传送:主存地址的确定、传送计数等关键工作均由DMA控制器(硬件电路)完成
- 程序预处理:传送开始前和结束后分别需要CPU进行“预处理”和“后处理”,这两步是通过程序中断方式实现的
DMA对主存的访问
当DMA与CPU同时需要访问主存时,需要通过总线仲裁决定总线使用权。在多数系统中,DMA的优先级较高,因此总线占有权会优先交给DMA。CPU和DMA接口争用主存通常使用以下三种方法解决:
- 停止CPU访问主存:该方式下,DMA接口先向CPU发一个停止信号,要求CPU放弃地址线、数据线和有关控制线的使用权,并在数据传输结束后,把总线控制权交回给CPU。这种方式的优点是控制简单,适用于数据传输率很高的I/O设备快速传输数据,缺点是DMA接口在访问主存时,CPU完全无法访问主存
- 周期窃取(Cycle Stealing,又称周期挪用):该这种方式下,每当I/O设备发出DMA请求时,I/O设备便挪用或窃取总线占用权一个或几个主存周期,它会遇到三种情况:
- 第一种是CPU此时不需要访问主存(如CPU正在执行乘法指令,由于乘法指令执行时间较长,此时CPU不需要访问主存),故I/O设备与CPU不发生冲突
- 第二种情况是I/O设备请求 DMA传送时,CPU正在访问主存,此时必须待存取周期结束,CPU才能将总线占有权让出
- 第三种情况是I/O设备要求访问主存时,CPU也要求访问主存,这就出现了访问冲突。通常,I/O访存优先于CPU访问主存,因为I/O不立即访问主存就可能丢失数据,这时I/O要窃取一、二个存取周期,意味着CPU在执行访问主存指令过程中插人了DMA请求,并挪用了一、二个存取周期,使CPU延缓了一、二个存取周期再访问主存
与CPU暂停访存的方式相比,这种方式既实现了I/O传送,又较好地发挥了主存与CPU的效率,是一种广泛采用的方法。应该指出,I/O设备每挪用一个主存周期都要申请总线控制权、建立总线控制权和归还总线控制权。因此,尽管传送一个字对主存而言只占用一个主存周期,但对DMA接口而言,实质上要占2~5个主存周期(由逻辑线路的延迟特性而定)。因此周期挪用的方法比较适合于I/O设备的读/写周期大于主存周期的情况。
- DMA与CPU交替访问:这种方法适合于CPU的工作周期比主存存取周期长的情况,通常将一个CPU周期分成两个时间片,分别专供DMA控制器访问主存和CPU访问主存。这种方式不需要总线使用权的申请、建立和归还过程,总线控制权的转移几乎不消耗时间,DMA传送效率极高,CPU既不停止主程序的运行也不进入等待状态,但对CPU和DMA控制器的时序配合要求高,硬件实现较复杂
DMA接口电路
利用DMA方式传送数据时,数据的传输过程完全由DMA接口电路控制,故DMA接口又称为DMA控制器(DMAC,Direct Memory Access Controller),一个典型的DMA控制器主要包括以下几个逻辑部件:
- 主存地址寄存器(AR):存放要交换的数据在主存中的起始地址,每次传送后自动加1,直到一批数据传送完毕为止
- 字计数器(WC):记录传送数据的总字数,通常会以将要交换数据的字数的补码值作为预设值,每传送一个字,字计数器加1,当最高位产生进位时,计数器变为0,表示该批数据传送完毕,DMA接口向CPU发送中断请求信号
- 数据缓冲寄存器(BR):用于暂存每次传送的数据。通常DMA接口与主存之间采用字传送,而DMA与I/O设备之间可能是字节或位传送。因此 DMA接口中还可能包括有装配或拆卸字信息的硬件逻辑,如数据移位缓冲寄存器、字节计数器等
- DMA控制逻辑:管理DMA的传送过程,由控制电路、时序电路及命令状态控制寄存器等组成。每当设备准备好一个数据字(或一个字传送结束),就向DMA接口提出申请(DREQ),DMA控制逻辑便向CPU请求 DMA服务,发出总线使用权的请求信号(HRQ)。待收到CPU发出的响应信号HLDA后,DMA控制逻辑便开始负责管理 DMA传送的全过程,包括对主存地址寄存器和字计数器的修改、识别总线地址、指定传送类型(输入或输出)以及通知设备已经被授予一个DMA 周期(DACK)等
- 中断机构:当字计数器全0时,表示一批数据交换完毕,由“溢出信号”通过中断机构向CPU提出中断请求,请求 CPU作DMA操作的后处理。必须注意,这里的中断与5.5节介绍的L/O中断的技术相同,但中断的目的不同,前面是为了数据的输人或输出,而这里是为了报告一批数据传送结束。它们是I/0系统中不同的中断事件。
- 设备地址寄存器(DAR):存放I/O设备的设备码或表示设备信息存储区的寻址信息,如磁盘数据所在的区号盘面号和柱面号
DMA的工作流程
DMA的数据传送过程分为预处理、数据传送和后处理3个阶段:
- 预处理:DMA接口开始工作之前,由CPU完成以下预置工作:
- 给DMA控制逻辑指明数据传送方向是输入(写主存)还是输出(读主存)
- 向DMA设备地址寄存器送入设备号,并启动设备
- 向DMA主存地址寄存器送入传送数据块在主存中的首地址
- 将字计数器预置为需要传送的总字数
- 数据传送:以数据块为单位,由DMA控制器接管总线控制权来完成数据传送:
- 总线请求:当外设准备好数据后,通过DMA请求触发器向DMA控制器发出DMA请求(DREQ)
- 总线响应:DMA控制器收到请求后,向CPU发出总线请求信号(HRQ/HOLD)。CPU在当前总线周期结束后,会发出总线响应信号(HLDA),表示让出总线控制权
- 数据交换:DMA控制器获得总线控制权后,接管地址总线、数据总线和控制总线,在外设和主存之间建立直接通路,进行数据的高速传输
- 地址与计数修改:每传送一个数据,DMA控制器会自动修改主存地址计数器和传送长度计数器
- 重复传送:上述过程循环进行,直到传送长度计数器归零,表示整个数据块传送完毕
- 后处理:数据块传送完成后,由DMA控制器发起中断请求,CPU响应请求并停止原程序的执行,转去执行中断服务程序,做一些DMA的结束工作,包括:
- 校验送入主存的数据是否正确
- 测试在传送过程中是否发生错误,若出错,则转错误诊断及处理错误程序
- 决定是否继续使用DMA传送其他数据块,如果是,则重新进行DMA接口的初始化
DMA接口类型
现代集成电路制造技术已将DMA接口制成芯片,通常有选择型和多路型两类:
- 选择型DMA接口:其特点是在物理上可连接多个设备,在逻辑上只允许连接一个设备,即在某一段时间内,DMA接口只能为一个设备服务,适用于数据传输率很高的设备
- 多路型DMA接口:特点是不仅物理上可以连接多个设备,而且在逻辑上也允许多个设备同时工作,适合于同时为多个数据传输率不十分高的设备服务
DMA和程序中断对比
与程序中断方式相比,DMA方式有如下特点。
- 数据的传输:程序中断方式靠程序(中断服务程序)传送,DMA方式靠硬件传送
- 从CPU响应时间看,程序中断方式在CPU当前指令执行周期结束后响应,而DMA方式可在指令周期内的任一存取周期结束时响应
- 程序中断方式有处理异常事件的能力,DMA方式没有这种能力
- 程序中断方式需要中断现行程序,故需保护现场,DMA方式不中断现行程序,无须保护现场
- DMA的优先级比程序中断的优先级高
- DMA方式适用于大批数据的传送,如硬盘存取、网卡等;程序中断方式适用于低速外设(如键盘、鼠标)和需要快速响应的事件处理