记组笔记2

作者: Randy

——4.3.2 主存与CPU之间的联系

img

如图所示的链接关系

——4.3.3 主存中的地址分配

1比特(bit)存储一个基本的二进制位 0或1

8比特组成1字节(byte),主存中的地址按字节由高到低进行分配

而最小的寻址单元则是1字(word),根据环境的不同,1字长可能是4字节,也可能是8字节

以一个 int32 为例,它需要32位 4字节的空间进行存储,我们会将其保存在连续的4字节中

但有两种不同的存储方式

img

大端模式中,我们会按从高到低的顺序,存储int32的数据,并且此时以高位字节的地址,作为字地址

小段模式中,则按从低到高的顺序进行数据存储,并以低位字节地址作字地址

两种方式本质上并没有太大区别,但分别使用两种存储方式的设备在进行相互通信时,接收方就需要对接收数据的字节顺序进行调整

img

若地址线为24根线,那么其所能表示的不同字节的地址,就可映射为24位二进制的所有状态

如果进行按字节寻址,能访问到的数据范围就是 2^16 byte = 16MB

若此时1字长为16位 2字节,进行按字寻址时,就需要有1位二进制来表示字内的字节序,另外23位来表示字地址,从而访问到的数据范围是 2^23 word = 8MW = 8*2MB = 16 MB

同样如果1字长为32位 4字节,需要两位二进制表示字节序,另外22位表示字地址,数据范围是2^22 word = 4MW = 4*4MB = 16MB

——4.3.4 存储器的技术指标

存储容量:能够保存的二进制(bit)/字节(byte)量

存储速度:分为存取时间和存取周期,

