概述

架构

冯诺依曼

以运算器为中心,指令和数据同等地位(不满足摩尔定律)

image-20230617133555268

存储器为中心

image-20230617133840406

哈佛架构

哈佛结构数据空间和程序空间是分开的

大部分ROM操作部分是采用了冯诺依曼结构

有些需要CPU与ROM之间快速的响应和交互,采用的是5级流水的哈佛结构。

早期(如X86)采用冯诺依曼

DSP和ARM用改进哈佛

image-20230617134010940

现代计算机

image-20230617134045099

RISC-V

数的表示

无符号数与有符号数

机器数与真值

image-20230619211124996

意思就是真值有±符号,机器数把±符号换成了数字罢了

原码/补码/反码/移码

image-20230617142534411

原码

整数用逗号隔开,小数用小数点隔开

整数

image-20230617140847726

小数

image-20230617140920563

注意0的特殊情况

image-20230617141011120

补码

对于负数,原码->补码符号位不变,数值位按位取反再加一的理论由来。神奇的是对于补码->原码,也是按位取反再加一。

简单证明一下:

设x为补码,y为原码,n为位数

已知 x = !(y - 2^n) +1

则反转一下可得 y = !(x - 1) + 2^n

符号位不变,按位取反再加一

整数

image-20230617141209384

小数

image-20230617141232325

特殊

[y]补连同符号位在内,每位取反末位加1,即得**[-y]补**

后面那三个是真的抽象

image-20230617141627719

反码

对于正数,反码和原码一致;

对于负数,反码为原码的数值位取反

整数

image-20230617141351461

小数

image-20230617141418617

0

image-20230617141525918

移码

注意,移码只有整数形式的定义,这与它的用途有关。计算机中,移码通常用来标识浮点数的阶码【阶码是整数】。

与补码数值位计算方式相同,区别是符号位相反

image-20230617142858076

image-20230617145309340

注意,移码的0为100000,最小值为000000

浮点表示

表示形式和范围

image-20230617143220170

注意,这边的上溢和下溢只与阶码有关,与尾数无关。

这个溢出条件及其处理方式需要记,会考

image-20230617143328674

规格化

image-20230617143654003

特例

image-20230617143731873

范围

image-20230617143912465

image-20230617145251169

题型 表示范围

image-20230617145826541

看得我cpu快烧了

https://www.jianshu.com/p/7b9dd240685c

image-20230617145857698

之所以最小负数不一样,是因为原码不能表示-1,补码可以;

之所以规格化最大负数是那玩意,是因为最大负数本应为2^-8,为了规格化必须再加个2^-1,然后原码转补码就变成那样了

IEEE754标准

难绷,最沙比的来了

image-20230617150024955

没有阶符和数符力

image-20230617150101092

image-20230617150816446

它就相当于指数是移码表示的,并且注意到一点就是指数的0和255被征用表示特殊的数了,所以指数范围为1-254

image-20230617151013979

题型 把数转化为IEEE754

首先背一下上面那个数的范围图,然后判断下是规格化还是非规格化,然后套公式就行了

image-20230617152014370

image-20230617152309065

算术移位与逻辑移位

来自 https://blog.csdn.net/qq_34283722/article/details/107093193

img

这应该与补码的运算机制有关。

image-20230617152527973

反码不论是左还是右都添1

image-20230617152938114

注意,符号位不变!!!这点在左移的时候需要尤其注意,很容易出错

RISC-V概述

ISA

ISA位宽:通用寄存器的宽度,决定了寻址范围大小、数据运算强弱。

CISC-RISC

image-20230619211742901

X86 & MIPS

相比于上述的差异,还有以下几个:

  1. x86有8个通用寄存器,MIPS有32个
  2. x86有标志寄存器,MIPS没有
  3. x86为两地址指令,MIPS为三地址
  4. x86有堆栈指令,MIPS没有
  5. x86有IO指令,MIPS设备统一编址
  6. x86函数参数只用栈帧,MIPS用4寄存器+栈帧
  7. X86的字为2字节,MIPS/RISC-V的字为4字节

RISC-V的特点

  1. RISC-V是小端,也即低字节放在低地址

  2. 支持字节(8位)、半字(16位)、字(32位)、双字(64位,64位架构)的数据传输

    主存按照字节进行编址

  3. 采用哈佛结构

  4. 三种特权模式

    image-20230617155657577

  5. 模块化设计

    image-20230617155224429

RISC-V汇编语言

寄存器

image-20230619212236116

image-20230617194244388

x3的全局指的是全局的静态数据区

指令详解

image-20230617160729611

算术指令

RISC-V 忽略溢出问题,高位被截断,低位写入目标寄存器

如果想要保留乘法所有位:

image-20230617183814367

image-20230617183924758

