概述
架构
冯诺依曼
以运算器为中心,指令和数据同等地位(不满足摩尔定律)
存储器为中心
哈佛架构
哈佛结构数据空间和程序空间是分开的
大部分ROM操作部分是采用了冯诺依曼结构,
有些需要CPU与ROM之间快速的响应和交互,采用的是5级流水的哈佛结构。
早期(如X86)采用冯诺依曼
DSP和ARM用改进哈佛
现代计算机
RISC-V
数的表示
无符号数与有符号数
机器数与真值
意思就是真值有±符号,机器数把±符号换成了数字罢了
原码/补码/反码/移码
原码
整数用逗号隔开,小数用小数点隔开
整数
小数
注意0的特殊情况
补码
对于负数,原码->补码符号位不变,数值位按位取反再加一的理论由来。神奇的是对于补码->原码,也是按位取反再加一。
简单证明一下:
设x为补码,y为原码,n为位数
已知 x = !(y - 2^n) +1
则反转一下可得 y = !(x - 1) + 2^n
符号位不变,按位取反再加一
整数
小数
特殊
[y]补连同符号位在内,每位取反末位加1,即得**[-y]补**
后面那三个是真的抽象
反码
对于正数,反码和原码一致;
对于负数,反码为原码的数值位取反
整数
小数
0
移码
注意,移码只有整数形式的定义,这与它的用途有关。计算机中,移码通常用来标识浮点数的阶码【阶码是整数】。
与补码数值位计算方式相同,区别是符号位相反
注意,移码的0为100000,最小值为000000
浮点表示
表示形式和范围
注意,这边的上溢和下溢只与阶码有关,与尾数无关。
这个溢出条件及其处理方式需要记,会考
规格化
特例
范围
题型 表示范围
看得我cpu快烧了
https://www.jianshu.com/p/7b9dd240685c
之所以最小负数不一样,是因为原码不能表示-1,补码可以;
之所以规格化最大负数是那玩意,是因为最大负数本应为2^-8,为了规格化必须再加个2^-1,然后原码转补码就变成那样了
IEEE754标准
难绷,最沙比的来了
没有阶符和数符力
它就相当于指数是移码表示的,并且注意到一点就是指数的0和255被征用表示特殊的数了,所以指数范围为1-254
题型 把数转化为IEEE754
首先背一下上面那个数的范围图,然后判断下是规格化还是非规格化,然后套公式就行了
算术移位与逻辑移位
来自 https://blog.csdn.net/qq_34283722/article/details/107093193 :
这应该与补码的运算机制有关。
反码不论是左还是右都添1
注意,符号位不变!!!这点在左移的时候需要尤其注意,很容易出错
RISC-V概述
ISA
ISA位宽:通用寄存器的宽度,决定了寻址范围大小、数据运算强弱。
CISC-RISC
X86 & MIPS
相比于上述的差异,还有以下几个:
- x86有8个通用寄存器,MIPS有32个
- x86有标志寄存器,MIPS没有
- x86为两地址指令,MIPS为三地址
- x86有堆栈指令,MIPS没有
- x86有IO指令,MIPS设备统一编址
- x86函数参数只用栈帧,MIPS用4寄存器+栈帧
- X86的字为2字节,MIPS/RISC-V的字为4字节
RISC-V的特点
RISC-V是小端,也即低字节放在低地址
支持字节(8位)、半字(16位)、字(32位)、双字(64位,64位架构)的数据传输
主存按照字节进行编址
采用哈佛结构
三种特权模式
模块化设计
RISC-V汇编语言
寄存器
x3的全局指的是全局的静态数据区
指令详解
算术指令
RISC-V 忽略溢出问题,高位被截断,低位写入目标寄存器
如果想要保留乘法所有位:
逻辑指令
移位指令
shift left logical,shift left arithmetic
数据传输
ld/sd,lw/sw,lh/sh(半字,也即2字节),lb/sb,以及load指令对应的无符号数(+后缀u)版本。
bAddrReg+offset为4的倍数,数据传输指令除了字节指令(lb sb lbu)外都需要按字对齐。
注意,如果为有符号数取数,放入寄存器时会自动进行符号扩展。
比较指令
条件跳转指令
无条件跳转指令
j:+label,用于实现无条件跳转,使用相对于当前 PC(程序计数器)的偏移量来计算目标地址,跳转范围较广
jr:+寄存器,用于实现通过寄存器的值进行跳转,跳转的目标是存储在寄存器中的地址,而不是相对于 PC 的偏移量
伪指令
函数调用及栈的使用
六种指令格式
注意,jalr属于I型指令,而非J型指令!!!
R型指令
I型指令
特例1 load
特例2 jalr
注意,jalr也属于I型指令,且其funct3为0
S型指令
B型指令
这个计算过程很值得注意
U型指令
666
J型指令
寻址方式(x86)
尽管A很小,但可以让EA很大,从而扩展寻址范围。同时相对于上面的直接寻址,它更容易编程,因为只用修改A存储的那个地址值,而不用修改指令【比如说对数组进行循环,这个间接寻址就只用A++就行,而不用去修改指令里的那个“A”。】。
That is 指针【】
至于为啥间接寻址不便于循环,也许是因为间接寻址是访存两次比较慢,要是真用来循环还了得
程序动态定位
循环数组时,可以用A作为数组地址,IX作为数组下标???【为什么不能用基址寻址?】
应该是因为基址寻址的基址是系统内定的,数组循环问题需要用户指定数组起始地址,所以不能用基址寻址,只能用面向用户的变址寻址。
区别就在于直接寻址直接把指令参数****硬编码在内存****中,非常耗费空间。变址寻址则把指令参数作为变量了。
更应该像是指令寻址方式。
程序浮动:程序在内存单元的位置出现变化【毕竟不可能同一个程序在每台电脑都是在同一个物理地址,相当于又减少了硬编码】
【为2002H是因为假设字长为2byte】
一般栈顶地址最低。
运算方法
定点运算
一位乘法运算
原码一位乘
大致明白了:
①乘积一共有四位,故而需要两个寄存器来保存。
②按照上面的原理公式,每次右移一位,被移出的那一位也是最后的结果(相当于竖式中每次相加的最后一位),需要把它存储在另一个寄存器中。
③我们选择了存乘数的寄存器,因为乘数已经乘过的位是没用的。存乘数的那个寄存器的乘数不断被结果的低位所替代。
故****基本流程****:
①准备阶段:清零ACC【置部分积=0】,在MQ中放乘数,X中放被乘数
②判断MQ中乘数最低位,若为1,则ACC部分积加上X中的被乘数;若为0,则ACC不变
③将ACC和MQ中四位数字视作一个整体,符号位也算上,进行逻辑右移,左侧补0.
④重复上述过程,按移位次数来控制结束。
⑤则最后,ACC中存储的就是乘法结果的高位,MQ中存储的结果就是乘法中的低位。
这其实就是我们用的列竖式一行一行加起来的一个过程。
S是符号位,GM是乘法标志位。
控制门:当最后一位是1时,控制门打开,X中的被乘数进入加法器。
部分积 乘数
乘数不用符号位,写数值位即可
按照是0是1,要么+被乘数要么+0
右移(连符号位一起逻辑右移)
直到乘数全部移完
Booth算法
部分积 乘数 y补(一开始为0)
部分积双符号位,乘数单符号位且参与运算
每次依据乘数和y补的关系,进行是否加被乘数的决策:
注意右移不同于原码,是算术右移
最后一步不用移位
除法运算
逻辑左移
最后得到的余数还得乘个2的-n次方
恢复余数法
- 被除数(余数) 商
- 先加上 - 除数的补
- 如果得到结果≥0,则上商1,左移
- 如果小于0,则上商0,+除数补,左移
- 左移5次(商包括符号位的所有数字被填满),最后一次上商不用移位
不恢复余数法(加减交替法)
总结一下,大概流程:
①准备阶段:MQ清零【存放商】,ACC放入被除数,X放入除数
②ACC - X中的值
③若ACC中值【上一轮的余数】为负,则上商0;为正,则上商1.ACC左移一位。判断MQ的最后一位【上商的值】,若为负,则ACC + X中的y;为正,ACC - X中的y。【注意,若为第一次减去X,则当余数为正时,就即刻发生溢出错误退出】
④重复③,直到移位n次。
V表示是否溢出。
被除数(余数) 商
先加上 - 除数的补
如果得到结果≥0,则上商1,左移,下一次继续加 - 除数的补
如果小于0,则上商0,左移,下一次加除数的补
逻辑左移
左移5次(商包括符号位的所有数字被填满),最后一次上商不用移位
浮点运算
舍入
(1)意思是,舍去的要是1,就在保留数+1.如果是0就直接舍去。
这意思难道是说可以一次性右移,最后再看要不要+1,而不是移一下加一次1?【不过想了一下,这两种顺序得到的结果好像是一样的。】
快速进位链
以及老师在这讲的也挺好的【p88】
当AiBi都为1时,无论Ci是什么,都必定进位1;当AiBi有一个为1时,Ci才会起决定性作用;当AiBi都为0时,无论Ci是什么,都不会进位。因此,AiBi为本地进位,Ai+Bi为传送条件。(乘号表示且,加号表示或)
进位链是影响加法器速度的瓶颈
但问题是电路太复杂了,因此给出折中方案:
4先产生进位,传给3,3再产生进位,传给4,依次下去。
相当于又套了一层并行进位链。
实在是太强了。感受到还要再套一层分组的必要性了。
处理器
RISC-V数据通路的组件选择
RISC CPU采用哈佛架构。
存储器
DM Data Memory 数据存储器
读异步,写有写使能
IM Instruction Memory 指令存储器
一般read only
寄存器堆
同步写异步读
立即数扩展(生成)部件
零扩展、符号扩展
PC(程序计数器)
支持两种加法:+4、+立即数
ALU
【以下运算器结构适用于累加型运算器。累加器好像意思是一次最多两个输入。 】
运算器的功能是运算,因此其核心就是ALU(算术逻辑单元)。ALU是一个组合电路,组合电路的特点是,如果输入撤销了,那么输出结果也会撤销【组合逻辑电路】。因而,为了让ALU的结果能被保存,必须在输入端加上两个寄存器来保证信号持续输入。这两个寄存器一个叫做ACC,另一个叫做x,也叫做数据寄存器。
MQ也是寄存器,用于保存计算过程中溢出的位数。
具体见第六章,弹幕说汇编语言也有讲。乘法要这样放是为了防止乘积低位覆盖乘数。
ACC里存放着上面的操作或者与外部交流得到的被乘数,按照约定需要转移到X里。我猜M放在MQ而不是ACC,可能是因为第一二步是并行的,如果放在ACC就需要一些等待。
并且乘法做的是移位累加【可能相当于上面乘法原理的第一个图吧】,ACC用来存储这些累加的暂时交换成果,因而需要将ACC先清空为0.
这些操作的先后顺序由控制器进行控制。
MQ也称乘商寄存器
运算类型:加、减、或、比较、slt、nor
操作数:寄存器或立即数
RISC-V部分指令的数据通路设计
取数指令的完成过程
下面是取数指令的完成过程。
完成一条指令有三个阶段:取指令、分析指令、执行指令。
取指令:PC把地址送到MAR,MAR把地址送到存储体。存储体在控制器的控制下,把地址所对应的指令的内容发给MDR,MDR把取出的指令送到IR.
分析指令:IR将指令的操作码部分交予CU,CU控制IR,IR将指令中的地址码部分交予MAR,MAR给存储体,存储体在控制器控制下给MDR,MDR送给ACC。
【这个过程正像是计算机网络,只不过此处全靠硬件完成,计算机网络只能依靠协议】
流水线周期
RISC-V
注意,在ID阶段还会发生读寄存器
X86
一、指令周期
- 基本概念
① 指令周期
② 每条指令的指令周期不同
ADD取指阶段和执行阶段都需要一次访存
③ 具有间接寻址的指令周期
三个周期各需要访存一次。【****现在暂时还不知道这有毛用****】
④ 具有中断周期的指令周期
⑤ 指令周期的流程
⑥ CPU工作周期的标志
指令周期的不同阶段,控制器要做不同的操作,要发出不同的命令。因而,控制器需要知道当前处于指令周期的哪一个阶段。
用四个触发器
- 指令周期的数据流
① 取指周期
首先,PC把自己里面存的地址放进MAR,再通过地址总线传输给存储器。
CU通过控制总线向存储器发出读控制信号。
存储器执行读操作,通过数据总线传输取到的指令给MDR,MDR再传给IR。
CU把加一后的地址保存在PC中,为下一条指令取指做准备。
② 间址周期
如果指令的数据部分采用的是间接寻址的方式,那么此时,MDR中的地址部分不是有效地址,而是存储存储有效地址的存储单元的地址值。因而,我们需要再通过一次访存操作,把有效地址值存储在MDR中。
③ 执行周期
留给第九章介绍。
④ 中断周期
做了三件事:保存断点、形成服务程序入口地址、中断返回
首先,保存断点。由CU来确定断电保存在内存单元的哪里。CU把地址传给MAR,MAR将其发到存储器,CU给存储器写命令。PC将自己的值【也就是下一条要执行的命令的地址值】交付给MDR,MDR传给存储器。【MDR在读写操作时都充当了缓冲区的角色。】
然后,CU形成中断服务程序入口地址,并直接把它写入到CU。
流水线处理器
流水线概述
流水线
这点我觉得讲得挺好的。以前只知道流水线通过并行来加速指令执行,但这里给出了一个新的思路:如果是单周期处理器,则RISC-V的时钟周期受执行时间最长的指令限制;如果是流水线处理器,时钟周期就可以由某个步骤决定,主频就可以加快。这个出发点很有意思。
如果流水线各阶段平衡,也即每个阶段需要的执行时间差不多,则
也即在理想条件和有大量指令的情况下,流水线带来的加速比约等于流水线的级数,若各阶段不完全平衡,加速比会变小。
流水线技术是通过提高指令的吞吐率来提高性能的。
RISC-V与流水线
我们可以看到,比起X86,RISC-V是面向流水线设计的,其特性与流水线高度相关:
指令长度相同
简化IF和ID
只有六种指令格式,格式整齐
能在一个阶段内完成译码和读寄存器(ID)
只通过load、store访存
可以利用EX阶段计算存储器地址,然后在下一阶段访存(MEM)
流水线冒险
结构冒险
数据冒险
解决方法
前递
编译重排
停顿(气泡)
实在不行只能暂停流水线了
控制冒险
解决方法
硬件支持
分支预测
遇到分支预测就停顿
分支预测
静态分支预测
动态分支预测
流水线数据通路和控制
流水线数据通路
流水线寄存器
66666,这个帅
流水线控制
数据冒险:前递与停顿
前递
分类
前递有两种情况:
前递产生条件
- RegWrite != 0(写有效)
- Rd != x0
解决方法
流水线寄存器解决:
并且增加前递所需硬件。
停顿
流水线寄存器解决:
置ID/EX寄存器中控制信号为0(防止寄存器和存储器被写入数据),执行空指令nop
禁止PC寄存器和IF/ID寄存器内容改变
下一条指令就能重新取指
控制冒险
缩短分支延迟的方法:
硬件支持
动态分支预测
计算目标地址
流水线的多发技术
超流水技术要求一个时钟周期内不同的指令不能相互叠加干扰。
意思就是多条指令并成一条,有公共的取指、译码、写回阶段,但是执行阶段各不相同且并行执行,应该是这样。
例外和中断
概述
内部的一定是例外,外部的只有IO请求和硬件故障是中断
哦哦哦WOC!!!!!
这让我想起来在做xv6的时候,的那个kerneltrap和usertrap,应该就是这里的这个统一入口地址。
xv6是RISC-V架构,故而发生中断的时候,就会跳转到统一的kernel trap,然后再在里面通过scause进行读取。666
不过盘问了下gpt,RISC-V对于exception和interruption的处理方式是不一样的:
在RISC-V中,异常通常是由于程序执行过程中的错误或非预期事件而引起的,包括故障(faults)、陷阱(traps)和中止(aborts)。中断(interrupts)则是由外部事件触发的,例如定时器到期、外部设备请求等。中断是异步事件,与当前正在执行的指令无关,因此会在任何时候发生。
例外是通过统一入口地址处理,中断则是中断向量的方式
流水线中的例外
微操作(X86)
X86将一条指令的执行分为多个微操作。
一、微操作命令分析
微操作命令是控制单元在完成一大条指令时所需要细分完成的一条条微小的命令
取值周期
间址周期
执行周期 ①访存指令 ②非访存指令 ③转移指令 ④三类指令的指令周期
中断周期 硬件法和软件法
硬件和软件法。
二、控制单元的功能
输入信号
①时钟信号 ②指令寄存器【控制信号与操作码有关】 ③标志 ④外来信号【中断请求、总线请求】
输出信号
①CPU内各种控制信号【比如(PC)+1->PC这种】
②送至控制总线的信号【比如中断响应、总线响应】
控制信号举例
①不使用内部总线
②采用内部总线
多级时序系统
机器周期
取指周期=机器周期=最复杂的微操作所需时间【访存】
在机器周期内部也需要有时钟来控制微操作的执行顺序
时钟周期(节拍、状态)
每个指令周期都可分为若干个机器周期,每个机器周期都可分为若干个节拍(时钟周期)。一个机器周期内包含多少节拍与需要发送多少控制信号、控制信号复杂度、控制信号能否并行有关。
时钟产生节拍信号,不同的节拍信号有不同的先后顺序。
一个时钟周期产生一个或几个【并行的几个,或者是操作时间很短,虽然有一定的先后顺序,但可以在一个节拍内完成】微操作命令
时钟信号利用上升沿让CU发出控制命令【微操作】控制各个不同部件。
控制方式
①同步控制方式 采用定长的机器周期、不定长的机器周期、中央控制和局部控制相结合
当指令大多都是可以提前确定的,就用同步。当一条微操作的时间很难控制,可以采用异步控制。
②异步控制方式 等待IO读写
③联合控制方式 同步与异步结合
④人工控制
三、组合逻辑设计
组合逻辑控制单元框图
①CU外特性 ②节拍信号
微操作的节拍安排
①安排微操作时序的原则
原则一:先后顺序不更改。
原则二:可以并行执行的,且微操作间没有先后顺序的,就尽量把它们安排在一个节拍中。
原则三:时间较短微操作尽量在一个节拍内且可以有先后顺序。
②取值周期间址周期执行周期的
存储器
概述
分类
层次结构
寄存器分为两类,体系结构寄存器和非体系结构寄存器。前者可以让程序员调度使用,后者不行。
主存储器
概述
基本组成
MAR中的地址需要经过译码器才能得到对应存储体中的位置。MDR中的数据是读是写需要通过读写电路控制,读写电路接收控制电路的读写信号。
与CPU连接
小端模式
技术指标
半导体存储芯片简介
基本结构
译码驱动方式
线选法
重合法
RAM 随机存取存储器
DRAM和SRAM
SRAM
基本电路
核心就是利用****触发器(T1—T4)****来表示0和1的
用T5和T6行开关来控制对触发器部件读写,用T7和T8列开关……【对应上面说的重合法?】
写入要在A段写入数据,同时在A’段写入数据的非【因为触发器是双稳态的,要求两边输入的信号相反。】对应的,写选择那边输入数据也得对称经过门和非门。
经典芯片
读写
上面的部分是64*64的基本电路矩阵。我们按列分,每十六列为一组,则分成了四组。因为2^4=16,因而我们用四位来表示地址控制信号。
对于行,当地址控制信号为0000时,表示选择存储矩阵的第一行的数据,为0001时,选择第二行的……依此类推。
对于列,当地址控制信号为0000时,表示选择每一组的第一列的数据,为0001时,选择第二列的……依此类推。
每一组只能有一列被选中,这就达到了一次读写四位的目的。【一个字节分开存】
DRAM
基本电路
主要是通过电容的充放电实现的
左侧三管那个中,读数据线读出的跟存储的是相反的,存0读1,存1读0.但写入跟输入的信息是相同的。
右侧单管中,读出时数据线有电流则是1,没有则是0.写入时,对Cs充电则为1,Cs放电(输入信号为低电平)则为0.
经典芯片/读写
14位的地址分了两次传,分别作为行列地址。
RAS:行选控制信号 CAS:列选控制信号 WE:读写控制信号。产生的时钟控制了芯片内部的读写操作
如果读放大器左边有电,那么右边输出没电;左没电右有电.这样,读放大器左边的部分,有电表示0,没电表示1 ;读放大器右边的部分,有电表示1,没电表示0.
刷新
为什么要刷新:
集中刷新
分散刷新
异步刷新
ROM 只读存储器
掩膜ROM(MROM) 用户不能修改
PROM(一次性编程) 破坏性编程
EPROM(多次性编程)
EEPROM(电可擦写)
Flash Memory(闪速型存储器)
存储器与CPU的连接
存储器容量的扩展
位扩展
字扩展
带了片选思想
位字扩展
存储器与CPU的连接
存储器的校验
汉明码组成
n为数据的位数
汉明码纠错
跟组成的步骤是一样的
提高访存速度的措施
不过这里也帅得一批,非常有那种从小到大的抽象思维在。
之前的单独一块RAM芯片,一个字节是分开存;这里的一个主存堆,一个块是分主存存。
Cache 高速缓冲存储器
概述
技术指标
因为在一个存取周期当中,每体都可以取一个字,16体就可以取16字,因而一个存取周期可以取出16个字出来。
但是这个公式前提是访问cache和主存并行。如果换用另一个策略,即先看cache有没有,没有再去主存,计算公式就不一样。
Cache的读写操作
cache接收CPU发来的地址信号。CPU发出的地址中的块内地址无需转换,而块号需要通过主存cache地址映射变换机构转化成cache内的块号。【所以说CPU访问cache的时候,传给cache的地址是主存的物理地址吧?然后再通过主存cache地址映射转化为cache的块内地址。】
如果命中,则转换机构工作,传递地址给cache存储体,存储体通过数据总线发送信号。
如果不命中,并且cache没装满,则发送信号给主存。
如果不命中,且cache装满了,则cache替换机构使用替换算法,淘汰cache中一些块,同时发送信号给主存。
主存收到信号,在数据总线上发给cpu要的东西之后,再将所在块发给cache。
读
写
Cache-主存映射
直接映射
全相联映射
组相联映射
缓存替换算法
改进
现在很多处理器至少有三级cache。比如每个核一个cache,多个核还有一个公用的cache。
流水线计算机很多都分了指令cache和数据cache,避免资源冲突。
注意,每个层次的cache采用的映射可能不一样。
靠近CPU采用直接相连或者路数(r)少的组相连【其实直接相连就相当于是一路的组相联了】。中间的用组相联。距离CPU较远的用全相联。
距离越远,对速度要求越低,对利用率要求越高。
虚拟存储器
与Cache的差异
虚拟存储器
相当于把主存-辅存(磁盘)看成另一个cache-主存。这也就类似于内存页面换入换出了。原来这玩意叫虚拟存储器啊,不过这也类似于虚拟地址空间的叫法就是了。
页表结构
访问流程
TLB
辅助存储器
硬盘、U盘、软盘、磁带、光盘
RAID
系统总线
概述
是啥
总线两个特点:分时和共享
遵循协议或标准,方便计算机系统集成、扩展和进化
总线的猝发传输方式:在一个总线周期内,传输存储地址连续的多个数据字的总线传输方式。
分类
总线结构
单总线
注意,单总线是默认统一编址的?
面向CPU的双总线
存储器为中心
有通道的多总线结构
帅
总线控制
总线判优控制
注意,独立请求是最快的
链式查询
所有设备可在BR线发布总线请求,主设备通过BG线表态,争得总线的设备要通过BS线告诉其他设备总线忙。
BG线中,总线同意信号会依次遍历每一个设备,直到找到第一个提出请求的设备。
可见,这个遍历顺序就代表了各个IO设备的优先级顺序。
这样相当于分离出格外的线来控制信号。这种方式对电路故障非常敏感。
计数器定时查询
意思好像是,在BR线提出请求,主设备接收到请求后,可以响应的情况下,启动计数器,计数器初始值为零。计数器的值通过设备地址线输出。如果计数器为0,则观察接口0有没有请求,没有的话计数器++,继续看下一个,以此类推,直到找到第一个对应接口,则开始传输数据,BS线启用。
设备地址线需要给所有设备地址进行编码,因此宽度与设备数有关。
这个的优点在于,优先级的确定更加灵活了。比如说,计数器不一定从零开始而是从上一次停止的地方开始(循环优先级,这样的话每个设备的机会均等),或者用软件控制优先级初始值,或者每一次不一定++而是有其他计算规则。
独立请求方式
优先级由主设备内部逻辑(排队器)规定。也可以用自适应、计数器等等等。
总线通信控制
这玩意传输周期还考了
这个通信方式有哪几种也要求默写了
这个同步和异步的特点总结得很棒
同步、异步、半同步三者的共同点:
同步
定宽定距的时钟
白色菱形代表有地址、命令、数据;紫色阴影代表没有东西
数字电路中,数字电平从低电平(数字“0”)变为高电平(数字“1”)的那一瞬间(时刻)叫作上升沿。数字电平从高电平(数字“1”)变为低电平(数字“0”)的那一瞬间叫作下降沿。
有固定的时间点,和在每个固定时间点固定要做的事
第一部分:主设备要给出地址信号
第二部分:给出读命令(控制信号)
第三部分:从设备传输数据给主设备
第四部分:读命令、数据信号撤销
第五部分:地址信号撤销
*先给数据能保证命令到达立刻写入正确数据。菱形那段表示电平并非瞬间稳定*
*如果数据是并行就先给数据,再给读写信号,直接锁存;如果是串行数据,就先给读写信号,再给数据*
有固定的时间点,和在每个固定时间点固定要做的事
第一部分:主设备要给出地址信号
第二部分:主设备给出数据信号
第三部分:主设备给出写入信号
第四部分:写入
第五部分:读命令、数据信号撤销
第六部分:地址信号撤销
同步通信通常只适用于总线长度短的。
因为是并行总线,总线长度长了很难做到等长,到达设备后就不同步了
因为需要统一时标;总线长,需要迁就最远的设备;读写时间差距大,需要迁就最慢的设备
异步
不互锁
CPU从主存读信息
主要用在单机不同设备之间的通信中
半互锁
多机系统中,某个CPU需要访问共享存储器时
全互锁
主要用于网络通信,如TCP三握手
半同步通信
输入数据为例:
分离式通信
在子周期2中,从模块实际上从从模块变成了主模板,因为它发起了占用总线的请求。
IO
概述
发展概况
组成
① IO指令
操作码相当于标志,标志这个指令是IO的。命令码才算是操作码,指出对IO设备做什么。设备码给出IO设备或者设备中某一个寄存器【端口】的编址。
② 通道指令
通道是小型DMA处理器,可以实现IO设备与主机之间进行信息交互。
通道有自己的控制器,有的通道还有存储器。
通道能够执行由通道指令组成的通道程序。
通常情况下,编程人员在应用程序当中,为了调用外部设备,应用程序中需要增加广义IO指令【这意思是封装吧】。广义IO指令要指出参加数据传输的IO设备、数据传输主存的首地址、传输数据的长度、传输方向。操作系统根据广义IO指令给出的参数以及要求的操作,会编写一个由通道指令组成的通道程序,并且会把程序放到内存或者是通道内存的指定位置,之后启动通道进行工作。
连接方式
编址
选址和传送
联络方式
连接方式
控制方式
程序查询方式
程序中断方式
DMA方式
外部设备
概述
IO接口
概述
功能和组成
接口类型
程序查询方式
程序中断方式
中断
概述
接口电路
中断请求触发器和中断屏蔽触发器
中断分类
外部中断一般是由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。
外部中断一般指io高低电平(下降沿等由寄存器配置)来触发并响应io中断函数。
接口电路
排队器
硬件实现
以下介绍的是链式排队器
- INTR默认为0,取非为1. 经&后整个排队电路为1
- 当i设备发出请求,INTRi=1,取非为0,经&后变为0,INTPi之后的电路清零,只有i之前的INTP为1
- 3在一连串的显示为 1 的INTP中,最后一个显示1的设备优先级最高。因为按照我们的分析,是它发出了请求
使用与非+非而不是直接与门是因为与非门+非更便宜。
我猜这个意思是,链式排队的话,越前面的优先级越高,现在我们讲的是怎么快速****找出****最高的最前面的是哪一个。之所以为什么越前面的优先级最高,可从这个电路中得知。如果一个东西发出请求,那么它后面的INTPi’都会被置零,因而它肯定比它后面的高级。因此越前面的优先级越高。
https://www.likecs.com/show-390301.html
这个可以验证我的观点。至于这个轮询方式,应该在第三章的总线那边讲过,应该用的是链式查询。
软件实现
程序查询
中断向量形成部件
硬件向量法
软件查询法
接口电路组成
应该意思就是,参照上面那个程序电路图,首先CPU先发送一个启动IO设备的命令,然后就去忙了。
与此同时,IO接口接到命令开始准备,比如说对DBR的整理【因读写而异】。
IO接口准备完之后会卡在INTR那边,等待CPU的中断查询信号。
CPU本来一直在不断边干自己的活边发送中断查询信号【在每条指令执行阶段的结束前】,终于逮到这个时候发现IO接口已经准备好了,就回复中断响应信号,CPU进入中断周期,执行中断隐指令。
IO接口发出中断请求后就排好队选好设备了,收到CPU的中断响应信号,就给CPU发向量地址,CPU根据地址去内存中找到中断服务程序并开始执行,之后就可以开始数据传输了。
可见这个过程是异步的。
中断响应(中断处理过程)
IO中断处理过程
单重/多重中断服务流程(CPU)
中断屏蔽技术(CPU)
DMA方式
特点
实现方案
沙比
功能和组成
工作过程
DMA传送过程
预处理、数据传送、后处理
注意还有个传送字数,看来有点安全设定。如果溢出了就需要中断