存取时间是指从CPU给出地址信号,到获得稳定的数据输出(读出时间),或CPU给出地址信号,到存储器反馈写入完成(写入时间

存取周期是两次独立的读/写操作,从第一次开始到第二次开始,之间的最小时间间隔,也分为读周期/写周期

带宽:单位时间内能够读/写的数据量,bit/s,byte/s

—4.4 半导体存储芯片

——4.4.1 半导体存储芯片的基本结构

主存储体由多个存储芯片构成,每个存储芯片在设计上能够独立完成数据的保存和输出,并通过逻辑电路链接,构成整个存储体的存储空间

img内存条上这些黑色的方块就是存储芯片

存储芯片内部组成如图

存储矩阵完成数据的保存,

读写电路连接数据线和读写控制线可将数据线上的数据写入到存储矩阵的指定位置,或从指定位置读出数据输出到数据线

译码驱动电路连接地址线,负责解译地址信号,定位存储矩阵的对应位置,译码主要有线选法和重合法两种方式

片选线信号负则定位需要工作的存储芯片,可以让多个芯片同时工作

img

地址线宽,数据线宽,和芯片容量关系如下

img

读写控制线可以由一线 WE 控制,低电平写入,高电平读出;也可以由 OE和WE 两线控制,OE低电平读出,WE低电平写入

片选线信号有 芯片选择 CS(chip select)和 芯片启动/芯片使能 CE(chip enable)两种

片选线会根据存储芯片构成存储体的分组结构进行布置

以用16K1位存储芯片,构成64K8位存储体为例,布置方式如下图

img

首先为了满足8位的字节长度我们需要将8个存储芯片划分位一组,1byte(8bit)的数据中的每1bit会分别保存在8个存储芯片相同地址处

每1组存储芯片保存16K*8位容量的数据,那么我们就需要4组芯片

相应的64K个地址就会被划分到这4组芯片中,0到16K-1在第一组,16K到32K-1在第二组依次类推

以读取1byte数据为例,当CPU传入64K范围内的地址值给存储器时,经过译码,对应芯片组上的片选信号会统一置为低电平,从而让这一组存储芯片同时开始读出工作,从地址总线上获取地址信号,再经过芯片内部译码器进行译码,从而找到CPU地址对应存储矩阵的地址,进而得到对应的1bit数据,最后8个芯片会将每bit数据依次输出到数据总线对应的线路上,从而读出1byte数据

——4.4.2 半导体存储芯片的译码驱动方式

译码驱动方式为解决在CPU给出地址信号时,存储体如何找到对应的一组存储芯片的问题

译码驱动方式主要有线选法重合法

线选法是一种简单的逻辑,地址译码器连接地址总线,同时对连接n组存储芯片对应的n条片选总线

其逻辑就是一个对地址值范围按芯片组容量范围取模的操作,从而将n条片选线中对应的一条置于低电平

img

线选法实现简单,但对于某些大容量存储芯片来说,地址译码器连接的片选线可能过多,例如有1M组芯片时,就需要连出1M条片选线,导致芯片集成度无法做高

为此可以采用重合法,重合法会将芯片组构建一个二维矩阵,对地址信号分别译码出行列地址,并将对应行和对应列上的片选总线置为低电平(类似磁芯存储器)

其交叉位置就是被选中的芯片组,同时获得行列片选低电平,其输出数据能够进入数据总线中

但其它行/列上的芯片也会进行数据的读出,但数据不会传入数据总线

![img](data:image/svg+xml;utf8,)

相比线选法,重合法采用二维行列地址的方式进行译码定位,在大容量时线路较线选法明显减少,1M芯片组时,重合法译码器只需延伸行1K,列1K总共2K线

—4.5 随机存储器(RAM)

——4.5.1 静态RAM(SRAM)

如图电路,由T1-T4双稳态触发器完成0/1的存储

T5-T6行开关选定需要工作的触发器

T7-T8列开关决定选定行上那个触发器的数据能够被读出,或是需要被写入数据

由于存储元件时双稳态触发器,因而写入时需要在原/非两端同时进行

img

img读操作

img写操作,左侧对信号取反输出,原端非端同时传入信号完成写入

——4.5.1.1 Inter2114芯片

Inter2114芯片是一个静态RAM芯片其外特性如图

img

A0-A9 10路地址线,说明其地址范围为1K

I/O 线4路,说明每地址处数据为4位

因而该芯片容量为 1K*4bit=4096bit

其芯片内部的单个存储元件能够保存1bit(0/1)的数据,构成一个64bit*64bit=4096 容量的存储矩阵

为了实现1K4bit 地址输出位的效果,芯片内部的地址译码也采用了和存储器重合法相同的行列布置思路

读操作为例,电路如下图

![img](data:image/svg+xml;utf8,)

行方向上分配 0-63 共64个行地址码,对应存储矩阵的64行(于重合法相同)

但在列方向上分配0-15 共16个列地址码,每16个单列为一组,将列方向64单列分为4组,列地址码对应4组中相应的0-15列

从而行列方向地址码范围 6416 = 1K ,行码选中1单行存储元件,而列码选中4组中的4列存储元件,从而最终输出14=4bit信息

以0000地址信号为例,行译码结果为0,第0行被选中,列译码结果为0,从而4组中对应的0列:0/16/32/48 4列被同时选中,则行列同时被选中的存储元件就是4个,输出4bit信息

写入操作类似,通过行列选择,I/O输入数据并同时写入到A端A’端

——4.5.2 动态RAM(DRAM)

动态RAM使用电容的充放来保存1和0

如图三管动态RAM电路图

img

单管动态RAM电路图

img

读取时预充信号令T4导通,VDD电压为读数据线充电,读选择信号令T2导通,此时若电容已充电(保存数据1),T1不导通,则读数据线保持高电平(读到数据0),若为充电,T1导通,读数据线放电转为低电平(读到数据0),我们还需取反才能读到正确信息,读出信息与原存信息相反

而写入时,写入数据线高电平,T3导通,电容充电(写入1),写入数据线低电平,T3不导通,电容放电(写入0),写入信息与输入相同

———4.5.2.1 Inter 1103芯片

Inter1103 是使用三管控制电容的动态RAM芯片

译码驱动采用简单的重合法,3232简单二维存储矩阵,规格1K1bit

但特别的是行地址译码时还需要读写控制信号参与,行地址译码器对每行片选线分别布置了读/写两条线路(选行同时确定读写操作)

读操作如图

img

此外由于电路中电容会漏电,导致数据丢失,因而每隔一段时间,都需要使用刷新放大器对电容中的信息进行刷新重现

———4.5.2.2 Inter 4116芯片

Inter4116 是使用单管控制电容的动态RAM芯片

译码驱动采用重合法,简单128128二维存储矩阵,规格16K1bit

外特性如图

![img](data:image/svg+xml;utf8,)

内部存储阵列控制如图

![img](data:image/svg+xml;utf8,)

Inter4116 16K地址规格需要使用14位地址信号,但其地址信号线只有7条,需要分两次分别传输行/列地址(7位)

此外芯片还有一个时序控制器用于产生时钟信号控制内部读写操作

每列上在63和64列之间都有一个读放大器跷板电路,信号输出同非门,但能够对电路信号进行强化,避免因传输过远导致衰弱

写入时0到63列写入信息与写入数据相反,读出时再次反转为正确

———4.5.2.3 动态RAM刷新

受电容漏电影响,每个一段时间我们需要对电容中的信息进行刷新再生

存储矩阵中每列都有一个刷新放大器,刷新操作通过行选读出时启用刷新放大器来完成,每次刷新一单行的所有电容,从而刷新单行的时间和存取周期时间相同

集中刷新模式下,每隔固定时间会逐行刷新全部电容

刷新周期是两次刷新完成的时间间隔

以128*128存储矩阵,存取周期 [公式] ,刷新时间 2ms ,集中刷新为例

img

[公式]

刷新128行相当于进行128次读取操作,需要 [公式]

则剩余的 [公式] 这段时间可以用于与CPU之间进行数据的读写

刷新消耗掉的时间中,存储体无法进行对外信息交换,称之为死区

死区时间占比为 128/4000=3.2% 称之为死时间率

在死区时间提交的I/O请求必须等待刷新完成

分散刷新模式下,每进行一次读/写后,就按需刷新一行电容

从而原 [公式] 读写周期,变为 [公式]

img

以128*128存储矩阵为例,经过128次读写后,全部电容都被刷新了一次

分散刷新模式的特点是通过过渡的刷新,避免死区的出现,但也延长了存取周期

异步刷新是集中刷新和分散刷新的结合

![img](data:image/svg+xml;utf8,)

还是以128*128存储矩阵, [公式] 存取周期,为例

我们要求每隔2ms都会对整个矩阵完成一次刷新(刷新周期)

但并不是集中在一起完成,而将128行逐行刷新平分到2ms中,从而每 [公式] 我们需要刷新一行

如果安排得当,我们可以在 [公式] 中找到 [公式]窗口时间,恰好CPU不访问该存储器(例如指令译码时),从而死区不会暴露,不影响CPU和存储器的信息交换

否则就需要强制在 [公式] 的最后 [公式] 进行一行刷新,死区暴露,如果CPU此时有I/O请求就必须等待刷新完成

——4.5.3 比较动态RAM和静态RAM

img

动态RAM可以分别传输行/列地址,地址线条数可以减为一半,从而减少DRAM的芯片引脚数,提高封装程度,提高集成度,扩大容量

静态RAM通常需要发挥其高速的优势,因而一般不会分别传输行/列地址,封装度/集成度较低,容量不足

虽然我们经常需要刷新动态RAM,但静态RAM工作时,实际有三管需要一直保持导通,因而一直处于漏电状态,导致静态RAM功耗高于动态RAM

SRAM造价较高容量低,无法大规模使用,通常用于做缓存(Cashe),发挥其高速优势

DRAM,造价低,容量大,通常用于计算机主存,内存条就是DRAM

—4.6 只读存储器(ROM)

只读存储器中通常保存系统配置,系统文件一类需要长期断电保存,不经常修改的数据

早期的只读存储器在厂家生产时,直接写入数据,用户只能进行读出无法修改

后经不断发展,如今硬盘,U盘这些只读存储器在使用中能够进行反复电擦写

掩膜ROM

最早出现的掩膜ROM就是标准的

由厂家在生产时写入数据,用户只能进行读出,无法修改数据的只读存储器

掩膜ROM内部使用重合法构建二维存储矩阵的方式来存放数据,0/1由交叉点上MOS管的有无来确定,交叉点上有MOS管表示1,无MOS管表示0

自然行列MOS的有无,是由厂家生成芯片时确定的(硬件编码),用户无法做出更改

PROM

img

在掩膜ROM的基础上,PROM通过设置熔丝,将数据写入的权力交给了用户

用户可进行一次性破环性的数据写入,0/1通过熔丝的熔断情况体现

熔丝熔断表示0,熔丝保留表示1

EPROM

img

EPROM实现了多次可编程,通过D端的通联,形式浮动删来存储数据

如果需要再次编程,可通过紫外线驱散浮动删,擦除原有数据,重新写入即可

但EPROM的擦除需要独立的紫外线放射设备来完成

EEPROM

EEPROM实现了电可擦写(不需要特殊设备),能进行局部/全局的擦写操作

用户将EEPROM接入计算机中,可以读出数据,也可以直接由软件控制完成擦除并重新写入数据

闪存FlashMemory

高速电可擦写ROM存储器,已具备RAM的一些功能

我们使用的U盘就是闪存,可作为计算机的扩展存储器进行高速的数据读写

一些计算机直接使用闪存作为主存,就是使用固态硬盘

此外闪存还可以作为高速缓存(Cashe)

—4.7 存储器与CPU的连接

CPU需要从存储器读取指令和数据,进行运算,并将运算结果保存在存储器中

因而我们需要将存储器和CPU进行正确的连接

——4.7.1 存储器容量扩展

首先我们需要解决的问题就是存储器容量的扩展问题

相比CPU的地址线宽,数据线宽,无法直接使用单块存储芯片来满足

因此我们需要将多个存储芯片连接,扩展地址范围满足CPU地址线宽要求,扩展存储字长适应CPU数据线宽要求,从而构成一个存储(整)体

———4.7.1.1 位扩展(增加存储字长)

位扩展的方法是将已满足地址宽度要求的存储芯片(存储整体),统一接入地址总线,并根据芯片存储字长分配独立的数据线路即可

我们无需在意芯片连接地址总线/数据总线的顺序性,只需将所有芯片接入统一的片选信号线,从而同时进行存取工作

读写时,会根据数据线宽分配,在不同存储芯片同一地址位置处读出/写入数据

以1K4bit存储芯片组成1K8bit存储器为例,思路可表示为 1K8bit=1K(4bit+4bit)

img

———4.7.1.2 字扩展(增加存储地址范围)

字扩展的方法是将已满足存储字长的存储芯片(存储整体),统一接入数据总线,将一定数量的地址线路作为片选信号,从而划分地址总宽到每块存储芯片中

以1K8bit存储芯片组成2K8bit存储器为例,我们需要使用1条地址线的0/1作为片选信号,选中对应的芯片,并将芯片地址线统一接入剩余的地址线即可

思路可表示为 2K8bit=21K*8bit

img

———4.7.1.3 字、位扩展

更普遍的状况中,我们需要同时进行字、位扩展

思路是先进行位扩展,将存储芯片n个一组,满足数据宽度

之后进行字扩展,选取一定数量的地址线,作为选择线,划分地址宽度,根据二进制状态映射为片选信号,选中相应的芯片组

如图以8片 1K4bit存储芯片 组成 4K8bit存储器为例

img

8片存储芯片两个一组,共四组,每组内分配数据线路,实现位扩展

再由两条地址线作为片选信号线,四种二进制状态 00 01 10 11 译码映射为片选信号,选中4组芯片中的1组工作,从而将地址总宽,划分到4组中

思路可表示为 4K 8bit = 4 1K * (4bit+4bit)

——4.7.2 存储器与CPU的连接

在真正进行存储器与CPU连接时,情况往往比较复杂

除了上面提到的进行字扩展和位扩展,满足CPU给出的地址线宽度和数据线宽度外,我们还需解决以下问题:

1.读/写控制线的连接,注意RAM可读可写,而ROM只可读不可写

2.RAM与ROM的合理选择与混连,我们需要根据CPU地址范围及存储需求合理选择RAM/ROM芯片,通常保存系统程序,配置信息的地址范围使用ROM,用户程序范围使用RAM,不同芯片参数的选择,应让芯片数量尽可能的少,减少连接线路,使片选逻辑尽可能简单,且实际情况往往都需要我们混连RAM与ROM

3.片选线的连接,通常低位送入存储芯片作为寻址信号,高位参与片选信号的译码,我们要在RAM/ROM混连情况下合理分析高位地址信号的情况,选用相应的解码器,或是自行设计电路,完成片选信号的译码和连接

4.MREQ信号参与片选,MREQ是访存控制信号,低电平表示CPU要访问存储器,给出了存储器对应的地址,高电平表示CPU要访问I/O端口,给出的地址是I/O端口地址,因此我们需要MREQ信号参与片选信号的译码

5.存储芯片与CPU之间的时序,负载关系,芯片与CPU时序要能相互配合,且芯片数量不超过CPU的最大负载

例1:

CPU地址线宽16路,地址空间2K,数据线宽8路 (2K*8bit)

其中6000H到67FFH地址范围为系统程序区,6800到6BFH为用户程序区

我们写出对应的二进制地址码(从高位到低位),分析范围,选用芯片

img

将低位对应的地址线接入芯片作为寻址信号,分析高位地址信号,选用译码器或设计电路,产生片选信号

这里选用138译码器,输入信号需要CBA三路,如图可选用A13-A11作为输入信号,查表得到对应Y4和Y5端输出可作为片选信号

img

最终线路如图

img

138译码器启用信号G1端为高电平,可接A14信号线,G2A与G2B为低电平,可接A15与MREQ信号(注意保证MREQ访存信号参与译码)

此外对于RAM空间,除了A13-A11满足101外还需A10信号为低电平,因此对138译码器Y5输出端与A10信号连接与非门,将输出信号作为最终片选信号

数据线ROM恰好满足宽度,连接线路只单向传输到数据线(只读),两片RAM需要位扩展满足宽度,因而需要对数据线进行独立分配,连接线路双向传输数据(可读可写)

WR读写控制信号只与RAM相连,ROM只读不写,因而编程端 PD/Program 接地

例2:

CPU地址线宽16路,地址空间2K,数据线宽8路 (2K*8bit)

要求最小地址4K位系统程序区,相邻8K为用户程序区

写出地址二进制码,分析范围,选用芯片

img

这里由于接邻最小4K的前4K地址与后4K高位不同,选用了两片4K*8bit RAM芯片,并进行字扩展

分析高位地址信号,确定片段信号

![img](data:image/svg+xml;utf8,)

最终接线如图

![img](data:image/svg+xml;utf8,)

G1高电平直接电源,G2A G2B低电平接A15和MREQ

查表可得Y0 Y1 Y2端输出满足要求

—4.8 存储器的校验

事实上在现代计算机复杂的电路中,不论是RAM还是ROM,经常受到内部电路的信号干扰,或是外部的各种因素影响,导致触发器翻转,电容异常的充放电,导致存储信息发生一定的改变

因此我们需要对存储器中的信息,进行一定的校验,以防止读出数据错误,程序指令错误,保证计算机能够正常的运行

存储器校验在现代计算机中应用广泛,不止一些安全系统,面向个人的微型计算机也采用了校验技术

接收方会通过一定的机制,对收到的数据进行检错/纠错,以保证数据的准确

——4.8.1 合法代码集合

要想知道读出数据是否正确,我们就需要规定一定的合法代码集合,以便在存储数据发生改变时知道数据出错(检错),并进行矫正(纠错)

在存储信息出错的情况中,1位信息出错占90%以上

如图给出4组合法代码集合,及它们各自的检错纠错能力

img

我们不难发现,合法代码集合的检错/纠错能力,与任意两和法代码之间的二进制最小差异位数有关,最小差异位数越多,检错/纠错能力越强

第一组最小差异为1位,不具有检错/纠错能力

第二组为3位,第三组位4位,第4组为5位,它们的检错/纠错能力依次增强

合法代码集合的二进制最小差异位数,又称之为编码的最小距离,应用合法代码集合进行检错/和纠错,在指令编码时就需要满足这一最小距离来编写(最短代码不能短于最小距离,其它代码时最小距离的整数倍)

编码最小距离与检错纠错能力有如下关系

img通常检错位数大于等于纠错位数

——4.8.2 奇偶检验与分组

奇偶检验是另一种检错/纠错方法

奇偶校验就是加入一个校验位,使原代码一定范围内的1/0个数加校验位1/0,满足奇数或是偶数(通常采取偶校验)

例如8bit代码+1bit校验位,要求1个数为偶

![img](data:image/svg+xml;utf8,)

奇偶校验通常结合分组使用,简单的分组方法就是继续细分代码段,每段都加入一个校验位从而进行更细致的检错/纠错

![img](data:image/svg+xml;utf8,)

简单分组中,各分组间代码段不重叠,而更加复杂的非划分,重叠分组法中,会利用重叠分组,在检错的同时准确定位出错的位置

如图汉明码的非划分分组

img

P1组包括 1357

P2组包括 2367

P3组包括 4567

我们在2^i位置放校验码(独立位放校验码),将1-7共8bit数据按如图的重叠方式划分为3组,从而在检错的同时,根据重叠关系定位出错位置

校验是若满足奇偶约定,则输出0,不满足输出1,依次排列P3P2P1的检测位,若结果为000则没有差错,否则这三个检测位组成的二进制位数就是出错的位置

——4.8.3 汉明码的编码规则

汉明码就是一种特殊的编码规则,依托于这种编码规则我们可以在奇偶校验的同时,定位出错的位置

许多其它类型的检测/纠错方法,都是在奇偶校验的基础上,制定了不同的编码规则

汉明码编码规则是根据位数的二进制表示中,第n位上是否为,来决定这位数是否要进入第n组,一位数据可以被同时划分进多组中

对于 00001 00010 这样的只有一位是1每组独有的位置,就成为检测位

任意两组,三组,n组都有唯一一个共有的位置

img

以n表示汉明码的数据位,k表示检测位,则汉明码的编码规则可用公式表示为

[公式]

k位检测为,则有k组,相应的2^k种检测情况,要能映射指出n+k位数据在单位出错时的出错位置,再加一个无差错的情况

例1:

数据0101按偶校验配置汉明码

n=4 公式可得k最小为3,分三组,三个校验位

共3+4=7位传输数据,校验位为 1 2 4 值待定

数据位 3 5 6 7 对应数据 0101

P1组:1 3(0) 5(1) 7(1) 因此1配0

P2组:2 3(0) 6(1) 7(0) 因此2配1

P3组:4 5(1) 6(0) 7(1) 因此4配0

最终数据为:0100101

例2:

接收汉明码为 01001111 偶原则配置,求传送信息

共接收8位数据,公式可得此时为3组,对每组包含的数据进行异或操作

[公式]

此时1组无措,2 3组有错,23组共有位置为6,因而第6位数据取反(纠错时只纠1位错)

或按P3P2P1排列校验码二进制110即为第6位

数据位3 5 6 7第6位取反,传递信息为0101

如果检错发现错误位是检验位,无需不纠错,直接提取数据位即可

—4.9 主存结构调整

前面提到过,CPU的发展遵从摩尔定律,且明显比存储器发展速度块

因而CPU与同期存储器之间的速度存在很大的差异,为了提高计算机系统整体的运行速度,我们必须对访存速度进行提升

自然最直接的方法是,精进存储器的设计和制作工艺,制造出更高速的存储器件

此外可以采用层次化的存储结构,设置Cache高速缓存来作为CPU和主存之间的中介

而本节中将介绍另一种提高访存速度的方法—调整主存结构

—4.9.1 单体多字系统

假设CPU的数据线宽为16位,正常情况下针对每个地址应访问到16bit数据

单体多字系统是将主存中对每地址16bit的数据进行扩展,例如可扩展为64位(1字扩展为4字)

CPU每次读取时,会将4字数据一次性读入到寄存器中,再从寄存器中获取每字的指令/数据进行处理

从而通过扩大单次读取周期内获得的数据量,来提升访存速度

img

但这种主存结构也存在一定的问题

1.CPU在写入数据时,由于CPU数据字长小于存储字长,需要特殊的硬件逻辑来处理这种差异

2.程序运行时读取的指令/数据,并不完全是连续的存放在内存中,例如跳转指令,跳转执行范围大于4字的扩展范围时,就无法起到加速的效果,反而多读了无效的指令/数据

—4.9.2 多体并行系统

之前讲到的多个 存储芯片/存储体 通过字扩展构成一整个存储体时,利用高位地址划分存储空间所用到的方法,就是高位交叉顺序编址的方法

img

高位交叉顺序编址的方法,实现简单,适合存储体的容量扩展,但并不利于提高CPU访存速,多个存储体都是独立接入总线与CPU相连接的,因而本身具有并行访存的潜力

但由于使用了高位交叉顺序编址,在程序运行时的指令/数据大都是顺序存放在某一个存储芯片/存储体中,导致CPU经常只单独访问某个存储芯片/存储体,并没有将并行的潜力发挥出来

对此的改进方法是采取低位交叉各体轮流编址,以低位作为体号(片选信号),从而在地址上顺序存放的程序指令/数据,实际被交叉存放在了不同的存储芯片/存储体中

img

再结合之前提到的分离式通信的方法,可以在不改变存取周期的前提下,增加存储器的带宽

img在单体访存周期内CPU可连续对4个存储体发起访问请求

四体低位交叉存储器,为实现存取周期T,总线传输周期t下的流水式存取,应满足T=4t

img如图存取周期为T总线周期为t下的流水式访问

T+(4-1)t

连续读取4个字所需时间为T+(4-1)t

—4.10 高性能存储芯片

如图三种高性能存储芯片

img

类型3中DRAM芯片内集成了一个由SRAM组成的Cache高速缓存,其容量与芯片行容量相同

CPU初次读取时,会在读取行列对应位置数据的同时,将这一行的数据加载到Cache中

由于程序指令/数据大都是顺序存储的,因而下一次读取大概率是读取与上一次同行不同列的数据

在下一次读取时若发现行地址与Cache加载的行数据地址相同即为“缓存命中”,可直接以列地址信号读出Cache中对应的数据

从而可以进行猝发式读取(第一次较慢之后若缓存命中可高速读取)

—4.11 高速缓冲存储器(Cache)

前面已经或多或少的提到了一些有关Cache的概念,Cache作为提高访存速度的一大手段,其应用对现代计算机速度的提升有很大的帮助

由于同期CPU与存储器之间存在较大的速度差异,为提高访存速度,我们可以在CPU和存储器之间架设一块容量小,但速度快的缓存,用于中介速度差异

![img](data:image/svg+xml;utf8,)

——4.11.1 Cache工作原理

Cache的工作原理主要基于程序访问的局部性原理

程序访问的局部性原理,分为时间局部性空间局部性

时间局部性:当前使用到的指令/数据,在未来有很大的概率会被再次使用

空间局部性:当前使用到的指令/数据,在未来有很大概率使用与之相邻的指令/数据

从而我们可以将当前使用到的指令/数据,以及与之相邻的指令/数据,这一定范围内的主存数据,读取到Cache中,期待CPU在未来正好使用到这些数据

按照,将一定范围内数据预读到高速缓存,这一目的,我们将主存和Cache按照空间分块的思路进行布置

img

如图我们将主存的整个存储空间分为M块,每块内包含B个字,Cache的存储空间有C块,每块内也有B个字

M>>C,但M与C的最小单位即1块的容量大小是完全相同的,1块内B个字的空间划分也是完全相同的

在发生初次读取后,我们就可以将读取位置附近D块容量范围(D<C)的数据整体传送到Cache中

Cache内地址对程序员来说是完全透明的

从外特性来看,因为块内的空间划分也是相同的,我们不需要生成Cache内地址再映射主存地址,而是在预读后,直接标记Cache中的地址为主存中对应的地址

CPU下一次访问给出地址,解码主存内块偏移地址后,可直接询问与Cache标记地址是否相同,若相同则命中缓存,直接从Cache中获取数据即可

——4.11.2 命中与未命中

主存M块与缓存C块在初次访问后,一定范围内包括初次访问位置和与之临近位置的数据,就被读入到了Cache中

主存块与缓存块的一部分建立了对应关系(部分主存块调入缓存),并用Cache中的标记记录对应的主存块偏移地址

如果下一次CPU恰好访问了对应Cache中预读的数据,即为缓存命中,可直接从缓存中获取数据,速度比直接从主存中读取更快

但如果下一次CPU访问了的数据并不在Cache中,则缓存未命中,CPU仍需要低速的从主存中读取出数据,并且Cache中的数据会替换为与本次访问临近位置的数据

Cache的效能可以通过缓存命中率来描述,相同条件下命中率越高,对访存速度的提升越大

对于如何提高缓存命中率就已经超出了计组的范围,涉及到计算机体系/系统结构的内容

这里简单提一下两个相关因素:容量块长

这里容量是指Cache容量与主存容量的比例,比值越大,Cache容量越接近主存容量,预读数据多,范围广,自然命中率越大

块长则是主存与Cache在空间分块时的单块长度配置,块长需要做到合适

这里要强调的一点是,进行缓存调入(预读)时,并不是调入未命中读取位置与缓存块数量C相同的C’数量,而是取D数量块(D<C),从而缓存中可以保存多个(D/C个)位置的邻近块数据

过长的块长导致缓存内块数量少,保存的位置少,调入时在一个位置读取过多的数据,CPU不一定都会用到反而产生浪费,过短的块长CPU仅几次访问后就超出了缓存范围需要重调缓存

一般块长一个存取周期内能从主存调出的信息长度,主存的多体交叉布置有关

img

如图,CRAY_1主存16体低位交叉,每个存储体中保存1字数据,一个存取周期内能从主存中调出1存储体的1字长数据,从而缓存就恰是16字长,将16个低位交叉存储体中对应的1字都读入缓存中

——4.11.3 Cache 主存系统的效率

访问效率e,是在Cache的影响下,CPU对主存进行访问的效能描述

效率e与命中率有关,它是访问Cache(缓存命中时)的访问时间,与平均访问时间的百分比

[公式]

设Cache命中率为h,访问Cache时间为tc,访问主存时间为tm,则效率e的计算公式为

[公式]

上述计算公式适用于访问Cache与并行访问的情况,效率e的范围是 [1,tc/tm]

若命中率h为0,完全不命中仍可从主存中直接读取数据,访问效率取min值tc/tm

若命中率为1,绝对命中,访问效率取最大值100%,完全由Cache接管访存

但如果顺序访存,先访问Cache,不命中再访问主存,效率e的计算公式就变为:

[公式]

e的范围变为 [1,tc/(tc+tm)]

——4.11.4 CPU-Cache-主存 系统结构

img

CPU与主存接入地址总线来传输访问地址

主存,Cache,CPU接入数据总线进行数据交换

Cache-主存之间有片内直连通路,进行缓存的调入(读取)

映射机制需要解决的是块地址与主存和Cache中存储位置的对应关系

此外主存块调入缓存时,也需要映射机制来进行位置的查找和分配,决定主存块能够被缓入那些Cache块中

Cache容量为C块,每次进行缓存调入时,会调入D块(D<C)主存数据,从而Cache中能保存多个(D/C个)位置的临近数据

若发生缓存未命中,则会根据映射机制,询问Cache中是否还有访问位置对应主存块能够缓入的块空间

不发生冲突,直接调入缓存,

若发生冲突则会采用一定的牺牲机制(替换机制),牺牲最不值得继续保存的一个位置,替换调入未命中位置的块数据

——4.11.5 对Cache的读写操作

读操作

在Cache的作用下,CPU访问主存时可检测Cache中是否已加载对应的数据,在缓存命中时直接从Cache中获取数据

缓存未命中时,CPU从主存获取数据并将获取位置附近的数据调入缓存

![img](data:image/svg+xml;utf8,)

写操作

对Cache的写操作发生在缓存调入后,CPU要对缓存位置的数据进行写入修改时,保证Cache和主存在外访问下写入数据的有效性

写操作有两种模式,写直达法/写通过写回法

写直达法是在CPU对缓存位置进行写入时,先将数据写入主存,之后主存将数据写入Cache,写操作的时间就是访问主存的时间

这种方法保证了Cache和主存数据始终一致,但当CPU对某个缓存位置频繁写入时,会造成Cache和主存的频繁数据交换

写回法是CPU对缓存位置进行写入时,只写入Cache中,当Cache块判定牺牲,退出时,再将数据写回到主存,写操作的时间就是访问Cache的时间

这种方法允许Cache和主存数据的不一致,避免了Cache和主存频繁的数据交换,但在多处理器,多核心的情况下,每个处理器/核心都有自己私有的Cache时,无法保证各个Cache副本数据的一致性,需要特殊的处理(并行体系结构计算机)

——4.11.6 Cache的改进

Cache也可以像计算机存储体系一样,通过增加级数构建层次结构

可分为片内(片载)Cache,片外Cache

单片内(片载)Cache可设置多级,目前许多处理器都至少拥有三级片载Cache

每个处理核心可以拥有自己的私有Cache,以及多核共用的Cache

片外可以设置大容量的Cache

通常Cache采用冯·诺伊曼结构的统一缓存,指令和数据统一存入一个缓存中

一种改进的思路是采用分立缓存,将指令和数据分别存入专用的Cache中,从而避免在流水的过程中造成资源冲突

![img](data:image/svg+xml;utf8,)两种分立缓存芯片的例子

——4.11.7 Cache-主存的映射方法

主存块在缓入Cache时,要根据一定的映射方法,有序的缓入一定范围内的Cache块中,映射方法决定了主存的任意一块能够被缓入到Cache的哪些块中

从而在CPU访存时,根据映射方法快速查询是否命中缓存

直接映射

直接映射方式的思想是一个主存块只对应唯一一个Cache块

直接映射是将M个主存块分为若干区,每区包含C块等同于Cache块数量

每区内第n个主存块,只能被存入Cache的第n块中(区内块号对应Cache块编号

并在存入将区号记录到标记

从而地址被解码为三部分:区号,区内块号,块内字地址

在CPU访存时,会根据区内块号,查找相应Cache块中所标记的区号与地址解码区号是否相同,从而只对1个特性位置的Cache块进行1次标记与区号的判定,就能获知是否命中缓存

![img](data:image/svg+xml;utf8,)

直接映射方式非常简单,容易实现,查找速度快,但缓存命中率不高,Cache调入时冲突概率高,Cache空间的应用效率不高

极端情况Cache中只调入了少量的块数据,存在大量空余位置,但每次调入时仍发生冲突替换

全相联映射

全相联映射的思想是一个主存块可以放在Cache中的任何一个块位置

从而只要Cache中还有空余位置,调入时就不会产生冲突

地址被解码为两部分:块号,块内字地址

CPU访存时,需要遍历Cache的所有块,轮询标记的块号与地址解码块号是否相同

未命中时进行替换,又需要遍历所有块,查找空余位置,或进行牺牲判断

img

全相联映射结合合理的牺牲机制,最大限度的利用了Cache的空间,避免了冲突的产生,有效提高了缓存的命中率

但由于需要进行复杂的遍历轮询,逻辑电路复杂,实现困难,访问Cache速度较慢

未对主存块进行分组,因而标记和比较器需要有足够长的位数

组相联映射

组相联映射是直接映射和全相联映射的结合,一个主存块可以放在一组缓存块中的任意一个位置

组相联映射首先对Cache进行分组,每组可包含2块,4块,8块不等(设有Q组)

根据Cache的分组数量,对主存进行分区,每区包含的块数量等同于Cache的组数(每区包含Q块)

在映射时,根据某一主存块在分区内的编号,可映射到相应的组内任何一块

可理解为相对于整个主存储器的块号j%Q=i,则第j块可映射到第i组中的任何一块

当CPU访存时,地址被解码为三部分:区号,区内块号(组号),块内字地址

根据区内块号i,查找Cache第i组中记录的所有标记是否等于区号来确认是否命中缓存

img

组相联映射电路结构比直接相连复杂,但比全相联映射简单的多,实现比较容易,查找速度较快,Cache命中率较高,是现代计算机Cache-主存普遍使用的一种映射方法

组相联映射电路结构比直接相连复杂,但比全相联映射简单的多,实现比较容易,查找速度较快,Cache命中率较高,是现代计算机Cache-主存普遍使用的一种映射方法

如果我们只将Cache分成1组,那么组相联映射就变为了全相联映射,如果Cache 1块1组,那么组相联映射就变为了直接相联映射

Cache-主存的映射方法在Cache的层次结构中,需要根据与CPU的距离选择

最靠CPU的Cache层次,要求尽可能高速,可采用直接相联映射,或路数较少的组相联(2路 4路)

中间层次的Cache,可采用2路 4路 8路组相联

最远离CPU的Cache层次,对速度要求低,对Cache空间利用率要求较高,可采用全相联

——4.11.8 Cache的替换算法

替换算法是当为命中调入缓存发生冲突时,对已调入的缓存进行牺牲判断的逻辑/策略

先进先出(FIFO)

一种最简单的逻辑,认为发生冲突时,最早被调入的缓存是最不值得被保留的,因此我们可以记录调入缓存的时间戳,找到最早被调入的缓存块将其替换出

最近最久未使用策略(LRU)

事实上先进先出存在一个巨大的漏洞,可能最早被调入的缓存是我们经常用到的,具有很高价值的缓存

因此我们可以根据对缓存的命中访问来记录时间戳,发生冲突时,找到最近一段时间内最不常用的一块缓存替换出

这里Real Time Rending有关纹理贴图的章节,也有讲到关于纹理缓存替换的机制问题,同样提到了最近最久未使用策略

此外RTR还提到了,最近最常使用策略(MRU)

在一段时间内,在多帧进行大批量的访问时,由于调入缓存数量过多,以至于超出Cache(缓存容量)范围,并发生了抖动(Thrashing),这种情况下LRU将会变为一种很不好的策略

为应对这种情况Camack提出了MRU策略,在LRU的基础上增加一个交换检查,如果发现抖动就切换到MRU策略,将最近保存的/最近命中的替换出(相当于是LRU的反逻辑)

直到检测不到交换为之,再切换回LRU策略

除了根据最近访问时间的策略外(R策略),还有依据访问频率LFU MFU策略(F策略)

—4.12 辅助存储器

辅助存储器是指除计算机内存及CPU缓存以外的储存器

用于长期保存计算机的程序/数据/文档/资料等等不经常被使用数据,一般断电后仍能保存数据

硬盘、U盘、光盘都是辅助存储器

辅助存储器的特点是不直接与CPU交换信息,需要将信息调入到主存(内存)中,CPU才能读取到指令/数据(应用程序启动时从硬盘加载到内存中才能运行)

——4.12.1 磁表面存储器

磁表面存储器是最常用的一种辅助存储器,磁盘经常作为计算机硬盘

对磁表面存储器的描述主要包括以下5个技术指标

记录密度

记录密度描述磁盘表面存储二进制信息的密度,包含道密度和位密度

道密度是每单位径向长度上分布的磁道数量

位密度是每单位长度磁道上的二进制信息数量

磁盘盘面每个磁道都是同心圆,一定扇形范围内的圆弧构成一个扇区,越往外侧磁道的位密度越低

存储容量

描述磁盘存储二进制信息的容量,可以通过多种算法计算出容量

课本上给出的算法C=nks

n是盘面数量,k是磁道数量,s是平均每磁道保存的二进制信息量

平均寻址时间

从给出地址信息到磁盘输出数据的平均时间

根据磁盘的工作原理,平均寻址时间=寻道时间+等待时间

寻道时间是针对移动磁头的磁表面存储器,磁头寻找磁道的平均时间

等待时间是磁头来到指定磁道上方后,等待相应扇区旋转定位的时间

平均寻址时间是描述辅存速度的一种方法,磁表面存储器速度主要受制于寻址时间和磁头读写时间两部分

数据传输速率

单位时间能读出/写入的数据数量

数据传输率可通过位密度乘磁盘读/写时的平均线速度得到

误码率

读取时出错信息位数和总数的比值

——4.12.2 磁记录的原理

写入时通过线圈电流方向的不同,决定磁头产生的磁场不同,从而对磁表面进行不同方向的磁化

img

读出时,磁表面在磁头下方移动,根据运动速度,位密度规格,以及运动时磁表面磁化方向的不同切割磁感线在读现圈上产生的电势变化曲线,来确定保存的是0/1

img

——4.12.3 硬盘存储器

这里介绍的是磁盘类型的硬盘

尽管目前已经有相当一部分计算机,尤其是笔记本使用flash memory作为硬盘,就是所谓的固态硬盘

但磁盘仍以其使用寿命长,数据不易损毁,可恢复性强的特点,作为部分计算机的硬盘,或是长期保存数据的介质

———4.12.3.1 分类

按照磁头可划分为固定磁头硬盘和移动磁头硬盘

固定磁头硬盘会在每一圈磁道上布置一个磁头,磁头数量多,在给出访存地址后,寻址时只需等待指定扇区旋转到位即可,因此读取速度块

移动磁头硬盘只有一个磁头,并通过机械臂/插车控制其径向移动,寻址时需要先移动磁头定位磁道,再等待扇区旋转到位,读取速度较慢

按照磁盘的更换行分为可换盘磁盘和固定盘磁盘

可换盘即可以更换盘片,磁盘存储器可看作保存数据的盘片和读写数据的控制&驱动器两部分

固定盘即盘片和外包的控制器&驱动器是一体结构的,通常固定盘对盘片的工作环境要求苛刻,读写速度快,一旦取出盘片破坏真空环境或占到灰尘后,就无法再续写数据(或必须使用专用的读取设备以极慢的速度读取)

———4.12.3.2 磁盘存储器的结构

以控制器与主机总线相连,解码地址和处理数据的读出和写入,控制驱动器对盘片进行读/写操作

控制器可看作是主机和驱动器之间的接口,接收主机命令转换为对驱动器的控制命令,进行地址的解码转换和数据格式的转换

img

移动磁头 磁盘驱动器结构如图

img

由主轴带动磁盘组旋转并使磁头悬浮在盘面上

磁盘控制器送来的磁道位置信息,通过音圈电机控制叉车镜像移动磁头定位磁道

音圈电机会将运行速度反馈给定位控制端,同时定位控制端会检测磁头当前所处的磁道位置,从而形成一个闭环控制系统,实现精确的磁道定位

——4.12.4 软盘存储器

软盘也是一种磁表面存储器

软盘是个人微型计算机中最早出现的可移动存储介质,由一片磁盘+保护套组成,需要使用专用的软盘驱动器连接计算机进行读写

软盘质量轻巧,但相较于使用USB接口的U盘,容量过小,驱动器笨重,因而在U盘的出现和大规模应用后,已经淡出了人们的视线

不过有趣的是,时至今日,部分应用仍沿用软盘这一符号形象,作为保存图标

img所以说…软盘可不是什么3D保存图标

对比硬盘与软盘

img

——4.12.5 光盘存储器

光盘存储器采用光存储技术,通过激光进行写入和写出

第一代光存储技术,采用非磁性介质,热作用烧刻进行一次性写入,不可擦写,只能读出数据

第二代光存储技术,采用磁性介质(磁光材料),通过热磁效应实现反复擦写


第五章 I/O 系统

I/O设备是能够被接入到计算机上运行的一切外部设备的总称

主要是为解决人机交互问题,为人类提供方便的输入设备,并将计算机的运算结果输出展示给人类,是计算机中种类最多,功能最多,结构最复杂,构成最多样的系统

I/O设备的丰富多样,是计算机能在各个领域大规模应用的基础

—5.1 概述

——5.1.1 I/O设备发展

早期阶段,计算机种类和I/O设备数量有限,当时I/O设备与计算机采用专用线路分散连接,程序查询方式

CPU与I/O设备串行工作,要求I/O设备运行输入输出时,CPU必须同步运行相应的程序

随着计算机发展,外部设备越来越多,分散连接已不再适用于计算机的外部扩展

于是出现了I/O接口,DMA控制器,采用总线连接

CPU与I/O设备并行工作,出现了中断DMA两种传输控制方式

I/O设备的输出输出,必须有运算器参与数据处理,原先由CPU直接作为运算器

但在之后的发展中为了提高效率,使CPU与I/O设备真正独立并行,逐渐将I/O设备的输入输出处理从主机中独立出来,出现了具有通道结构的I/O接口

通道是具有专用运算处理器功能的DMA控制器,具有自己的指令集,能够独立运行通道程序,它可以对I/O设备的输入输出数据进行处理,控制连接在通道上的I/O设备直接与主机进行数据交换

通道可以构成层次化的结构,通道下可以带并行工作的子通道,每个子通道可以连接多个设备控制器,每个设备控制器可以连接多个I/O设备

在通道之后,又出现了I/O处理机的理念,采用专用的微处理器连接控制I/O设备并完成数据处理

在一些大型计算机中可以直接使用与CPU相同的处理器作为I/O处理机,在空闲时可以作为主机处理器完成其它运算任务

——5.1.2 I/O系统的组成

I/O系统分为软件硬件两部分

I/O软件

分为I/O指令通道指令

I/O指令是CPU指令的一部分,程序员会将I/O指令编入应用程序,从而在特定的时机接收I/O设备输入,或是将结果从I/O设备输出

通道是具有小型处理器的DMA控制器,拥有自己的指令集,自己的控制器,可以独立运行通道程序,控制I/O设备与主机直接进行数据交互

上层应用程序员在应用程序中编入的I/O指令都是广义I/O指令

操作系统,根据广义I/O指令,使用通道指令编写通道程序,将程序加载到内存或是通道自身的存储器中,启动通道运行程序,来实现广义I/O指令

I/O硬件

包含输入输出设备接口

通道模式下,设备通过硬件接口连接设备控制器,控制器连接子通道,子通道连接通道,按此顺序接入层次化通道结构进行工作

——5.1.3 I/O设备与主机的联系方式

CPU对I/O设备的访问指令包括操作码、指令码、设备码

img

操作码是一个标志,用于标识指令针对I/O设备进行控制

指令码指出了需要进行何种控制操作

设备码给出了I/O设备的编码、地址,或I/O设备中某个寄存器(端口)的地址

———5.1.3.1 编址方式

CPU需要访问I/O设备时,需要在设备码部分给出I/O设备的地址,这就涉及到了I/O设备的编址方式

统一编址

统一编址是将CPU地址总线宽度的一部分直接作为I/O设备的地址

当CPU指令给出的地址码落入I/O设备的编址范围,则这次操作就针对相应的I/O设备执行

使用统一编址时,CPU可以直接使用取数、存数指令的指令码对I/O设备进行访问,不需要单独的I/O指令,CPU指令集相对简单

当CPU有足够的地址线宽时,不妨采取统一编址的模式

不统一编址/单独编址

对I/O设备的编址与内存地址不连读,独立于内存地址之外

此时就需要使用操作码标识专用的I/O指令对I/O设备进行访问

———5.1.3.2 设备选址

在CPU运行指令时,需要对指令地址进行解码,并通过设备选择电路,选中相应的设备进行工作

———5.1.3.3 传送方式

CPU与I/O设备之间的数据传送方式

之前已经进行了介绍,有串行和并行两种方式

——5.1.4 联络方式

CPU与I/O接口通常都是异步并行的,这里的联络方式针对I/O接口与I/O设备

立即响应方式

对于结构简单,工作单一,状态数量少,的外部设备,可以采取直接响应的方式在接收到CPU控制信号后立即执行相应的工作,例如LED灯的亮灭

异步工作方式

对于结构复杂,需要对收发数据进行一定的转换,准备的设备可以采用异步工作方式

异步工作主要分为并行串行两种方式,均采用应答信号来控制工作

并行方式中,I/O接口与I/O设之间通过复杂的类似总线结构相接,通过应答信号来控制工作进程

img

串行方式中,在起始和终止时发送特定的命令信号,在中间传输需要的数据流

img通常起始位是低电平,终止位是两个连续的高电平

同步工作方式

之前已经进行了介绍,需要定宽距的时标,统一工作进程

——5.1.5 I/O设备与主机的连接方式

早期采用辐射(分散)连接,这种方式能够适用于早期I/O设备种类数量少的情况

每台I/O设备都配有一套专用的控制线路和数据传输线路,不便于设备的增删,但有利于专用化的高速控制

后来I/O设备种类数量逐渐增多,通过统一的I/O接口接入到计算机总线中进行连接,有利于工业化的生产,便于增删设备,用户自由扩展

——5.1.6 I/O设备与主机信息传送的控制方式

程序查询方式

最简单的CPU与I/O设备串行工作的控制方式

img以读取操作为例流程如图

CPU在现行程序中遇到I/O设备读取命令时,向I/O设备发送读指令

在接到读指令后,I/O设备需要一定时间进行自身的准备工作,在此期间CPU会不断的查询I/O设备是否准备完成(原地踏步等待),直到I/O设备完成准备前CPU不进行任何其它工作

准备完成后I/O设备将状态触发器标识置为准备完成,CPU与I/O设备进行数据传输,先将数据读入CPU的寄存器中,再由CPU写入到内存中(CPU一拖二

程序中断方式

程序中断方式是对程序查询方式的一种改进,实现了CPU和I/O设备的部分并行工作

由于CPU与I/O设备运行速度不同,I/O设备往往需要较长的时间才能完成准备工作,导致CPU浪费许多时间等待

img以读取操作为例程序中断方式流程如图

程序中断方式中将I/O设备的工作分为自身准备阶段和数据传输阶段

img

在CPU发出读/写命令后,I/O设备进入自身准备阶段时,CPU将继续执行其它工作(并行工作)

直到I/O设备准备完成,CPU将中断当前程序进程,跳转执行中断服务程序与I/O设备完成信息交换,之后再转回原来的程序进程

img

与程序查询方式相比,程序中断方式没有CPU原地踏步等待的现象,一定程度上提高了效率

但程序中断方式需要CPU记录相关的程序断点信息,才能完成中断跳转和转回,一次小数据量的读取,需要大量的指令处理中断操作

CPU在程序中断方式中,仍需要作为处理器,对I/O设备传输的数据进行处理(一拖二),并没有被真正的解放

DMA方式

DMA方式通过DMA处理器来完成对I/O设备传输数据的处理,实现了I/O设备与主存之间的直接联系,从而将CPU真正解放出来

img

当程序运行过程中出现I/O操作时,CPU向DMA控制器发送启动I/O的信号并继续执行其它工作

I/O设备在DMA控制器的控制下完成准备工作,随后DMA控制器向CPU发送DMA请求

CPU接到请求后,会让出一个或数个存取周期,系统总线的占用权限(周期挪用),在此期间CPU不能使用系统总线,不能访问内存

DMA控制器在挪用的存取周期内,通过系统总线,控制I/O设备与主存完成信息交换

对于现代的CPU,即使让出了数个周期的系统总线权限,无法访问内存,仍能通过预取的指令和数据进行相应的工作(CPU工作可能不受影响)

总结

对比三种控制方式如图

img

除了上述三种控制方式外,还有通道方式I/O处理机方式,但超出了计组的范围,可以在计算机系统/体系结构的课程中了解

随着I/O系统的不断发展,I/O设备与主机之间的信息传输控制方式也在不断的革新,I/O系统的自治力不断增强,CPU逐渐从信息交换的处理器工作中被解放出来

—5.2 I/O设备

I/O设备种类诸多,设计物理,机械,计算机,多个领域,本节中我们只对I/O设备进行简要的分类和介绍

按照与主机的连接,I/O设备可看作两大部分,对接I/O接口的、控制I/O设备工作设备控制器,和机械/物理组成部分

主机通过I/O接口,向设备控制器发送相应的指令,设备控制器控制I/O设备完成相应的操作,传递I/O设备的状态信息

img

外部设备按照功能可分为三大类

1.人机交互设备,旨在完成人类和计算机之间的信息交换,将人类能理解的信息转化为计算机的数字信息,亦将计算机的处理结果转化为人类能理解的形式输出,常用的键盘,鼠标,显示屏都是人机交互设备

2.信息存储设备,之前在介绍计算机存储体系时,一部分存储设备是独立于主机之外的,例如磁盘,光盘,U盘,磁带

3.机-机通信设备,实现计算机与计算机之间的通信,计算机与外部体系之间的通信,例如调制解调器

——5.2.1 输入设备

键盘是最常见的输入设备之一,其工作原理通过编码键盘法,将键盘按键编制为一个行列矩阵,不断循环查询是否有键位被摁下,并将摁下键位对应的行列计数器信息转换为相应键位的ASCII码,输出到一块ROM中再传递计算机(CPU)

鼠标的形起和使用,推进了GUI图形化界面的发展,主要有机械式和光电式两种

触摸屏是现今手机,平板电脑广泛使用的一种输入设备,通过人体电场,手指的电流感应实现触摸位置的获取

——5.2.2 输出设备

显示器是最常见的输出设备,早期的显示器是只能显示字符的字符发生器,后来出现了显示像素点阵的主观绘制图像的图形显示器,如今的显示器通过像素阵列,RGB三色灯+液晶偏振或其它方式实现了图像的显示,并朝着广色域,高色深的方向不断发展

打印机是另一种常用的输出设备,早期的打印机是通过字符点阵,利用击针进行逐字逐行打印的击打式打印机,目前各种票据打印仍使用击打式打印机,而打印文件多使用非击打式的激光、喷墨打印机

——5.2.3 其它I/O设备

实现 A/D 模拟信号与数字信号转化的I/O设备,一些外部设备输出模拟信号需要被转化为数字信号输入到计算机,如果计算机需要对外部设备进行控制或是进行长距信号传输则需要将数字信号转化为模拟信号

终端是有键盘和显示器组成的,与远程主机连接的操作端口,通过终端实现人机的交互,再由远程计算机处理相应的数据和指令

早期的微型计算机中,对于汉字的输入存储输出,亦需要特定的设备进行处理

——5.2.4 多媒体技术

多媒体技术是通过多种媒体结合,给予人类更丰富的视觉、听觉、触觉的感受,以及更丰富的人机交互方式,例如虚拟现实技术,增强现实技术

多媒体技术是目前计算机领域一个新兴的,热门方向,涉及相应的数据压缩、数据存储、数据传递技术,专用的输入输出设备研制,实时渲染等

—5.3 I/O接口

接口其实是一个广义的概念,不仅用于程序和程序之间,更用于硬件和硬件之间,接口旨在制定一种控制/命令/传输的标准来统一不同的硬件/软件的实例

对于I/O接口而言,即需要硬件制造上的接口标准,使外部设备能够接入计算机,又需要软件上的转换控制,使主机能够通过统一的指令来选择/启用外部设备进行工作,获取外部设备的工作状态

——5.3.1 I/O接口的功能与组成

I/O接口应具有以下功能:

1.选址/设备选择功能,需要通过设备选择电路,对主机设备选择线上传递的I/O设备码/端口码进行判断匹配,控制I/O设备的启用与否

2.命令传送功能,需要命令寄存器、译码器,将主机命令线路发来的控制命令转换并向外部I/O设备的控制器传递命令

3.数据传输功能,需要数据缓冲寄存器,通过数据缓冲实现I/O设备与主机之间的传输速度匹配,主机与I/O之间通常使用并行传输,而I/O接口与设备之间通常使用串行传输,因此还需要实现 串 – 并 格式转换

4.反应设备的状态,需要各种触发器来记录和反应外部I/O设备的工作状态,主机通过I/O接口获取外部I/O设备的工作状态

img屏蔽触发器由主机控制,当主机进行高优先级的任务时通过屏蔽触发器来屏蔽中断信号,禁止I/O设备占用总线

5.实现电平转换,外部的I/O设备在接入主机后通过主机电源供电进行工作,主机中的电平与I/O设备所需的电平不一定相同,因此需要I/O接口在硬件上实现电平的转换

I/O设备的组成,CPU-I/O接口-I/O设备 连接电路

img

I/O设备与总线的连接电路

img

——5.3.2 I/O接口的分类

img

—5.4 程序查询方式

The normal one is the true one

——5.4.1 查询流程

对于单个设备的程序查询,只需循环监测状态标记即可

img

其中检测状态标记是一条测试/检测指令

检测到结果后使用 转移指令/分支指令 指向两个不同的分支

如果检测到数据准备完成,转移至交换数据操作,使用 传送指令/数据交换指令 开启I/O设备与主机之间的数据传递

对于多个设备则采取遍历的方式进行查询,直到查询到某个设备准备完成,遍历的顺序就是设备优先级的顺序

img

——5.4.2 传输程序流程

由于CPU寄存器容量有限,每单次传输后CPU需要将寄存器中的内容写入到主存中,再进行下一次传输

传输中我们需要设定一个计数器来记录传输的数据量,每单次I/O设备-CPU寄存器-主存数据传输后累加计数器,通过计数器的数值辨别是否已经完成全部的数据传输任务

img

——5.4.3 程序查询方式的接口电路

如图我们给出一个简单的电路实现

img图中仅针对读取操作,给出了最基本的I/O接口电路,实际电路中还需处理指令,转换数据更加复杂

以从I/O设备中读取数据的输入操作为例,电路流程如下:

1.地址线/设备选择线路 上给出I/O设备的地址码/设备码,由I/O接口中的设备选择电路完成比对,输出选择信号并与启动信号过与门。选择设备并获得CPU启动指令的I/O接口,将完成状态触发器D置0,工作状态触发器B置1

2.I/O设备控制器获得工作命令,响应工作状态/设备忙状态,开始准备数据

3.I/O设备准备好数据并传输到DBR数据缓存中,设备通过状态线向接口反馈工作结束信号

4.I/O接口获得设备工作结束信号后,完成状态触发器D置1,工作状态触发器B置0

5.CPU循环查询到完成状态触发器D置1,寻找时机开启数据交换

6.CPU通过数据总线从DBR中读取数据

—5.5 程序中断方式

戴着脚镣起舞

——5.5.1 中断的概念

中断是一个广义的概念,是指CPU在运行程序的过程中,出现了某些特殊事件

CPU需要对当前程序运行的断点进行记录,并跳转执行中断服务程序

在程序中断控制方式中,CPU需要作为I/O设备向主机传递数据的处理器,所运行的中断服务程序便针对于此

当中断服务程序执行完成后,CPU会根据之前记录的程序断点,返回到原来执行的程序断点,继续向下运行原有程序

——5.5.2 中断的产生与运行流程

以打印机为例,其产生中断,CPU与打印机的运行流程如图

img

打印机中有一定的缓存来保存要打印的数据信息,在中断过程中,CPU会向打印机缓存中写入需要打印的数据(累加计数器判断打印数据是否完全传输)

此后CPU结束中断服务,回到程序断点继续执行原程序,打印机开始打印缓存好的数据

当打印机打印完所有数据后,如果打印未结束,打印机会再次提出中断请求,获取数据进行打印

——5.5.3 程序中断方式的接口电路

使用程序中断方式,I/O接口除5.3中的结构外,还需要配置中断请求触发器和中断屏蔽触发器

img

如图INTR为中断请求触发器,MASK为屏蔽触发器

中断请求只有在I/O设备完成准备工作,完成状态触发器D置1,且屏蔽触发器未被置1(置0未屏蔽)时才能发出中断请求,将INTR输出端置1

CPU会在指令周期结束前,发出中断查询信号,检测I/O接口是否产生中断请求信号

每个I/O接口都需要配置INTR和MASK触发器,对于多个接口的中断请求,需要在查询时按一定的排队机制

排队机制可分为硬件实现和软件实现,其中硬件实现类似系统总线中的链式查询方法,软件实现则是在程序中配置优先级表/矩阵,按优先级顺序进行按序查询

img

硬件实现的排队机制如下图所示

img

当没有请求时,所有的INTR输出都为0,经过非门后最终输出均转为1

当高优先级的INTR置1表示有请求后后,!INTR就会为0,使查询链上其它低优先级I/O接口的查询值都置0

例如当INTR1未提出中断请求,而INTR2提出中断请求,此时除1、2最终输出为1外,后续输出均被置为0

从而按序最后的1就是所有提出中断请求中,优先级最高的被选中的I/O接口

此时我们再将最终输出信号与自身的INTR信号做与非门,从而最终就只有被选中的I/O接口输出值为1

img

——5.5.4 中断向量地址形成部件

在完成了中断请求的提出,排队,确认了被选中的I/O接口之后

下一步就需要找到中断服务程序的入口地址,从而让CPU运行中断服务程序

img

可以通过软件查表的方式来获取入口地址

亦可以使用硬件,将排队器输出值输入到一个设备编码器中(中断向量地址形成部件),根据输入值,中断编号,等信息产生一个解码后的,中断向量值输出

中断向量包含了中断服务程序的段地址,偏移地址,从而指向内存中的某一条指令(该指令是中断服务程序的首指令,或跳转到中断服务程序的指令),也包含了执行中断服务程序时的一些状态信息(参数)

img

程序中断方式接口电路基本组成如图

img

——5.5.5 I/O中断处理过程

———5.5.5.1 CPU响应中断的条件和时间

CPU中使用允许中断触发器EINT来设置是否能够响应中断

开中断指令将其置1,关中断指令将其置0,也可以由硬件自动复位

在每条指令执行操作完成,执行阶段结束前,如果EINT触发器置1,CPU会发出查询中断信号,并根据排队器的向量输出结果进行中断跳转,或继续执行原程序

———5.5.2 I/O中断处理过程

img

如图以读取操作为例,I/O中断处理过程

对于I/O接口通过设备选择线&CPU启动命令,设置状态触发器,I/O设备准备数据,传输到DBR缓存,之后进行中断请求的过程就不再赘述了

CPU发送中断查询信号后会将所有I/O接口中的INTR输出信号初始化(置1),设备向触发器设置中断请求信号,之后使用排队器进行排队,向CPU发送被选中的中断请求信号

CPU发送响应中断请求信号INTA给设备编码器,之后获取编码器输出的向量地址

———5.5.3 中断服务程序的流程

首先CPU需要保护现场,对中断返回之后需要执行的下一条指令位置进行保存(程序断点),此外还要保存程序的运行状态(不能由之后的指令复现的对当前程序执行有用的状态信息),这两步保存操作完成由硬件自动完成,称之为中断隐指令(操作)

如果在中断程序的运行中,需要占用体系结构寄存器,也需要先保存寄存器中的内容,以便程序返回后复现,可以通过压栈的方式存储,也可以写入到内存的某一位置,或是转存入其它寄存器中,这需要编写编写中断服务程序的程序员自行维护

非体系结构寄存器在中断服务中数据的保存和复现会由中断隐指令自动完成

之后CPU切入运行中断服务程序,中断服务程序针对不同的I/O设备编写,具有特定的功能

完成中断服务程序后,CPU需要恢复现场,主要针对体系结构寄存器,通过 出栈/读取内存/读取寄存器 的方式复现原有的数据

最后,CPU使用中断返回指令,根据程序断点定位下一条需要执行的程序指令位置,并继续运行原有程序

———5.5.4 单中断和多中断

单中断指CPU在运行中断服务程序时,不能中断现行的中断服务

而多中断中,允许级别更高的中断源中断现行的中断服务程序,跳转执行更高优先级别的中断服务程序,从而形成中断的多重嵌套

如图单中断和多中断的流程对比

img

单中断中,只有CPU完成中断服务程序,返回原程序后,才会执行开中断指令,响应其它中断请求

而多中断中,则是提前开中断指令到进入中断服务程序后,在运行中断服务程序时允许更高级别的中断再次插入

程序的断点,体系寄存器的值通过压栈保存,从而借助栈“先进先出”的特性,能够在中断的多重嵌套中,正确的获取当前层的返回信息

———5.5.5 主程序和中断服务程序抢占CPU的流程图

img

宏观上CPU和I/O并行工作,体现在I/O设备进行准备时,CPU能并行执行主程序的运行

但本质上,当I/O设备与主机真正开始数据交换时,CPU仍需要中断现行程序,运行中断服务程序,作为处理器对I/O设备与主机的数据交换进行服务,并没有被真正的解放

—5.6 DMA方式

那么古尔丹,代价是什么?

DMA(Direct Memory Access,直接内存存取) ,将CPU从数据传输处理器的角色中解放出来,进一步实现了外部设备数据传输的独立性

——5.6.1 DMA和程序中断方式的数据通路对比

如图DMA方式中I/O设备在DMA接口的控制下直接与主存进行数据交换

而程序中断方式中,CPU需要作为处理器,为I/O设备与主存间的信息交换服务

img

——5.6.2 DMA与主存交换数据的三种方式

I/O设备在DMA接口的控制下进行数据交换时,需要占用系统总线,因此CPU需要通过一定的机制让出总线的使用权限

停止CPU访问主存

最简单的控制方式,当DMA接口控制I/O设备与主存进行数据传输期间,CPU完全放弃对系统总线的占用(不能访问主存)

期间如果CPU 寄存器中有预取的指令/数据,或是命中了CPU Cache,CPU仍能继续工作,否则CPU将处于不工作状态或保持状态,等待总线权限

这种方法适用于I/O设备与主存有大批量数据传输,但I/O设备与主存的逐字数据传输过程中存在时间间隔,间隔时间甚至可能大过存取周期,但DMA控制器仍占用总线权限,CPU对主存的利用率未能充分发挥

周期挪用(周期窃取)

周期挪用是最常见的DMA与主存的数据交换模式

当I/O设备在DMA接口控制下,完成数据准备,确实需要总线权限来传输数据时,DMA接口向CPU提出占用请求

若CPU此时不访存,会挪用一个或数个存取周期给 I/O设备-DMA接口-主存 用于完程数据交换

若CPU与DMA同时请求访存,通常优先给予DMA总线权限

若CPU正在访存,则需要等待CPU访存结束后再获得总线占用权

img

周期挪用模式提高了CPU对主存的访问效率,DMA只在必要的时候按需占用相应的存取周期完成数据传输

DMA与CPU交替访问

实用性不强的一种模式

通过时钟频率划分CPU访存和DMA访存,CPU与DMA在各自的交替周期内自然获得总线的占用权限,并需要在周期内完成访存操作

从而不需要申请建立和归还总线的使用权限,由时序信号直接确定使用权限,一定程度上简化了控制结构

img

——5.6.3 DMA接口的功能和组成

DMA接口所具有的功能如下:

1.向CPU提出总线占用申请

2.处理总线控制权的转交

3.获得控制权后,管理系统总线,控制数据传输

4.确定传输的首地址和长度,记录传输的字长并累加传输地址,保证传输的有序完成

5.传输结束时,给出操作完成信号移交总线控制权

根据DMA接口的功能,以单总线结构为例,我们可以画出DMA接口的组成示意图

img

AR存储器中存储传输的目标地址,假设按从小到大的地址顺序,每进行一字长的传输就需要对AR存储器中的地址+1

WC存储器中保存传输的字长度,通常根据传输数据量先置为负数,并不断累加,直到0即为传输完成

BR存储器中缓存外部设备需要传输的数据

DAR存储器中保存DMA接口自身的地址,用于设备选择时进行比对,此外DAR存储器中还需要保存外部存储设备的相关地址参数,例如连接外部磁盘时保存磁道号,扇区号

AR通过地址线将需要访问的主存地址传输给主存

数据线连接AR WC BR DAR存储器实现数据的输入输出

DMA控制逻辑需要接收来自外部设备请求传输的DREQ信号,向设备反馈相应信号DACK,向CPU发出总线占用请求HRQ信号,接收CPU的相应信号HLDA

中断机构在传输过程中,接收来自WC的溢出信号(传输完成),向CPU发出传输中断请求,交还总线占用权,并进行传输后处理

——5.6.4 DMA的工作过程

———5.6.4.1 DMA传输过程

DMA传输过程可分为三个阶段:预处理阶段、数据传送阶段、后处理阶段

img

如图预处理阶段由CPU启动I/O设备时,运行相应的指令完成,包括对DMA控制逻辑设置传送方向,对DAR设置设备地址,AR设置主存地址,WC设置传送字数

数据传输过程由DMA控制I/O设备,在挪用的访存周期内完成,期间CPU可继续执行主程序

当数据全部传输完成,DMA接口会发送中断请求,由CPU运行中断服务程序进行后处理

数据传送的过程中,是一个从外部设备不断缓入数据到BR缓存器,再写入主存,或是从主存中不断读出数据到BR再写入外部设备的过程

每次的周期挪用,完成数据传输后,需要根据WC存储器判断是否传输完成,若传输未完成,则需要再次从外设缓入数据到BR准备下一次传输,或从主存中读出数据到BR进行下一次写入,若传输完成则向CPU发送中断请求信号

———5.6.4.2 DMA传输流程图

数据从外部设备写入到主存

img

1.CPU进行预处理,启动传输后,外部设备将一定批量的数据缓入BR存储器中

2.达到BR存储器容量上限,或已缓入所有数据,外部设备向DMA控制发出DREQ信号表示准备工作完成,请求传输

3.DMA控制逻辑通过总线向CPU发出HRQ信号申请总线占用申请

4.CPU响应申请,发出HLDA应答信号

5.AR存储器通过地址总线将传输目标地址置入主存,主存准备好写入

6.DMA控制逻辑向设备发出DACK信号,表示开始进行传输

7.通过数据线将BR中缓入的数据写入主存,并在写入完成后对AR地址和WC传输字长+1

8.单次传输已完成,根据WC存储器累加后值判断传输是否完成,若未完成,设备会再次缓入数据到BR中,并再次申请总线占用,传输数据,若完成,中断机构向CPU发出中断请求,CPU运行中断服务程序进行后处理

数据从主存写入外部设备

img

1.BR存储器将缓存的全部数据传输给外部设备,完成写入

2.BR存储器全部设备写入完成后,设备向DMA控制逻辑发出DREQ信号,表示传输完成

3.DMA控制逻辑通过总线向CPU发出HRQ信号申请总线占用申请

4.CPU响应申请,发出HLDA应答信号

5.AR存储器通过地址总线将传输目标地址置入主存,主存准备好读出

6.DMA控制逻辑向设备发出DACK信号,表示开始进行主存数据读出

7.通过数据线将主存中的数据读出到BR存储器中,并对AR和WC+1

8.单次写入完成,根据WC判断是否已完成写入,是否需要继续循环,或是发出中断请求

WC存储器是在主存-BR进行数据传输完成后才会+1,之后根据其值判断是否完成数据传输,因此对于主存写入外部设备,最后一次主存-BR似乎读出了多余的不必要数据

———5.6.4.3 后处理

后处理的工作包括

校验写入主存的数据是否正确

是否需要继续使用DMA进行数据传输,或是结束传输

测试传送过程是否正确,若不正确转入诊断程序

——5.6.5 DMA接口与系统的连接方式

具有公共请求线的DMA请求

即链式查询模式,所有DMA接口共用一条请求线,CPU响应请求后链式寻访DMA接口,给出HLDA应答信号,越靠前的DMA接口优先级越高

img

具有独立线的DMA请求

即独立请求模式,每个DMA接口都有独立的请求线和响应线,在CPU内部完成排队逻辑

img

同样也可以使用第三章提到的计数器查询模式

——5.6.6 比较程序中断方式与DMA方式

img

相较程序中断方式,DMA接口上通常挂载高速设备,如不响应可能造成数据的丢失,因此优先级较高

——5.6.7 DMA接口的类型

选择型

物理上连接多个设备,逻辑上只允许连接一个设备(在同一时间只能有一个设备通过DMA接口与主存进行信息交换)

CPU在预处理阶段会对DMA接口进行设置,选定需要启动访存的设备

img

多路型

物理上连接多个设备,逻辑上允许多个设备同时进行数据的准备工作,但同一时间只能有一个设备与主存数据传输

多路型的DMA接口,可以通过通道实现,每个子通道都相当于一个独立的DMA接口,能够连接外设,控制完成数据传输

CPU可以启动多个子通道对于的设备开启访存,同一时间会有多个子通道控制外设进行数据准备,之后主通道需要排队所有子通道在准备完成后的传输请求,向CPU提出占用请求

img

如图多路型DMA传输流程

这里打印机,磁盘,磁带都连接在一个多路型DMA接口上

当子通道同时发出申请时,优先响应高速设备的请求

img

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片