image-20230617184010487

逻辑指令

image-20230617184151843

移位指令

image-20230617185225785

shift left logical,shift left arithmetic

数据传输

ld/sd,lw/sw,lh/sh(半字,也即2字节),lb/sb,以及load指令对应的无符号数(+后缀u)版本。

bAddrReg+offset为4的倍数,数据传输指令除了字节指令(lb sb lbu)外都需要按字对齐。

注意,如果为有符号数取数,放入寄存器时会自动进行符号扩展

image-20230617191543433

比较指令

image-20230617192731684

条件跳转指令

image-20230617193045409

无条件跳转指令

image-20230617193346852

j:+label,用于实现无条件跳转,使用相对于当前 PC(程序计数器)的偏移量来计算目标地址,跳转范围较广

jr:+寄存器,用于实现通过寄存器的值进行跳转,跳转的目标是存储在寄存器中的地址,而不是相对于 PC 的偏移量

伪指令

image-20230617193450180

image-20230617193521343

函数调用及栈的使用

image-20230617195109547

六种指令格式

image-20230617213801145

注意,jalr属于I型指令,而非J型指令!!!

image-20230617213815058

image-20230620164851924

R型指令

image-20230617214018489

image-20230617214139338

I型指令

image-20230617214544561

image-20230617214659517

image-20230617214735023

特例1 load

image-20230617215007481

特例2 jalr

image-20230617215304022

注意,jalr也属于I型指令,且其funct3为0

S型指令

image-20230617215730749

image-20230617215842401

B型指令

image-20230617220521906

这个计算过程很值得注意

image-20230617220833542

image-20230617220903564

image-20230617221131122

U型指令

image-20230617221220495

image-20230617221323268

image-20230617221508473

666

J型指令

image-20230617222154873

寻址方式(x86)

img

img

img

imgimg

尽管A很小,但可以让EA很大,从而扩展寻址范围。同时相对于上面的直接寻址,它更容易编程,因为只用修改A存储的那个地址值,而不用修改指令【比如说对数组进行循环,这个间接寻址就只用A++就行,而不用去修改指令里的那个“A”。】。

That is 指针【】

img

img至于为啥间接寻址不便于循环,也许是因为间接寻址是访存两次比较慢,要是真用来循环还了得

imgimg

程序动态定位

img循环数组时,可以用A作为数组地址,IX作为数组下标???【为什么不能用基址寻址?】

应该是因为基址寻址的基址是系统内定的,数组循环问题需要用户指定数组起始地址,所以不能用基址寻址,只能用面向用户的变址寻址。

img区别就在于直接寻址直接把指令参数****硬编码在内存****中,非常耗费空间。变址寻址则把指令参数作为变量了。

img更应该像是指令寻址方式。

程序浮动:程序在内存单元的位置出现变化【毕竟不可能同一个程序在每台电脑都是在同一个物理地址,相当于又减少了硬编码】

imgimg【为2002H是因为假设字长为2byte】

imgimg

一般栈顶地址最低。

运算方法

定点运算

一位乘法运算

原码一位乘

image-20230621195833297

大致明白了:

①乘积一共有四位,故而需要两个寄存器来保存。

②按照上面的原理公式,每次右移一位,被移出的那一位也是最后的结果(相当于竖式中每次相加的最后一位),需要把它存储在另一个寄存器中。

③我们选择了存乘数的寄存器,因为乘数已经乘过的位是没用的。存乘数的那个寄存器的乘数不断被结果的低位所替代。

故****基本流程****:

①准备阶段:清零ACC【置部分积=0】,在MQ中放乘数,X中放被乘数

②判断MQ中乘数最低位,若为1,则ACC部分积加上X中的被乘数;若为0,则ACC不变

③将ACC和MQ中四位数字视作一个整体,符号位也算上,进行逻辑右移,左侧补0.

④重复上述过程,按移位次数来控制结束。

⑤则最后,ACC中存储的就是乘法结果的高位,MQ中存储的结果就是乘法中的低位。

这其实就是我们用的列竖式一行一行加起来的一个过程。

img

S是符号位,GM是乘法标志位。

控制门:当最后一位是1时,控制门打开,X中的被乘数进入加法器。

  1. 部分积 乘数

  2. 乘数不用符号位,写数值位即可

  3. 按照是0是1,要么+被乘数要么+0

  4. 右移(连符号位一起逻辑右移)

    image-20230620232152706

  5. 直到乘数全部移完

Booth算法

  1. 部分积 乘数 y补(一开始为0)

  2. 部分积双符号位,乘数单符号位且参与运算

    image-20230620212054291

  3. 每次依据乘数和y补的关系,进行是否加被乘数的决策:

    注意右移不同于原码,是算术右移

    image-20230620212122222

  4. 最后一步不用移位

    image-20230620212150280

