计算机组成原理笔记(四)
五、指令系统
1.指令格式
指令字:表示一条指令的机器字,简称指令
指令格式:用二进制代码表示指令的结构形式
指令需要解决的问题:
操作数——指令要求计算机处理什么数据;
操作码——指令要求计算机对数据做什么处理;
寻址方式——计算机怎样才能得到要处理的数据
指令格式的具体构成
- 操作码字段长度决定指令系统规模
- 每条指令对应一个操作码
- 定长操作码:$Length_{OP}=\lceil log_2n\rceil$
- 变长操作码:操作码向不用的地址码字段扩展
- 操作数字段可能有多个
- 寻址方式字段:长度与寻址方式种类有关,也可能隐含在操作码字段
- 地址码字段:作用及影响、长度和寻址方式有关
- 操作码字段长度决定指令系统规模
指令字长度
- 指令字长度:指令中包含二进制代码的位数
- 字长与机器字的长度有关: 单字长,双字长,半字长
- 指令字越长,地址码长度越长,可直接寻址空间越大
- 指令字越长,占用空间越大,取指令越慢
- 定长指令: 结构简单,控制线路简单,如$MIPS$指令
- 变长指令: 结构灵活,充分利用指令长度,控制复杂,如$X86$指令
指令地址码
- $3$种指令操作码部分不得重叠,否则无法区分;
- 设双操作数地址码长度为$8$,每个操作数的长度为$12$,双地址指令数为$k$, 显然$k<2^8$,则$2^8-k$为多余状态,可用于表示其他类型指令,即可用于单操作数指令的条数为$(2^8-k)*2^{12}$,$2^{12}$是多余$12$位组合;
- 例:设某指令系统指令字长$16$位,每个地址码为$6$位。若要求设计二地址指令$15$条、一地址指令$34$条,则最多还可设计多少条零地址指令。
2.寻址方式
(1)指令寻址
①顺序寻址
- 程序计数器$(PC)$对指令序号进行计数
- 程序计数器对程序员可见
- $PC$存放下条指令地址,初始值为程序首址
- 执行一条指令时,$PC$=$PC$+当前指令字节长度
- 综上,也即$Mem[PC++]\rightarrow IR$
②跳跃寻址
- 下条指令地址不是$PC++$得到,而是由指令本身给出
- 跳跃的处理方式是重新修改$PC$的内容,然后进入取指令阶段
- 注意偏移量可能为正,也可能为负,偏移量应以$PC++$后的值计算
(2)操作数寻址
立即寻址:地址码字段是操作数本身
如$MOV\enspace AX,38H$对应指令如下:
寄存器寻址:操作数在$CPU$的内部寄存器中
如$PUSH\enspace AX$对应指令如下:
直接寻址:地址码字段直接给出操作数在内存的地址
如$INC\enspace [200]$对应指令如下:
间接寻址:$D$单元的内容是操作数地址, $D$是操作数地址的地址
如下图示意:
寄存器间接寻址:$D$单元的内容是操作数的地址,$R$是操作数地址的地址
如$INC\enspace [BX]$对应指令如下:
相对寻址:指令中的$D$加上$PC$的内容作为操作数的地址
基址$/$变址寻址:操作数地址为基址$/$变址寄存器$+$偏移量
如$MOV\enspace AX,32[SI]$对应指令如下:
- 基址寄存器一般不修改
- $SI,DI$都称为变址寄存器
寻址对比
寻址方式举例
3.指令格式设计
设计步骤
- 根据指令规模及是否支持操作码扩展,确定操作码字段长度
- 根据对操作数的要求确定地址码字段的个数
- 根据寻址方式的要求,为各地址码字段确定寻址方式字段长度
- 确定定长指令还是变长指令
设计举例
字长$16$位,主存$64K$,指令单字长单地址,$80$条指令。寻址方式有直接、间接、相对、变址。请设计指令格式。
某机字长$32$位,采用三地址指令,支持$8$种寻址操作,完成$60$种操作,各寻址方式均可在$2K$主存范围内取得操作数,并可在$1K$范围内保存运算结果。问应采用什么样的指令格式?指令字长最少应为多少位?执行一条直接寻址模式指令最多要访问多少次主存?
分析以下指令格式及寻址方式特点?
- 1)二地址指令;
- 2)操作码可指定$16$条指令;
- 3)源和目的均有$8$种寻址方式;
- 4)源地址寄存器和目的地址寄存器均有$8$个;
- 5)可寻址范围为$1\sim 64K$(与机器字长有关)
4.$MIPS$指令系统
(1)$CISC$与$RISC$
- $CISC$ $(Complex\enspace Instruction\enspace System\enspace Computer)$
- 复杂指令系统计算机;
- 指令数量多,指令功能,复杂的计算机;
- $Intel\enspace X86$
- $RISC(Reduced\enspace Instruction\enspace System\enspace Computer)$
- 精简指令系统计算机;
- 指令数量少,指令功能单一的计算机;
- $1982$年后的指令系统基本都是$RISC$;
- $MIPS,RISC-V$
- $RISC$的特点
- 指令条数少,只保留使用频率最高的简单指令,指令定长
- 便于硬件实现,用软件实现复杂指令功能
- $Load/Store$架构
- 只有存/取数指令才能访问存储器,其余指令的操作都在寄存器之间进行
- 便于硬件实现
- 指令长度固定,指令格式简单、寻址方式简单
- 便于硬件实现
- $CPU$设置大量寄存器$(32\sim 192)$
- 便于编译器实现
- 一个机器周期完成一条机器指令
- $RISC\enspace CPU$采用硬布线控制,$CISC$采用微程序
- 指令条数少,只保留使用频率最高的简单指令,指令定长
(2)$MIPS$指令概述
(3)$MIPS$寻址方式
立即数寻址
寄存器直接寻址
基址寻址
- 使用基址寻址的指令:$lw ,sw, lh, sh, lb, lbu$等
相对寻址
- 使用用相对寻址的指令:$beq, bne$
伪直接寻址(页面寻址)
- 使用伪直接寻址的指令:$j,jal$
(3)$R$型指令
- 指令格式
- 指令举例
(3)$I$型指令
指令格式
指令举例
(4)$J$型指令
七、输入输出系统
1.外设与I/O接口
输入输出设备是计算机与人或者机器系统进行数据交互的装置,用于实现计算机内部二进制信息与外部不同形式信息的转换,简称外部设备或外设
计算机的输入/输出系统
- 包括外部设备、接口部件、总线以及相应的管理软件,简称$I/O$系统
- 保证$CPU$能够正确选择$I/O$设备并实现对其控制,与数据传输
- 利用数据缓冲、合适的数据传送方式,实现主机外设间速度匹配
$I/O$接口
连接总线与$I/O$设备的物理和逻辑界面
既包括物理连接电路,也包括软件逻辑接口
所有设备均通过$I/O$接口(总线接口)与总线相连
$CPU$使用设备地址经总线与$I/O$接口通信访问$I/O$设备
$I/O$接口编址
- 统一编址
- 内存映射编址$(Memory-mapped)$
- 外设地址与内存地址统一编址,同一个地址空间
- 不需要设置专用的$I/O$指令
- 采用访存指令访问外设,具体访问什么设备取决于地址
- 如$MIPS$指令系统
- 独立编址
- 端口映射编址$(Port-mapped)$
- $I/O$地址空间与主存地址空间相互独立
- $I/O$地址又称为$I/O$端口
- 不同设备中的不同寄存器和存储器都有唯一的端口地址
- 使用$I/O$指令访问外设
- 如$X86$指令系统中的$OUT$和$IN$指令
- 统一编址
$I/O$接口软件
- 现代计算机中用户必须通过操作系统间接访问设备,屏蔽设备细节,使用更方便
- 与$OS$无关的$I/O$库 (用户态)
- 如$C$语言中的标准$I/O$库$stdio.h$
- printf、scanf、getchar、putchar、fopen、fclose等
- 用户程序主要通过调用$I/O$库访问设备,方便程序在不同$OS$间移植
- 与设备无关的$OS$调用库(内核态)
- open、read、write、seek、ioctl、close
- 独立的设备驱动程序(内核态)
- 设备驱动程序是与设备相关的$I/O$软件部分
- 不同设备对应不同的驱动程序
- 遵循具体设备的$I/O$接口约定,包含设备接口细节
2.程序查询方式
程序查询方式中$CPU$与$I/O$设备的交互完全通过$CPU$执行程序完成;
程序查询方式分为独占查询和定时查询;
独占查询方式
- 假设$CPU$执行某用户程序时,需要访问$I/O$设备;
- 这时,$CPU$通过对$I/O$设备发送命令参数以启动设备;
- 设备收到启动命令后,开始相对于$CPU$速度而言很漫长的数据准备过程;
- 从启动设备到设备就绪的时间,$CPU$只能反复读取设备的状态寄存器,判断设备是否就绪;
- 如果没有就绪则继续读取状态字,这种方式称为轮询等待$(busy-waiting)$;
- 一旦设备就绪,用户程序就可以通过相应的$I/O$指令读取特定端口中的数据,完成实际的数据传输;
- 一次轮询只能完成一个数据单元的传输;
- $CPU$浪费了大量的时间进行查询,对于慢速设备,这种方式并不合适;
- 而对于高速设备或者简单设备,这种方式较为合适。
定时查询方式
- 应用定时中断技术;
- 当$CPU$启动设备时,同时启动一个定时器;
- 设备准备数据的过程中,$CPU$不再轮询等待,而是进行进程调度,将当前进程加入$I/O$等待队列,并调度新的用户进程$P_2$运行;
- 定时器时间到时,产生定时中断,定时中断会触发$CPU$中断用户进程$P_2$或者其他进程,而去执行定时中断服务程序;
- 中断服务程序的任务是查询设备状态,如果设备没有准备就绪,继续启动新的定时中断,如果设备准备就绪,则唤醒进程$P_1$,中断服务完毕,继续执行用户进程$P_2$;随着时间片的轮转,用户进程$P_1$会被进程调度程序重新调度运行,该程序会完成实际数据传输。
- 需要设定定时中断的计时时长
3.程序中断方式
(1)工作原理
- 提高了$CPU$的使用效率
- 主动告知机制避免了反复查询设备状态
- 仍需$CPU$占用(中断服务子程序运行时间+中断开销)
- 适合随机出现的服务
- 需要专门的硬件
(2)中断实现
①中断原理
- $CPU$暂时中止现行程序的执行,转去执行为某个随机事件服务的中断处理子程序,处理完后自动恢复原程序的执行;
- 中断执行时间:一条指令执行完毕后进入公操作,以检查是否需要响应中断
②中断处理流程
③中断优先级
多设备同时产生中断请求时,如何处理?
优先级高的先响应,优先级低的后响应
$CPU$优先级随不同中断服务程序而改变
执行某设备中断服务子程序,$CPU$优先级就与该设备的优先级一样
中断嵌套:优先级高的中断请求可以中断优先级低的程序
举例:设优先级$A>B>C$
单级中断
多重中断
划分优先级的规律
- 硬件故障中断属于最高级,其次是程序错误中断
- 非屏蔽中断优先于可屏蔽中断
- $DMA$请求优先于$I/O$设备传送的中断请求
- 高速设备优先于低速设备
- 输入设备优先于输出设备
- 实时设备优先于普通设备
④中断屏蔽
响应优先级
- $CPU$对各设备中断请求进行响应,并准备好处理的先后次序
- 这种次序在硬件线路上已固定,不便变动
处理优先级
- $CPU$实际对各中断请求处理的先后次序
- 如果不使用屏蔽技术,响应的优先次序就是处理的优先次序
- 中断屏蔽技术可动态改变各设备的处理优先级
中断屏蔽方式
- 中断请求寄存器$IRR$
- 对应位为$1$表示相应外设发出了中断请求
- 中断字,中断码
- 中断屏蔽寄存器$INM$
- 对应位为$1$表示对相应设备设置屏蔽,否则取消屏蔽
- 每个设备都有自己独立的中断屏蔽字
- $CPU$执行某设备的中断服务子程序时将其中断屏蔽字载入$INM$
- 不可屏蔽中断不受中断屏蔽寄存器的控制
- 中断允许触发器$IE$
- 允许中断源中断$CPU$
- 屏蔽码
- 控制各设备接口的屏蔽触发器,可改变处理次序
- 屏蔽码的每一位都表示对某个设备是否进行屏蔽
- 运行某个设备的中断服务程序时载入对应的屏蔽码
- 某设备的屏蔽码中的$1$的个数越多,表示处理优先级越高
- 中断请求寄存器$IRR$
⑤中断仲裁
同一时刻可能有多个设备同时发出中断请求,响应哪个中断源?
- 链式查询
- 独立请求
- 中断控制器方式
- 分组链式结构
请求方式
- 独立请求:向量中断
- 将服务程序入口(中断向量)组织在中断向量表中;
- 硬件查询法:响应时由硬件直接产生中断号(向量地址),查中断向量表取得服务程序入口,转入相应服务程序。
- 中断共享:非向量中断
- 将服务程序入口组织在查询程序中;
- 程序识别法:响应时执行查询程序查询中断源,查询特定端口$(GPIO)$识别中断源
- 独立请求:向量中断
⑥中断处理实现
中断处理中的问题
- 中断响应条件
- 中断允许触发器$IE=1$
- 对应的中断未被屏蔽
- 无更高优先级的$DMA$请求
- 中断嵌套必须优先级更高
- 指令已经执行完最后一个机器周期
- 保证指令执行的完整性
- 缺页异常的处理时机与此不同
- 保存现场,恢复现场
- 中断程序用到的通用寄存器,$EPC$,屏蔽字
- 缺页异常的断点和外部中断断点不一致
- 中断过程由软硬件结合完成
- 中断响应条件
中断控制器
中断控制器处理流程
4.$DMA$方式
(1)基本概念
- $DMA$方式与中断方式
- 中断方式
- 传送一个数据执行一次中断服务子程序(几十条指令)
- 效率低下,不适合于高速传输的系统
- $DMA$方式
- 外设与主存间建立一个由硬件管理的数据通路
- 这个数据通路是虚拟通路,仍通过系统总线进行数据传输
- $CPU$不介入外设与主存的数据传送操作
- 减少$CPU$开销,提升效率
- 二者的区别
- 中断通过程序传送数据,$DMA$靠硬件来实现
- 中断时机为两指令之间,$DMA$响应时机为两存储周期之间
- 中断不仅具有数据传送能力,还能处理异常事件,$DMA$只能进行数据传送
- $DMA$仅挪用了一个存储周期,不改变$CPU$现场
- $DMA$请求的优先权比中断请求高
- $CPU$优先响应$DMA$请求,是为了避免$DMA$所连接的高速外设丢失数据
- $DMA$利用了中断技术
- 中断方式
- $DMA$方式下的访存冲突
- 冲突原因
- $DMA$控制器直接访问内存
- $CPU$执行主程序,也需要访问内存
- 处理冲突
- 停止$CPU$使用主存
- $DMA$传送数据时,$CPU$停止使用主存
- 一批数据传送结束后,$DMA$再交还主存使用权
- $DMA$传送过程中,$CPU$处于等待状态
- $DMA$批量数据传输周期过长,$CPU$长期无法访问内存
- 由于总线一次只能传输一个机器字,因此批量传输时需要循环传输
- 由于外设的访问时间较慢,外设传送两个数据之间存在时间间隔
- 而这个时间间隔大于存储周期,总线和内存未充分利用
- $DMA$与$CPU$交替使用主存
- 每个存储周期分成两段
- 一段用于$DMA$访问主存
- 一段用于$CPU$访问主存
- 无主存使用权移交过程
- 每个存储周期分成两段
- 周期挪用法
- $DMA$要求访问主存时,$CPU$暂停一个或多个存储周期;
- 一个数据传送结束后,$CPU$继续运行;
- $CPU$现场没有变动,仅延缓了指令的执行;
- 如发生访存冲突,则$DMA$优先访问
- 停止$CPU$使用主存
- 冲突原因
(2)$DMA$传输
$DMA$控制器
$DMA$传输流程
准备阶段($CPU$干预)
主机通过$CPU$指令向$DMA$接口发送必要的传送参数,并启动$DMA$工作。
- 数据传送的方向
- 数据块在主存的首地址
- 数据在外设存储介质上的地址
- 数据的传送量
传输阶段($CPU$不干预)
宏观上,$DMA$是连续传送一批数据;微观上,每传送一个数据,发一次$DMA$请求。
- 设备准备数据:当设备接收到$CPU$的$DMA$命令后就可以开始准备数据;
- 设备发送$DMA$请求:数据准备就绪后,通过$DREQ$控制线向$DMAC$发出$DMA$请求;
- $DMAC$申请总线:$DMAC$收到$DMA$请求后立即将$HOLD$信号置$1$,向$CPU$申请总线控制权;
- 总线授权:$CPU$在机器周期结束后响应总线使用申请,让出总线控制权,并发出总线授权信号$HLDA$通知 $DMAC$;
- $DMA$数据传输:收到$HLDA$信号将内存地址放置在地址总线上,设置控制总线读写命令控制信号,并向设备$DMA$发送应答信号$DACK$,设备收到$DACK$信号后会和内存完成一个机器字的数据交换;
- 传输控制:设备传输完一次数据后会继续重复第$1$步到第$5$步的工作,$DMAC$在每次传输时还需要负责维护内存地址和传输计数器,并撤除$HOLD$信号释放总线;
- 数据传输结束:$DMAC$会通过$INTR$信号线发送一个$EOP(End\enspace Of\enspace Process)$的$DMA$中断请求信号,告知$CPU$传输完成
结束阶段($CPU$干预)
- $DMA$在两种情况下都进入结束阶段
- 正常结束,一批数据传送完毕
- 非正常结束,$DMA$故障
- 结束阶段$DMA$向主机发出中断请求
- $CPU$执行中断服务程序
- 查询$DMA$接口状态,根据状态进行不同处理
- $DMA$在两种情况下都进入结束阶段