除法运算

逻辑左移

最后得到的余数还得乘个2的-n次方

恢复余数法

  1. 被除数(余数) 商
  2. 先加上 - 除数的补
  3. 如果得到结果≥0,则上商1,左移
  4. 如果小于0,则上商0,+除数补,左移
  5. 左移5次(商包括符号位的所有数字被填满),最后一次上商不用移位

不恢复余数法(加减交替法)

image-20230621200001791

总结一下,大概流程:

①准备阶段:MQ清零【存放商】,ACC放入被除数,X放入除数

②ACC - X中的值

③若ACC中值【上一轮的余数】为负,则上商0;为正,则上商1.ACC左移一位。判断MQ的最后一位【上商的值】,若为负,则ACC + X中的y;为正,ACC - X中的y。【注意,若为第一次减去X,则当余数为正时,就即刻发生溢出错误退出】

④重复③,直到移位n次。

img

V表示是否溢出。

  1. 被除数(余数) 商

  2. 先加上 - 除数的补

  3. 如果得到结果≥0,则上商1,左移,下一次继续加 - 除数的补

  4. 如果小于0,则上商0,左移,下一次加除数的补

    image-20230620234054088

    逻辑左移

  5. 左移5次(商包括符号位的所有数字被填满),最后一次上商不用移位

浮点运算

舍入

(1)意思是,舍去的要是1,就在保留数+1.如果是0就直接舍去。

img这意思难道是说可以一次性右移,最后再看要不要+1,而不是移一下加一次1?【不过想了一下,这两种顺序得到的结果好像是一样的。】

快速进位链

https://www.bilibili.com/video/BV1AB4y1p7ax?spm_id_from=333.880.my_history.page.click&vd_source=ac571aae41aa0b588dd184591f27f582

以及老师在这讲的也挺好的【p88】

imgimg

当AiBi都为1时,无论Ci是什么,都必定进位1;当AiBi有一个为1时,Ci才会起决定性作用;当AiBi都为0时,无论Ci是什么,都不会进位。因此,AiBi为本地进位,Ai+Bi为传送条件。(乘号表示且,加号表示或)

img进位链是影响加法器速度的瓶颈

img但问题是电路太复杂了,因此给出折中方案:

img

4先产生进位,传给3,3再产生进位,传给4,依次下去。

img

imgimg

imgimg

相当于又套了一层并行进位链。

img实在是太强了。感受到还要再套一层分组的必要性了。

处理器

RISC-V数据通路的组件选择

image-20230617232028775

RISC CPU采用哈佛架构。

存储器

  1. DM Data Memory 数据存储器

    读异步,写有写使能

  2. IM Instruction Memory 指令存储器

    一般read only

寄存器堆

同步写异步读

image-20230617233101214

立即数扩展(生成)部件

零扩展、符号扩展

PC(程序计数器)

支持两种加法:+4、+立即数

ALU

【以下运算器结构适用于累加型运算器。累加器好像意思是一次最多两个输入。 】

运算器的功能是运算,因此其核心就是ALU(算术逻辑单元)。ALU是一个组合电路,组合电路的特点是,如果输入撤销了,那么输出结果也会撤销【组合逻辑电路】。因而,为了让ALU的结果能被保存,必须在输入端加上两个寄存器来保证信号持续输入。这两个寄存器一个叫做ACC,另一个叫做x,也叫做数据寄存器。

imgMQ也是寄存器,用于保存计算过程中溢出的位数。

img具体见第六章,弹幕说汇编语言也有讲。乘法要这样放是为了防止乘积低位覆盖乘数。

img

imgACC里存放着上面的操作或者与外部交流得到的被乘数,按照约定需要转移到X里。我猜M放在MQ而不是ACC,可能是因为第一二步是并行的,如果放在ACC就需要一些等待。

并且乘法做的是移位累加【可能相当于上面乘法原理的第一个图吧】,ACC用来存储这些累加的暂时交换成果,因而需要将ACC先清空为0.

这些操作的先后顺序由控制器进行控制。

img

MQ也称乘商寄存器

运算类型:加、减、或、比较、slt、nor

操作数:寄存器或立即数

image-20230619214753499

RISC-V部分指令的数据通路设计

取数指令的完成过程

image-20230621192714673

下面是取数指令的完成过程。

完成一条指令有三个阶段:取指令、分析指令、执行指令。

取指令:PC把地址送到MAR,MAR把地址送到存储体。存储体在控制器的控制下,把地址所对应的指令的内容发给MDR,MDR把取出的指令送到IR.

分析指令:IR将指令的操作码部分交予CU,CU控制IR,IR将指令中的地址码部分交予MAR,MAR给存储体,存储体在控制器控制下给MDR,MDR送给ACC。

【这个过程正像是计算机网络,只不过此处全靠硬件完成,计算机网络只能依靠协议】

流水线周期

RISC-V

image-20230617233444017

image-20230618170512788

注意,在ID阶段还会发生读寄存器

image-20230617233433422

X86

一、指令周期

  1. 基本概念

① 指令周期

② 每条指令的指令周期不同

imgADD取指阶段和执行阶段都需要一次访存

③ 具有间接寻址的指令周期

img

三个周期各需要访存一次。【****现在暂时还不知道这有毛用****】

④ 具有中断周期的指令周期

img

⑤ 指令周期的流程

img

⑥ CPU工作周期的标志

指令周期的不同阶段,控制器要做不同的操作,要发出不同的命令。因而,控制器需要知道当前处于指令周期的哪一个阶段。

img用四个触发器

  1. 指令周期的数据流

① 取指周期

img

首先,PC把自己里面存的地址放进MAR,再通过地址总线传输给存储器。

CU通过控制总线向存储器发出读控制信号。

存储器执行读操作,通过数据总线传输取到的指令给MDR,MDR再传给IR。

CU把加一后的地址保存在PC中,为下一条指令取指做准备。

② 间址周期

img

如果指令的数据部分采用的是间接寻址的方式,那么此时,MDR中的地址部分不是有效地址,而是存储存储有效地址的存储单元的地址值。因而,我们需要再通过一次访存操作,把有效地址值存储在MDR中。

③ 执行周期

img留给第九章介绍。

④ 中断周期

做了三件事:保存断点、形成服务程序入口地址、中断返回

img

首先,保存断点。由CU来确定断电保存在内存单元的哪里。CU把地址传给MAR,MAR将其发到存储器,CU给存储器写命令。PC将自己的值【也就是下一条要执行的命令的地址值】交付给MDR,MDR传给存储器。【MDR在读写操作时都充当了缓冲区的角色。】

然后,CU形成中断服务程序入口地址,并直接把它写入到CU。

流水线处理器

流水线概述

流水线

image-20230618150003983

这点我觉得讲得挺好的。以前只知道流水线通过并行来加速指令执行,但这里给出了一个新的思路:如果是单周期处理器,则RISC-V的时钟周期受执行时间最长的指令限制;如果是流水线处理器,时钟周期就可以由某个步骤决定,主频就可以加快。这个出发点很有意思。

如果流水线各阶段平衡,也即每个阶段需要的执行时间差不多,则

image-20230618150515599

也即在理想条件和有大量指令的情况下,流水线带来的加速比约等于流水线的级数,若各阶段不完全平衡,加速比会变小。

流水线技术是通过提高指令的吞吐率来提高性能的。

RISC-V与流水线

我们可以看到,比起X86,RISC-V是面向流水线设计的,其特性与流水线高度相关:

  1. 指令长度相同

    简化IF和ID

  2. 只有六种指令格式,格式整齐

    能在一个阶段内完成译码和读寄存器(ID)

  3. 只通过load、store访存

    可以利用EX阶段计算存储器地址,然后在下一阶段访存(MEM)

流水线冒险

image-20230618151040625

结构冒险

image-20230618151208189

数据冒险

image-20230618151243620

解决方法
前递

image-20230618151601721

编译重排

image-20230618151706080

停顿(气泡)

实在不行只能暂停流水线了

image-20230618151637437

控制冒险

image-20230619220308876

解决方法
硬件支持

image-20230619220259945

分支预测
  1. 遇到分支预测就停顿

  2. 分支预测

    1. 静态分支预测

      image-20230618153106322

    2. 动态分支预测

      image-20230618153125295

流水线数据通路和控制

流水线数据通路

流水线寄存器

image-20230618154028950

image-20230618154608423

66666,这个帅

image-20230618154815411

流水线控制

数据冒险:前递与停顿

前递

分类

前递有两种情况:

image-20230618155952018

前递产生条件
  1. RegWrite != 0(写有效)
  2. Rd != x0
解决方法

流水线寄存器解决:

image-20230618160141827

并且增加前递所需硬件。

停顿

流水线寄存器解决:

  1. 置ID/EX寄存器中控制信号为0(防止寄存器和存储器被写入数据),执行空指令nop

  2. 禁止PC寄存器和IF/ID寄存器内容改变

    下一条指令就能重新取指

控制冒险

image-20230618161320779

image-20230618161333487

缩短分支延迟的方法:

硬件支持

image-20230618161429557

动态分支预测

image-20230618161807387

image-20230618161932429

计算目标地址

image-20230618162114338

流水线的多发技术

img

img

超流水技术要求一个时钟周期内不同的指令不能相互叠加干扰。

img

意思就是多条指令并成一条,有公共的取指、译码、写回阶段,但是执行阶段各不相同且并行执行,应该是这样。

例外和中断

概述

image-20230618162247586

内部的一定是例外,外部的只有IO请求和硬件故障是中断

image-20230618162302149

image-20230618162437636

image-20230618162500928

哦哦哦WOC!!!!!

这让我想起来在做xv6的时候,的那个kerneltrap和usertrap,应该就是这里的这个统一入口地址。

xv6是RISC-V架构,故而发生中断的时候,就会跳转到统一的kernel trap,然后再在里面通过scause进行读取。666

不过盘问了下gpt,RISC-V对于exception和interruption的处理方式是不一样的:

在RISC-V中,异常通常是由于程序执行过程中的错误或非预期事件而引起的,包括故障(faults)、陷阱(traps)和中止(aborts)。中断(interrupts)则是由外部事件触发的,例如定时器到期、外部设备请求等。中断是异步事件,与当前正在执行的指令无关,因此会在任何时候发生。

例外是通过统一入口地址处理,中断则是中断向量的方式

流水线中的例外

image-20230618163521639

微操作(X86)

X86将一条指令的执行分为多个微操作。

一、微操作命令分析

微操作命令是控制单元在完成一大条指令时所需要细分完成的一条条微小的命令

image-20230621201435702

  1. 取值周期

    image-20230621201345807

  2. 间址周期

    image-20230621201351939

  3. 执行周期 ①访存指令 ②非访存指令 ③转移指令 ④三类指令的指令周期

    image-20230621201358396

    imgimg

    image-20230621201423245

  4. 中断周期 硬件法和软件法

    imgimg

    硬件和软件法。

二、控制单元的功能

  1. 输入信号

    ①时钟信号 ②指令寄存器【控制信号与操作码有关】 ③标志 ④外来信号【中断请求、总线请求】

  2. 输出信号

    ①CPU内各种控制信号【比如(PC)+1->PC这种】

    ②送至控制总线的信号【比如中断响应、总线响应】

  3. 控制信号举例

    ①不使用内部总线

    ②采用内部总线

  4. 多级时序系统

    1. 机器周期

      取指周期=机器周期=最复杂的微操作所需时间【访存】

      在机器周期内部也需要有时钟来控制微操作的执行顺序

    2. 时钟周期(节拍、状态)

      每个指令周期都可分为若干个机器周期,每个机器周期都可分为若干个节拍(时钟周期)。一个机器周期内包含多少节拍与需要发送多少控制信号、控制信号复杂度、控制信号能否并行有关。

      时钟产生节拍信号,不同的节拍信号有不同的先后顺序。

      一个时钟周期产生一个或几个【并行的几个,或者是操作时间很短,虽然有一定的先后顺序,但可以在一个节拍内完成】微操作命令

      时钟信号利用上升沿让CU发出控制命令【微操作】控制各个不同部件。

  5. 控制方式

    ①同步控制方式 采用定长的机器周期、不定长的机器周期、中央控制和局部控制相结合

    ​ 当指令大多都是可以提前确定的,就用同步。当一条微操作的时间很难控制,可以采用异步控制。

    ②异步控制方式 等待IO读写

    ③联合控制方式 同步与异步结合

    ④人工控制

三、组合逻辑设计

  1. 组合逻辑控制单元框图

    ①CU外特性 ②节拍信号

  2. 微操作的节拍安排

    ①安排微操作时序的原则

    原则一:先后顺序不更改。

    原则二:可以并行执行的,且微操作间没有先后顺序的,就尽量把它们安排在一个节拍中。

    原则三:时间较短微操作尽量在一个节拍内且可以有先后顺序。

    ②取值周期间址周期执行周期的

    image-20230621201709245

    image-20230621201717225

    image-20230621201722561

    image-20230621201732549

存储器

概述

分类

image-20230618183618033

层次结构

寄存器分为两类,体系结构寄存器和非体系结构寄存器。前者可以让程序员调度使用,后者不行。

image-20230618183742599

image-20230618183845067

主存储器

概述

基本组成

MAR中的地址需要经过译码器才能得到对应存储体中的位置。MDR中的数据是读是写需要通过读写电路控制,读写电路接收控制电路的读写信号。

image-20230618184214916

与CPU连接

image-20230618211118255

小端模式

image-20230618211717123

技术指标

image-20230618211918511

半导体存储芯片简介

基本结构

image-20230618212044462

image-20230618212116854

译码驱动方式

线选法

image-20230618212207454

重合法

image-20230618212227553

RAM 随机存取存储器

DRAM和SRAM

image-20230618222428159

SRAM

基本电路

image-20230621193330855

核心就是利用****触发器(T1—T4)****来表示0和1的

用T5和T6行开关来控制对触发器部件读写,用T7和T8列开关……【对应上面说的重合法?】

写入要在A段写入数据,同时在A’段写入数据的非【因为触发器是双稳态的,要求两边输入的信号相反。】对应的,写选择那边输入数据也得对称经过门和非门。

经典芯片

image-20230618212447162

读写

img

上面的部分是64*64的基本电路矩阵。我们按列分,每十六列为一组,则分成了四组。因为2^4=16,因而我们用四位来表示地址控制信号。

对于行,当地址控制信号为0000时,表示选择存储矩阵的第一行的数据,为0001时,选择第二行的……依此类推。

对于列,当地址控制信号为0000时,表示选择每一组的第一列的数据,为0001时,选择第二列的……依此类推。

每一组只能有一列被选中,这就达到了一次读写四位的目的。【一个字节分开存】

DRAM

基本电路

主要是通过电容的充放电实现的

img

左侧三管那个中,读数据线读出的跟存储的是相反的,存0读1,存1读0.但写入跟输入的信息是相同的。

右侧单管中,读出时数据线有电流则是1,没有则是0.写入时,对Cs充电则为1,Cs放电(输入信号为低电平)则为0.

image-20230618215704699

经典芯片/读写

image-20230618215803608

img

14位的地址分了两次传,分别作为行列地址。

RAS:行选控制信号 CAS:列选控制信号 WE:读写控制信号。产生的时钟控制了芯片内部的读写操作

img

如果读放大器左边有电,那么右边输出没电;左没电右有电.这样,读放大器左边的部分,有电表示0,没电表示1 ;读放大器右边的部分,有电表示1,没电表示0.

刷新

为什么要刷新:

image-20230619224003589

集中刷新

image-20230618221439701

分散刷新

image-20230618221603727

异步刷新

image-20230618222049113

ROM 只读存储器

  1. 掩膜ROM(MROM) 用户不能修改

    image-20230618222716561

  2. PROM(一次性编程) 破坏性编程

    image-20230618223116398

  3. EPROM(多次性编程)

    image-20230618223151914

  4. EEPROM(电可擦写)

    image-20230618223229585

  5. Flash Memory(闪速型存储器)

    image-20230618223252821

存储器与CPU的连接

存储器容量的扩展

位扩展

image-20230618224638384

字扩展

image-20230618224745584

带了片选思想

位字扩展

image-20230618224955557

存储器与CPU的连接

存储器的校验

image-20230620221830055

汉明码组成

image-20230620222021345

image-20230620222133679

image-20230620222301502

n为数据的位数

image-20230620222225994

image-20230620222518156

汉明码纠错

image-20230620222951821

跟组成的步骤是一样的

提高访存速度的措施

image-20230618233156234

image-20230618233234559

image-20230618233325427

image-20230619224341497

image-20230618233855438

不过这里也帅得一批,非常有那种从小到大的抽象思维在。

之前的单独一块RAM芯片,一个字节是分开存;这里的一个主存堆,一个块是分主存存。

Cache 高速缓冲存储器

概述

image-20230618233726163

技术指标

image-20230618233800847

image-20230618234113714

因为在一个存取周期当中,每体都可以取一个字,16体就可以取16字,因而一个存取周期可以取出16个字出来。

image-20230618234151529

但是这个公式前提是访问cache和主存并行。如果换用另一个策略,即先看cache有没有,没有再去主存,计算公式就不一样。

Cache的读写操作

img

cache接收CPU发来的地址信号。CPU发出的地址中的块内地址无需转换,而块号需要通过主存cache地址映射变换机构转化成cache内的块号。【所以说CPU访问cache的时候,传给cache的地址是主存的物理地址吧?然后再通过主存cache地址映射转化为cache的块内地址。】

如果命中,则转换机构工作,传递地址给cache存储体,存储体通过数据总线发送信号。

如果不命中,并且cache没装满,则发送信号给主存。

如果不命中,且cache装满了,则cache替换机构使用替换算法,淘汰cache中一些块,同时发送信号给主存。

主存收到信号,在数据总线上发给cpu要的东西之后,再将所在块发给cache

image-20230621193732489

image-20230618234639119

image-20230618234752772

Cache-主存映射

直接映射

image-20230618234904098

image-20230618234921789

全相联映射

image-20230618235007647

组相联映射

image-20230618235147739

缓存替换算法

image-20230618235750985

改进

现在很多处理器至少有三级cache。比如每个核一个cache,多个核还有一个公用的cache。

流水线计算机很多都分了指令cache和数据cache,避免资源冲突。

注意,每个层次的cache采用的映射可能不一样。

靠近CPU采用直接相连或者路数(r)少的组相连【其实直接相连就相当于是一路的组相联了】。中间的用组相联。距离CPU较远的用全相联。

距离越远,对速度要求越低,对利用率要求越高。

虚拟存储器

与Cache的差异

image-20230619000944183

虚拟存储器

image-20230618235955557

image-20230619000042556

相当于把主存-辅存(磁盘)看成另一个cache-主存。这也就类似于内存页面换入换出了。原来这玩意叫虚拟存储器啊,不过这也类似于虚拟地址空间的叫法就是了。

image-20230619000208477

image-20230619000304314

页表结构

image-20230619000428020

访问流程

image-20230619000542665

TLB

image-20230619000628910

image-20230619000804374

image-20230619000827244

image-20230619000851370

辅助存储器

硬盘、U盘、软盘、磁带、光盘

RAID

image-20230619142112318

image-20230619142148621

image-20230619143428427

image-20230619143411577

系统总线

概述

是啥

总线两个特点:分时共享

遵循协议标准,方便计算机系统集成、扩展和进化

总线的猝发传输方式:在一个总线周期内,传输存储地址连续的多个数据字的总线传输方式。

分类

image-20230618173335493

image-20230618173414845

总线结构

单总线

注意,单总线是默认统一编址的?

image-20230618175005524

面向CPU的双总线

image-20230618175035406

存储器为中心

image-20230618175435591

有通道的多总线结构

image-20230618175533637

image-20230618175631552

image-20230618175705273

image-20230618175743501

总线控制

总线判优控制

image-20230618180345695

image-20230618180704321

注意,独立请求是最快的

链式查询

所有设备可在BR线发布总线请求,主设备通过BG线表态,争得总线的设备要通过BS线告诉其他设备总线忙。

BG线中,总线同意信号会依次遍历每一个设备,直到找到第一个提出请求的设备。

可见,这个遍历顺序就代表了各个IO设备的优先级顺序。

这样相当于分离出格外的线来控制信号。这种方式对电路故障非常敏感。

image-20230618180431836

计数器定时查询

意思好像是,在BR线提出请求,主设备接收到请求后,可以响应的情况下,启动计数器,计数器初始值为零。计数器的值通过设备地址线输出。如果计数器为0,则观察接口0有没有请求,没有的话计数器++,继续看下一个,以此类推,直到找到第一个对应接口,则开始传输数据,BS线启用。

设备地址线需要给所有设备地址进行编码,因此宽度与设备数有关。

这个的优点在于,优先级的确定更加灵活了。比如说,计数器不一定从零开始而是从上一次停止的地方开始(循环优先级,这样的话每个设备的机会均等),或者用软件控制优先级初始值,或者每一次不一定++而是有其他计算规则。

image-20230618180602116

独立请求方式

优先级由主设备内部逻辑(排队器)规定。也可以用自适应、计数器等等等。

image-20230618180645765

总线通信控制

image-20230618180848436

这玩意传输周期还考了

image-20230618180912414

这个通信方式有哪几种也要求默写了

image-20230618181827840

这个同步和异步的特点总结得很棒

同步、异步、半同步三者的共同点:

image-20230618181948854

同步

img定宽定距的时钟

白色菱形代表有地址、命令、数据;紫色阴影代表没有东西

数字电路中,数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。

有固定的时间点,和在每个固定时间点固定要做的事

第一部分:主设备要给出地址信号

第二部分:给出读命令(控制信号)

第三部分:从设备传输数据给主设备

第四部分:读命令、数据信号撤销

第五部分:地址信号撤销

img

*先给数据能保证命令到达立刻写入正确数据。菱形那段表示电平并非瞬间稳定*

*如果数据是并行就先给数据,再给读写信号,直接锁存;如果是串行数据,就先给读写信号,再给数据*

有固定的时间点,和在每个固定时间点固定要做的事

第一部分:主设备要给出地址信号

第二部分:主设备给出数据信号

第三部分:主设备给出写入信号

第四部分:写入

第五部分:读命令、数据信号撤销

第六部分:地址信号撤销

同步通信通常只适用于总线长度短的。

因为是并行总线,总线长度长了很难做到等长,到达设备后就不同步了

因为需要统一时标;总线长,需要迁就最远的设备;读写时间差距大,需要迁就最慢的设备

异步

image-20230618181416220

不互锁

CPU从主存读信息

主要用在单机不同设备之间的通信中

半互锁

多机系统中,某个CPU需要访问共享存储器时

全互锁

主要用于网络通信,如TCP三握手

半同步通信

输入数据为例:

image-20230618181924196

分离式通信

在子周期2中,从模块实际上从从模块变成了主模板,因为它发起了占用总线的请求。

image-20230618182050912

IO

概述

发展概况

image-20230619144243913

image-20230619144359313

image-20230619144452679

组成

image-20230619144602504

① IO指令

操作码相当于标志,标志这个指令是IO的。命令码才算是操作码,指出对IO设备做什么。设备码给出IO设备或者设备中某一个寄存器【端口】的编址。

② 通道指令

通道是小型DMA处理器,可以实现IO设备与主机之间进行信息交互。

通道有自己的控制器,有的通道还有存储器。

通道能够执行由通道指令组成的通道程序。

通常情况下,编程人员在应用程序当中,为了调用外部设备,应用程序中需要增加广义IO指令【这意思是封装吧】。广义IO指令要指出参加数据传输的IO设备、数据传输主存的首地址、传输数据的长度、传输方向。操作系统根据广义IO指令给出的参数以及要求的操作,会编写一个由通道指令组成的通道程序,并且会把程序放到内存或者是通道内存的指定位置,之后启动通道进行工作。

连接方式

编址

image-20230619144651480

选址和传送

image-20230619144727325

联络方式

image-20230619144851937

image-20230619145010236

连接方式

image-20230619145037444

控制方式

image-20230619145313853

程序查询方式

image-20230619145133293

程序中断方式

image-20230619145154206

image-20230619145214775

DMA方式

image-20230619145252864

外部设备

概述

image-20230619145414624

IO接口

概述

image-20230619151239077

功能和组成

image-20230619151310223

image-20230619151421396

image-20230619151442848

接口类型

image-20230619151602920

程序查询方式

image-20230619151713642

image-20230619152130068

image-20230619152909693

程序中断方式

中断

概述

image-20230619153352974

image-20230619153557165

接口电路

image-20230619153715848

中断请求触发器和中断屏蔽触发器

image-20230619153949008

image-20230619154445642

中断分类

外部中断一般是由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。

外部中断一般指io高低电平(下降沿等由寄存器配置)来触发并响应io中断函数。

接口电路

排队器

image-20230619155014803

image-20230619155029933

硬件实现

image-20230619155054248

以下介绍的是链式排队器

  1. INTR默认为0,取非为1. 经&后整个排队电路为1
  2. 当i设备发出请求,INTRi=1,取非为0,经&后变为0,INTPi之后的电路清零,只有i之前的INTP为1
  3. 3在一连串的显示为 1 的INTP中,最后一个显示1的设备优先级最高。因为按照我们的分析,是它发出了请求

使用与非+非而不是直接与门是因为与非门+非更便宜。

我猜这个意思是,链式排队的话,越前面的优先级越高,现在我们讲的是怎么快速****找出****最高的最前面的是哪一个。之所以为什么越前面的优先级最高,可从这个电路中得知。如果一个东西发出请求,那么它后面的INTPi’都会被置零,因而它肯定比它后面的高级。因此越前面的优先级越高。

https://www.likecs.com/show-390301.html

img

这个可以验证我的观点。至于这个轮询方式,应该在第三章的总线那边讲过,应该用的是链式查询。

软件实现

程序查询

image-20230619155116410

中断向量形成部件

硬件向量法

image-20230619155154822

软件查询法

image-20230619161630629

接口电路组成

image-20230619161803883

应该意思就是,参照上面那个程序电路图,首先CPU先发送一个启动IO设备的命令,然后就去忙了。

与此同时,IO接口接到命令开始准备,比如说对DBR的整理【因读写而异】。

IO接口准备完之后会卡在INTR那边,等待CPU的中断查询信号。

CPU本来一直在不断边干自己的活边发送中断查询信号【在每条指令执行阶段的结束前】,终于逮到这个时候发现IO接口已经准备好了,就回复中断响应信号,CPU进入中断周期,执行中断隐指令。

IO接口发出中断请求后就排好队选好设备了,收到CPU的中断响应信号,就给CPU发向量地址,CPU根据地址去内存中找到中断服务程序并开始执行,之后就可以开始数据传输了。

可见这个过程是异步的。

中断响应(中断处理过程)

image-20230619162001376

image-20230619162057309

IO中断处理过程

image-20230619162142239

image-20230619201800980

单重/多重中断服务流程(CPU)

image-20230619201934346

image-20230619202014591

image-20230619202106846

中断屏蔽技术(CPU)

image-20230619202207357

image-20230619202219859

image-20230619202321781

image-20230619202355070

image-20230619202434146

DMA方式

特点

image-20230619202548302

实现方案

image-20230619202628150

沙比

image-20230619202708423

image-20230619202739633

功能和组成

image-20230619202841809

image-20230619203043097

工作过程

DMA传送过程

预处理、数据传送、后处理

image-20230619203248171

注意还有个传送字数,看来有点安全设定。如果溢出了就需要中断

image-20230619203423482

image-20230619203535039

连接方式

image-20230619204520342

image-20230619204537086

与程序中断比较

image-20230619204641555