• 1 概述 collapsed:: true
    • 层次结构
      • 冯·诺依曼结构
        • 输入设备
        • 输出设备
        • 存储器
        • 运算器
        • 控制器
    • 计算机软件
      • 三个级别的语言
        • 机器语言 - 唯一能被计算机直接执行的语言
          • 注意: 硬件描述语言(HDL)不是机器语言, 仍需经过综合工具转换为门级网表后才能在硬件上运行
        • 汇编语言
        • 高级语言
      • 两类软件
        • 系统软件
        • 应用软件
      • 编译流程
        • 预处理
        • 编译
        • 汇编
        • 链接
      • 软件和硬件逻辑功能具有等价性
    • 性能指标
      • 基本指标
        • 机器字长
        • 存储容量
        • 吞吐量: 系统在单位时间内处理请求的数量
      • 运算性能相关指标
        • 时钟频率
        • 时钟周期
        • 指令周期
        • CPI
        • IPC
        • MIPS
        • FLOPS
      • 考点 #🕳 有坑
        • CPU的速度提高50% , 程序执行时间减少多少?
          • 假设指令条数M, CPI为C, 原CPU时钟频率为, 则原执行时间
          • 提高50%后, 新时钟频率, 新执行时间
          • 程序执行时间减少
    • 单位制
      • 国际单位制SI
        • k (10^3)
        • M (10^6)
        • G (10^9)
        • T (10^12)
        • P (10^15)
        • E (10^18)
        • Z (10^21)
      • 二进制单位制
        • Ki (2^10)
        • Mi (2^20)
        • Gi (2^30)
  • 2 数据表示和运算 collapsed:: true
    • 进制转换
      • 二 八 十六 进制相互转换
        • 8421法
      • 任意进制转十进制
        • 按权展开
      • 十进制转任意进制 #🤔 考前记
        • 除基取余法 (整数部分)
          • 余数部分逆序排列
        • 乘基取整法 (小数部分)
          • 整数部分顺序排列
    • 原反补移
      • 补码
        • 补码的范围
          • n位补码表示的整数范围:
        • 求补码
          • 正数: 原码 = 反码 = 补码
          • 负数: 反码 = 原码符号位不变, 其他位取反; 补码 = 反码 + 1
          • 扫描法
            • 从低位向高位扫描, 遇到第一个1后, 该1及其低位不变, 其余位取反
          • 求补码对应相反数的补码: 全部按位取反再加1
        • 补码求真值
          • 正数: 补码 = 真值
          • 负数: 真值 = 补码取反再加1,然后加负号
          • 按权展开, 最高位权值为负
            • 例如1001 =
    • 浮点数表示
      • 基数大小对表示范围和精度的影响
        • 基数越大, 表示范围越大, 精度越低
        • 基数越小, 表示范围越小, 精度越高
      • IEEE 754标准
        • 单精度32位
          • 符号位1位, 阶码位8位, 尾数位23位
            • 阶码采用移码, 偏移量为127
            • 阶码范围: -126 ~ +127 (0~255中除去全0和全1再减去偏移量127)
        • 双精度64位
          • 符号位1位, 阶码位11位, 尾数位52位
        • 规格化浮点数表示形式
            • S: 符号位
            • M: 尾数 (隐含1)
            • E: 阶码 (无符号整数)
            • Bias: 偏移量 (单精度127, 双精度1023)
        • 特殊值表示
          • 非规格化数: 阶码全0, 尾数非0
          • 零: 阶码全0, 尾数全0, 符号位区分正负零
          • 无穷大: 阶码全1, 尾数全0, 符号位区分正负无穷大
          • NaN: 阶码全1, 尾数非0, 表示未定义或不可表示的值
        • 考点
          • 几种最值的大小
            • 最小规格化正数: 尾数最小(全0), 阶码最小(1), 符号位0
            • 最大规格化正数(最大的规格化数): 尾数最大(全1), 阶码最大(254), 符号位0
            • 最小规格化负数(最小的规格化数): 尾数最大(全1), 阶码最大(254), 符号位1
            • 最大规格化负数: 尾数最小(全0), 阶码最小(1), 符号位1
          • 非规格化数的真值
    • 浮点数运算
    • C语言数据类型 collapsed:: true
      • 数据类型及其存储空间
        • 1 字节: char, unsigned char
        • 2 字节: short, unsigned short
        • 4 字节: int, unsigned int, float
        • 8 字节: long long, unsigned long long, double
      • 数据类型转换
        • 隐式类型转换
          • 低精度向高精度转换 #🕳 有坑
            • 源类型为有符号类型: 符号位扩展; 无符号类型: 零扩展
              • short si = -32767		// si = 0x8001 
                unsigned int ui = si;	// 先隐式整型提升 ii = 0xFFFFFFFF8001
                						// 然后强制类型转换, ui = ii
          • 有符号向无符号转换
        • 强制类型转换
        • 特殊转换
          • float到double: 精度不变
          • double到float: 可能丢失精度
          • int到float: 可能丢失精度, 尾数最多23位
          • int到double: 精度不变, 尾数位数足够
          • float/double到int: 小数部分截断
    • 移位运算
      • 逻辑移位: 空位补0
      • 算术移位: 右移时空位补符号位
      • 循环移位: 移出位重新补入另一端
    • 定点数加减法
      • 补码加减法
        • 加法: 直接按位相加, 忽略最高位的进位
        • 减法: 将减法转为加法, 即加上被减数相反数的补码(全部按位取反再加1)
      • 溢出检测 id:: 69394b42-0e23-4a63-a7be-4d90872fd418
        • 双符号位
          • 结果双符号位相同 - 无溢出
          • 结果双符号位不同 - 01 正溢出, 10 负溢出
        • 单符号位
          • 结果判断法
            • 两正数相加结果为负 - 正溢出
            • 两负数相加结果为正 - 负溢出
          • 操作数判断法(硬件采用)
            • 为符号位的进位, 为最高数值位的进位
            • 则溢出
              • 正溢出
              • 负溢出
      • 标志位
        • 进位标志CF: 无符号数减法时借位, 加法时进位取1, 否则取0
        • 溢出标志OF: 有符号数运算溢出
        • 零标志ZF: 结果为0取1, 非0取0
        • 符号标志SF: 结果为负取1, 结果为正取0
      • 硬件实现
        • 一位全加器
          • 输入: 两个加数位A,B, 进位Cin
          • 输出: 和S, 进位Cout
        • 串行进位加法器(延迟高)
          • 逐位计算, 进位传递
        • 基于补码的串行加法器
          • 添加加数的取反器和最低位加1电路
          • 执行减法时, 加数通过取反器全部位取反, 并在最低位加1
        • 先行进位加法器(延迟低)
          • 并行计算各位的进位
          • 使用生成进位函数和传递进位函数
    • 定点数的乘法 #🤔 考前记
      • 无符号数乘法原理
        • 将乘法按权展开为若干加法右移操作
        • 当部分积为0时, 可以省略加法操作
      • 实现方式
        • 没有乘法指令(最慢, 指令周期长)
          • 编译器通过循环加法和移位实现乘法
          • 即使乘数与被乘数都是变量, 也能够使用基于编译器实现的乘法
        • 基于ALU和移位实现的乘法指令(较慢)
        • 阵列乘法器(最快, 专有硬件)
    • 定点数的除法 #🤔 考前记
      • 无符号数除法原理
        • 恢复余数法
          • 将除法按权展开为若干减法左移操作
          • 每次左移后, 试图用除数去减被减数
            • 如果被减数大于等于除数, 商位为1, 并更新被减数
            • 否则商位为0, 并恢复被减数
          • 因此需要ALU支持减法, 加法和左移操作
        • 不恢复余数法
          • 与恢复余数法类似, 但不恢复被减数
          • 如果被减数小于除数, 则下一次左移前先加上除数
      • 除法异常情况 Y2025/T44
        • 除数为0: 产生异常中断
        • 被除数为最小负数, 除数为-1: 溢出(如-8/-1 = 8, 超出3位补码范围)
    • 浮点数运算
      • 浮点加减法
        • 对阶: 将阶码较小的数的尾数右移, 直到阶码相等(小阶向大阶看齐)
        • 尾数加减: 根据符号位决定加法或减法
        • 规格化: 调整结果的尾数和阶码, 使其符合规格化表示形式
          • 左移规格化: 尾数最高位为0, 左移尾数并减小阶码
            • 可能出现阶码下溢出
          • 右移规格化: 尾数溢出, 右移尾数并增大阶码
            • 可能出现阶码上溢出
          • {{embed ((69394b42-0e23-4a63-a7be-4d90872fd418))}}
        • 舍入: 对规格化后的尾数进行舍入处理,以保证运算结果的精度
          • 可能出现尾数溢出, 需再次规格化
            • 尾数进位 - 可能引起阶码增1 - 阶码上溢出
            • 尾数借位 - 可能引起阶码减1 - 阶码下溢出
          • 舍入方法
            • 截断法
            • 恒置1法
            • 0舍1进法
            • 最近偶数法: 当舍入位为1且后面有非零位时进1; 当舍入位为1且后面全为0时, 根据舍入位前一位决定进舍
        • 考点:
          • 两数相加减,可以直接舍弃低阶操作数的情况
            • 当阶码之差的绝对值大于尾数位数时(即差>24或53), 低阶操作数的尾数全部右移出范围, 可直接舍弃
      • 浮点乘法
        • 阶码相加: 将两个操作数的阶码相加, 并减去偏移量Bias
        • 尾数相乘: 将两个操作数的尾数相乘
        • 规格化和舍入: 对乘积进行规格化和舍入处理
        • 乘法指令溢出判断 #🤔 考前记
          • 对于字长为32位的计算机
            • 若x,y都为符号数
              • 乘积高32位非全0 - 溢出
            • 若x,y都为符号数
              • 乘积高33位相同 - 无溢出
              • 否则溢出
      • 浮点除法
        • 阶码相减: 将被除数的阶码减去除数的阶码, 并加上偏移量Bias
        • 尾数相除: 将被除数的尾数除以除数的尾数
        • 规格化和舍入: 对商进行规格化和舍入处理
    • 运算器设计
      • 算术逻辑单元ALU
      • 寄存器组
        • 通用寄存器
        • 累加器
        • 乘商寄存器
      • 状态寄存器
      • 控制电路
      • 数据总线
  • 3 存储系统
    • 基本概念 collapsed:: true
      • 存储器分类
        • 按存取方式: 随机存取存储器RAM, 顺序存取存储器SAM
        • 按易失性: 易失性存储器, 非易失性存储器
        • 按存储介质: 半导体存储器, 磁存储器, 光存储器
      • 存储器层次结构
        • 寄存器
        • 高速缓存Cache
        • 主存储器
        • 辅助存储器
      • 存储器性能指标
        • 存取时间
        • 周期时间
        • 容量
        • 成本
    • 主存储器 collapsed:: true
      • 存储芯片分类 #🕳 有坑
        • SRAM 静态随机存取存储器
          • MOS管
        • DRAM 动态随机存取存储器
          • 电容
          • 行列地址
            • 分两次送入地址
            • 列选/列选复用地址线, 且由于按行刷新, 应该尽量减少行数
          • 行缓冲器使用SRAM实现
          • 刷新方式
            • 集中刷新: 一次刷新所有行
            • 分散刷新
              • 把存取周期分成两段, 一段存取数据, 一段刷新行
              • 每个存取操作后绑定一个刷新操作
            • 异步刷新: 将刷新时间均匀分散到整个刷新周期
          • 数据预取
            • 读取某行数据时, 将该行数据读入行缓冲器
            • 后续对该行的访问直接从行缓冲器读取
        • ROM 只读存储器
          • 掩模ROM
          • 可编程ROM PROM
          • 可擦除可编程ROM EPROM
          • 电可擦除可编程ROM EEPROM
        • SSD 固态硬盘
      • 存储器的结构
        • 多模块并行存储器
          • 单体多字
            • 类似存储器的位扩展
            • 每次读按同一个地址并行读取不同模块的同一单元
          • 多体交叉存储
            • 高位交叉方式
              • 高位地址决定模块选择, 低位地址决定模块内单元
              • 各模块串行工作, 不能提高吞吐量
            • 低位交叉方式
              • 低位地址决定模块选择, 高位地址决定模块内单元
              • 各模块并行工作, 提高吞吐量
              • 访存冲突问题
                • 模块读取一个单元需要一个读取周期, 如果同时到来第二个请求, 则会产生冲突
            • 启动方式问题 #🤔 考前记
              • 轮流启动方式(模块字长等于总线宽度时)
                • 假设模块存取周期为, 总线周期为
                • 至少需要个模块
                • 每隔个总线周期启动一个模块
                • 可使读取速度提高
              • 同时启动方式(所有模块字长之和等于总线宽度时)
                • 每个总线周期同时启动所有模块, 读取1个完整的总线宽度数据
            • 考点
              • 参考 Y2013/T43 Y2012/T43
        • 与CPU的接口
          • 数据总线
            • 与MDR宽度相同
          • 地址总线 #🕳 有坑
            • 与MAR宽度相同
              • 实际主存容量不决定地址总线宽度
            • 决定最大寻址空间
          • 控制总线
        • 容量扩展技术
          • 位扩展: 增加数据总线宽度
          • 字扩展: 增加地址总线宽度
          • 字位扩展: 同时增加数据总线和地址总线宽度
      • 数据存放(字节序)
        • 大端方式: 低地址存放高位字节(MSB)
        • 小端方式: 低地址存放低位字节(LSB)
        • 机器代码中字节数据也需要按照机器字节序存放
      • 数据边界对齐
    • 外部存储器 collapsed:: true
      • 机械硬盘(温彻斯特硬盘) #🤔 考前记
        • 结构组成
          • 磁道: 同心圆轨道
          • 扇区: 每个磁道划分为若干扇区, 每个扇区存放固定字节数(通常512字节)
          • 柱面: 多个盘片叠加形成的柱面组
          • 簇: 文件系统分配存储空间的最小单位, 由若干连续扇区组成
        • 寻址方式
          • 柱面-盘面-扇区
          • 磁道-磁头-扇区
          • 簇号-簇内地址
        • 磁盘性能指标 id:: 693b708a-8e5d-4623-bace-e4ac36835532
          • 存取时间
            • 寻道时间
            • 旋转延迟时间: 平均为半圈时间
            • 扇区传输时间: 由数据传输率决定
              • 是扇区大小, 磁盘转速和磁道位密度的函数
      • SSD 固态硬盘
        • 随机访问性能优于机械硬盘
        • 读写寿命有限
        • 需要磨损均衡技术
    • 高速缓存Cache collapsed:: true
      • 读写策略
        • 读取过程
          • 命中: 直接从Cache读取数据
          • 未命中: 从主存读取数据到Cache, 然后再从Cache读取数据
        • 写入策略 #🤔 考前记
          • 写命中时
            • 直写法: 同时更新Cache和主存
            • 写回法: 只更新Cache, 只有在替换出Cache时才写回主存
          • 写未命中时
            • 写分配: 将数据块从主存读入Cache, 然后再写入Cache(通常配合写回法使用)
            • 非写分配: 直接写入主存(通常配合直写法使用)
              • 写穿不包分配
      • Cache地址映射
        • 直接映射
        • 全相联映射
        • 组相联映射
        • 比较器的位数和个数 #🤔 考前记
          • 位数: 映射方式中标记字段tag的位数
          • 个数: 直接映射时为1, 全相联映射时为Cache行数, 组相联映射时为每组行数(路数)
      • Cache替换算法
        • 先进先出FIFO
        • 最近最少使用LRU
          • cache行需要增加LRU计数字段, 宽度为位, 其中为组内行数(路数)
        • 最少使用LFU
          • 需要访问计数器
          • 不能严格反应最近使用情况
        • 最佳替换OPT
          • 理论上最优, 实际中不可实现
        • 随机替换
      • Cache分类
        • 分离Cache: 数据Cache和指令Cache分开设计
          • 好处: 主要目的减少冲突, 还能提高并行度 Y2014/T16
        • 多级Cache
    • 虚拟存储器 collapsed:: true
      • 基本概念
        • 虚拟地址(逻辑地址): CPU发出的地址, 为程序在虚拟存储空间中的地址
        • 物理地址(实地址): 存储器使用的地址, 为数据在实际存储器中的地址
        • 地址转换
          • 由内存管理单元MMU完成
          • TLB阶段: 根据虚拟地址查找TLB, 在MMU之前
            • 每次访存, 必然会先访问TLB(查询页表缓存)
          • cache阶段: 根据物理地址访问Cache, 在MMU之后
        • 虚拟存储技术
          • 通过地址映射页面置换实现逻辑地址到物理地址的转换
          • 允许程序使用比实际物理内存更大的地址空间
          • 必须基于非连续存储分配
      • 页式虚拟存储 id:: 693b708a-c623-46d8-ba80-1ed4d1d4bd5c
        • image.png
        • 页表结构
          • 有效位
          • 脏位(修改位)
          • 页框号
          • 访问权限位
          • 其他控制位
        • 二级页表 #🤔 考前记
          • 10 位10 位12 位
            页目录号页表索引页内偏移
            一级页表二级页表物理地址
          • 优点
            • 对于使用较少内存的进程,只需分配 1 个页目录和少量页表,节省内存空间
              • 否则每个进程都需要分配完整的页表,需要大量连续内存
        • ((693bbee6-f0a9-45f3-8a26-5fddcc38b1e3))
        • ((693bbf6b-14e9-44be-9ba7-34324092ac3e))
        • 带TLB和Cache的地址转换过程 #🤔 考前记
          • CPU生成虚拟地址VA
          • MMU将VA分解为虚页号VPN和页内偏移VPO
          • MMU检查TLB(根据VPN)
            • 命中: 直接得到对应的物理页框号PPN, 跳到物理地址生成阶段
            • 未命中: 继续执行
          • MMU查页表
            • 页表基址寄存器PTBR
            • 页表项(PTE)物理地址: PTBR + VPN * PTE_size
          • 检查PTE的有效位和权限位
            • 无效或无权限: 触发缺页异常或保护异常
            • 有效且有权限: 取出PPN, 更新TLB
          • 更新TLB
            • 查找页表后, 一旦获得了有效的 PPN, 就将该映射关系加载到 TLB 中
          • 物理地址生成阶段
            • 物理地址PA = PPN * 页大小 + VPO
          • CPU/MMU检查Cache
            • PA被分解为Cache标签Tag, Cache行号Index和块内偏移Offset
            • 根据Index访问Cache, 并与Tag比较, 判断命中与否
              • 命中: 直接读取数据
              • 未命中: 访问下一级存储器
          • MMU使用PA访问主存
            • 主存将数据块读取出来, 并送CPU
            • 重要
              • 同时,该数据块会被加载到 Cache 中, 并更新标志位
              • 同时, 依据替换算法, 可能会将某个 Cache 行中的数据块替换出去
            • CPU收到数据, 访存结束
        • 考点 #🤔 考前记
          • TLB命中则页必然命中(页面在主存中)
          • 几种缺失类型的具体实现
            • cache缺失: 硬件实现
            • TLB缺失: 硬件或软件实现
            • 页缺失: 软件实现
          • 计算页表项的物理地址
            • 页表基址寄存器PTBR + 虚页号VPN * 页表项大小PTE_size
            • 注意: 页表也存放在主存中, 有些模型下也需要通过虚拟地址访问页表
          • 访存时命中/发生缺页中断时的访存次数
            • 直接命中时 2次访存
              • 一次访问页表, 一次访问数据
            • 发生缺页中断时 4次访存
              • 第一次访问页表(发现无效)
              • 缺页中断处理(调入页表)
              • 第二次访问页表(发现有效)
              • 访问数据(仍然可能发生cache缺失 …)
          • 缺页中断率和平均存取时间计算
            • 设缺页中断率为, 主存存取时间为, 缺页中断处理时间为
            • 平均存取时间
            • 其中为直接命中时的访存时间, 为发生缺页中断时的访存时间(具体看题目要求)
      • 段式虚拟存储 id:: 693b708a-2c5c-4a3c-ab11-d3557753031b
        • image.png
        • 地址结构
          • 段号
          • 段内偏移
        • 段表结构
          • 段号(隐含)
          • 段起始地址
          • 段长
          • 访问权限位
        • 段表寄存器(STBR): 存放段表基址
        • 共享段
          • 多个进程可以共享同一段代码段或数据段
            • 共享段的段表项在各进程的段表中均有描述, 段号可能不同, 但段起始地址段长相同
            • 操作系统维护一个全局共享段表, 记录所有共享段的信息以及引用计数
              • 只有当引用计数为0时, 该共享段才能被释放
  • 4 指令系统 collapsed:: true
    • 指令格式
      • 一般格式
        • 操作码: 指示操作性质及功能
          • 固定长度操作码
          • 可变长度操作码
        • 地址码: 指示操作数地址或操作数本身
        • 寻址方式
      • 指令字长 #🕳 有坑
        • 定长指令字长
          • 不一定等于机器字长, 一定等于指令寄存器IR宽度
          • 指令地址空间不一定等于存储器地址空间, 要看PC是按字节还是按指令字长寻址
        • 变长指令字长
      • 指令地址码字段
        • 三地址指令
        • 二地址指令
        • 一地址指令
        • 零地址指令
    • 寻址方式 #🤔 考前记
      • 立即寻址
        • 操作数直接在指令中给出
      • 直接寻址
        • 操作数地址在指令中给出
        • 必须是无符号数
      • 间接寻址
        • 操作数地址的地址在指令中给出
      • 寄存器寻址
        • 操作数在寄存器中, 无须访存
      • 寄存器间接寻址
        • 操作数地址存放在寄存器中
      • 相对寻址
        • 操作数地址由指令中给出的位移量程序计数器PC的值相加得到
        • 形式地址是带符号数
        • PC指向下一条指令
      • 变址寻址
        • EA = (IX) + D, 一般用于数组元素访问
        • IX: 变址寄存器 - 无符号数
      • 基址寻址
        • EA = (BX) + D, 一般用程序重定位
        • BX: 基址寄存器 - 无符号数
      • 堆栈寻址
        • EA = (SP)
      • 其他寻址(复合)
        • 相对间址
        • 变址间址
        • 间址变址
        • 基址变址
      • 考点 #🕳 有坑
        • 区分题目要求: 操作数还是有效地址EA
          • 有效地址只是地址
          • 操作数是需要访问地址并获取内容
        • 形式地址的符号
          • 直接/间接寻址: 无符号数 - 直接给出主存地址
          • 涉及寄存器号: 无符号数 - 给出寄存器号
          • 相对寻址/基址寻址/变址寻址: 带符号数 - 给出位移量, 需与寄存器内容相加得到有效地址
        • 指令偏移量
          • 区分按字节寻址和按指令字长寻址
        • 操作系统至少需要分配的页框数
          • 允许一级间址寻址的指令系统 - 3个页框
            • 存放当前指令的页框
            • 存放操作数的地址(间接地址)的页框
            • 存放操作数的页框
    • 指令类型
      • 数据传送指令
      • 算术运算指令
      • 逻辑运算指令
      • 移位指令
      • 控制转移指令 #🕳 有坑
        • 条件转移指令 jz, jg, jl
        • 无条件转移指令 jmp
        • 子程序调用与返回指令 call, ret
        • 中断与返回指令 int, iret
        • 空指令 nop
        • 停机指令 hlt
        • 考点
          • 只要涉及改变PC的指令就会引起 ((6939944e-86f4-4c2c-9aa7-9f6e81abc5bc)) (以上所有指令)
          • 转移指令的转移条件
            • 无符号数大于
              • CF=0且ZF=0(或) 相减后不借位且结果非0
            • 有符号数大于
              • SF=OF且ZF=0 符号位与溢出位共同指示结果为正数(且不为0)
      • 输入输出指令
        • 统一编址
          • 使用普通访存指令mov进行I/O操作
        • 独立编址
          • 使用专门的I/O指令in, out进行I/O操作
      • 堆栈操作指令
    • 机器代码表示
      • 汇编程序员可见的寄存器
        • 程序计数器PC
        • 通用寄存器
        • 标志寄存器
        • 中断字寄存器:存放中断类型, 中断优先级等信息
        • 基址寄存器和变址寄存器
    • 复杂指令集CISC和精简指令集RISC
      • CISC
        • 指令集复杂, 指令格式多样
        • 确保向后兼容
        • 多种寻址方式
        • 指令字长可变
        • 大多采用微程序控制
      • RISC
        • 指令集精简, 常用指令数量有限
        • 指令长度固定
        • 寻址方式简单
        • 只允许Load/Store指令访问存储器, 其余指令都在寄存器间操作
        • 指令执行时间短, 通常为一个时钟周期
        • 一般设置大量通用寄存器
        • 通常采用流水线技术
        • 采用硬布线控制
        • 一般无法实现向后兼容
  • 5 中央处理器
    • CPU的结构 collapsed:: true
      • 运算器 + 控制器 #🤔 考前记
        • 运算器
          • 算术逻辑单元ALU
          • 寄存器组GPRs
          • 程序状态字PSW
          • 暂存器
          • 移位寄存器
        • 控制器
          • 功能
            • 取指令
            • 分析指令
            • 执行指令
          • 组成
            • 程序计数器PC
            • 指令寄存器IR
            • 指令译码器ID
            • 存储器地址寄存器MAR
            • 存储器数据寄存器MDR
            • 时序系统
            • 微操作信号发生器
      • 数据通路 + 控制部件
    • 指令执行过程 collapsed:: true
      • 取指周期
        • 控制器固有的功能,不需要操作码的控制
        • 自动进行
        • 步骤
          • MAR ← PC
          • MDR ← M[MAR]
          • IR ← MDR
          • PC ← PC + 指令字长
      • 间址周期
        • 取出有效地址EA
        • 步骤
          • MAR ← 有效地址EA (来自IR地址码字段)
          • MDR ← M[MAR]
          • EA ← MDR
      • 执行周期
        • 取出操作数并执行指令
      • 中断周期
        • 当CPU检测到中断请求时才进入
          • 如果中断屏蔽字屏蔽了该中断请求, 那么CPU是收不到该中断请求的
        • {{embed ((693990d4-a3bd-4cbf-90f2-cd21aedce7d4))}}
    • 指令执行方案 #🤔 考前记 collapsed:: true
      • 单周期CPU
        • CPI = 1
        • 每条指令在一个时钟周期内完成, PC在每个时钟周期末更新(无须暂存器保存PC值)
      • 多周期CPU
        • CPI > 1
      • 流水线CPU
        • CPI 接近 1
      • 超标量流水线CPU
        • CPI < 1
    • 数据通路 collapsed:: true
      • 定义: 数据在指令执行的过程中所经过的路径,包括路径上的部件,称为数据通路
      • 组成
        • ALU
        • 通用寄存器组GPRs
        • 状态寄存器PSW
        • 异常和中断处理逻辑等
      • 注意
        • 数据通路由控制部件控制
        • 单总线数据通路所有寄存器共享一条总线, 同一时间只能有一个寄存器向总线输出数据
        • CPU的读写信号线控制MDR与存储器之间的数据传输方向
        • 区分内部总线(CPU内部寄存器之间的数据传输)和外部总线(CPU与存储器或I/O设备之间的数据传输)
      • 单总线方式
      • 多总线方式
        • 距离CPU越远的总线, 速度越慢
      • 操作举例
        • 从主存读指令到IR
          • MAR ← (PC) // PCout, MARin
          • MDR ← M[MAR] // Read, MDRin
          • IR ← (MDR) // MDRout, IRin
        • 将寄存器R1的内容写入R2指向的主存地址
          • MAR ← (R2) // R2out, MARin
          • MDR ← (R1) // R1out, MDRin
          • M[MAR] ← (MDR) // Write, MDRout, MARout
        • 执行加法运算 R3 ← R1 + R2
          • Y ← (R1) // R1out, Yin
          • ALU ← Y + (R2) // R2out
          • Z ← (ALU) // ALUop=+, Zin
          • R3 ← (Z) // Zout, R3in
    • 控制器的功能原理 collapsed:: true
      • 主要功能
        • 从主存取出指令, 并指示下一条指令的地址
        • 对指令进行译码, 产生相应的控制信号
        • 指挥并控制CPU, 主存和I/O设备之间的数据流向
      • 硬布线控制器
        • 控制单元CU对IR的操作码进行译码, 产生相应的控制信号
        • 由组合逻辑电路实现
        • 优点: 执行速度快
        • 缺点: 灵活性差, 难以实现复杂指令集
      • 微程序控制器
        • 基本概念
          • 微程序
            • 每条机器指令对应的一个微程序
            • 微程序是微指令的有序集合
            • 相当于一个针对机器指令的实时解释器
          • 微指令和微周期
            • 微指令: 微程序中包含若干微指令, 微指令是若干微命令的集合
              • 操作控制字段(微操作码)
              • 顺序控制字段(微地址码)
            • 微周期: 取出并执行一条微指令所需的时间, 通常为一个时钟周期
          • 微命令和微操作
            • 微命令: 控制部件向执行部件发出的控制命令, 是控制序列的最小单位
              • 互斥型微命令: 不能同时执行的微命令
              • 相容性微命令: 可以同时执行的微命令
            • 微操作: 执行部件收到微命令后执行的对应操作
          • 控制存储器CM #🤔 考前记
            • 位于CPU内部, 存放微程序, 用ROM实现
              • 微指令地址寄存器CMAR或μPC
                • 下地址的宽度对应CMAR的宽度(决定微指令地址空间)
              • 微指令寄存器CMDR或μIR
                • 微指令字长对应CMDR的宽度
            • 区分主存储器MEM(位于CPU外部, 用RAM实现, 存放用户程序和数据)
              • 地址寄存器MAR
              • 数据寄存器MDR
        • 微指令的编码方式 #🤔 考前记
          • 直接编码
            • 微指令的微命令字段中每一位直接对应一个微命令
          • 字段编码
            • 微指令的微命令字段被划分为若干子字段, 每个子字段表示一组微命令中的某一微命令
            • 分段方法
              • 互斥型微命令放在同一子字段
              • 相容性微命令放在不同子字段
              • 每个子字段还要保留全0码, 表示不执行任何微命令
          • 字段间接编码
        • 微指令格式 #🤔 考前记
          • 水平型微指令
            • 操作控制字段
              • 定义和执行多个微命令(并行)
              • 每个字段存放互斥的微命令
            • 顺序控制字段
              • 定义下一条微指令地址
              • 包括下地址字段, 条件转移字段等
          • 垂直型微指令
            • 一条微指令只定义一个微命令(串行)
            • 微操作码字段/目的地址/源地址等
        • 微指令地址形成方式 #🤔 考前记
          • 根据后继地址字段(下地址断定法)
          • 增量计数器法, 即通过μPC加1实现顺序执行
          • 根据机器指令译码后微程序的入口地址确定
          • 根据条件转移微指令的条件判定结果确定
    • 中断和异常机制 collapsed:: true
      • 异常(内部中断)
        • 由CPU在执行指令过程中自动产生
          • 例如: 内存缺页, 除0错误, 越界访问, 非法指令等
        • 分类
          • 故障Fault
          • 陷阱Trap
          • 中止Abort
        • 任何时候只要出现异常, CPU就会进入中断处理周期
      • 中断(外部中断)
        • 由I/O设备或其他外部事件引起
          • 例如: I/O设备请求, 时钟中断等
        • CPU每执行完一条指令后检查中断请求, 若有则进入中断处理周期
      • 中断分类
        • 屏蔽性
          • 可屏蔽中断
            • 通过INTR引脚请求中断
            • 可通过设置中断屏蔽字屏蔽该类中断
          • 不可屏蔽中断
            • 通过NMI引脚请求中断
            • 不能被屏蔽, 通常用于紧急情况如电源故障
        • 软硬中断
          • 软中断
            • 由程序执行int指令触发
          • 硬中断
            • 由外部硬件设备通过中断引脚触发
      • 中断响应时机 #🤔 考前记
        • 异常: 立即响应, CPU在执行指令过程中检测到异常时立即响应
          • 处理完成后
            • 返回异常发生的指令处重新执行该指令, 如缺页异常
            • 返回下一条指令处继续执行, 如除0错误, trap等
        • 中断: 当前指令执行完后响应
          • CPU响应中断的条件
            • 中断请求信号有效
            • 中断未被屏蔽
            • 全局中断允许标志置位
          • 处理完成后返回下一条指令处继续执行
        • DMA请求: 在一个总线事务完成后响应
          • DMA的总线优先级高于CPU
      • 中断响应过程 #🤔 考前记 id:: 693990d4-a3bd-4cbf-90f2-cd21aedce7d4
        • 异常和中断检测由硬件实现, 响应过程不可打断
        • 中断隐指令(硬件)
          • 真题答案中关于隐指令的描述
            • 将断点和程序状态保存到内核栈或特定寄存器中,关中断,最后跳转到内核中的异常处理程序执行
          • 关中断
            • 在处理中断期间, 禁止响应其他中断请求
          • 保存断点和程序状态
            • 将PC和PSW等寄存器内容入栈
          • 识别中断类型并转到中断处理程序
            • 中断向量表: 存放各类中断处理程序入口地址
              • 存放于内核空间, 由整个操作系统共享
              • 本质是一个指针, 指向函数指针数组
              • 中断向量号即数组的索引
        • 操作系统中断处理程序(软件)
          • 保存现场
            • 将其他通用寄存器内容入栈
          • 中断处理
          • 恢复现场
            • 将通用寄存器内容出栈
          • 返回断点处继续执行
            • 从栈中恢复PC和PSW等寄存器内容
      • 考点
        • 中断相关寄存器
          • 中断允许寄存器:用于开、关中断。
          • 中断向量寄存器:存储中断服务程序的入口地址
          • 中断屏蔽寄存器:用于屏蔽特定的中断请求,防止其被处理。
          • 中断请求寄存器:用于记录当前的中断请求状态。
    • 指令流水线 collapsed:: true
      • 性能指标
        • 流水线周期时间
          • 最慢的流水线阶段决定流水线周期时间
        • 流水线吞吐率
          • 单位时间内完成的指令数
        • 流水线加速比
          • 非流水线执行时间与流水线执行时间之比
        • 流水线效率
          • 实际流水线工作时间与理想流水线工作时间之比
      • 流水线结构
        • 数据通路
        • 控制部件
        • 流水线寄存器
          • 包括后面流水段要用到的所有数据信息
            • PC+4, 指令字, ALU结果, 标志位等
          • 包括后面流水段要用到的所有控制信号
      • 流水线执行过程
        • 典型的五段流水线
          • IF 指令取指
          • ID 指令译码和寄存器读
          • EX 执行或地址计算
          • MEM 访存操作
          • WB 写回寄存器
        • 涉及访存的指令周期 #🕳 有坑
          • IF/MEM: 取指, 访存阶段会访问存储器
          • ID/WB: 寄存器读写, 不涉及访存
      • 流水线的冒险处理 #🤔 考前记
        • 结构冒险(资源冲突)
          • 前一指令的某个阶段与后一指令的某个阶段争用同一硬件资源
          • 解决方法
            • 前一指令访存时, 使后一指令暂停一个周期
            • 超标量流水线设计中设置多个独立部件
        • 数据冒险
          • 指令间存在数据相关性, 导致后一指令在前一指令的结果尚未写回时就需要使用该结果
          • 按序执行流水线
            • 只有写后读RAW冲突
          • 乱序执行流水线
            • 存在写后读RAW, 写后写WAW, 读后写WAR冲突
          • 解决方法
            • 流水线暂停: 通过插入空指令(延迟)使后一指令等待
            • 数据旁路转发: 将前一指令的结果直接转发给后一指令, 而不必等到写回阶段
            • load-use冒险特殊处理: 对于load指令, 需要延迟 + 转发技术解决
          • 考点:
            • 上一条命令阻塞, 下一条命令的 IF 必须与上一条命令的 ID 一起执行(资源冲突)
            • 对于五段式流水线, 若指令A,B之间存在数据冒险, 且指令B需要使用指令A的结果, 则需要多少个气泡? #🕳 有坑
              • 前半周期写寄存器堆, 后半周期读寄存器堆(前一个指令的WB与后一个指令的ID在同一时钟周期)
                • 2个气泡
              • 不支持该特性
                • 3个气泡
              • image.png
            • 不是所有冒险都能通过转发解决
              • RAW冒险可以通过转发解决
              • load-use冒险需要延迟 + 转发解决
              • 控制冒险必须通过流水线暂停分支预测解决
        • 控制冒险 id:: 6939944e-86f4-4c2c-9aa7-9f6e81abc5bc
          • 由于分支指令改变了程序的执行顺序, 导致流水线无法确定下一条指令的地址
          • 只要涉及改变PC的指令就会引起控制冒险
          • 解决方法
            • 流水线暂停: 在分支指令执行期间暂停流水线
            • 分支预测: 预测分支指令的结果, 提前加载可能的下一条指令
      • 高级流水线技术
        • 超标量流水线
          • 同时发射多条指令, 需要多个处理部件
          • 不能缩短单条指令的执行时间, 能提高单位时间内的指令吞吐率
        • 超长指令字流水线(静态多发射)
          • 将多条指令打包成一条超长指令字, 同时发射多条指令
          • 挖潜潜在的并行性
        • 超流水线技术
          • 在一个时钟周期内再分段
    • 多处理器系统 #🤔 考前记 collapsed:: true
      • 计算机体系结构分类(指令流和数据流)
        • SISD 单指令流单数据流
        • SIMD 单指令流多数据流
          • 一个指令流控制多个处理单元同时执行相同的指令, 但操作不同的数据
          • 向量处理器和阵列处理器
        • MISD 多指令流单数据流
          • 实际不存在
        • MIMD 多指令流多数据流
          • 多个处理单元同时执行不同的指令流, 操作不同的数据流
          • 多处理器系统和多核处理器
        • SIMD和MIMD都是并行的计算模式
      • 硬件多线程
        • 每个线程都有单独的通用寄存器组, 程序计数器
        • 线程切换开销小(无须实际数据交换, 只需切换寄存器组)
        • 不必是多核处理器, 单核处理器也可以实现
      • 多核处理器
        • 多个处理核心集成在同一芯片上
        • 每个核心有独立的运算器和寄存器组
        • 共享一级Cache或二级Cache
      • 共享内存处理器SMP(对称多处理系统 Symmetric Multiprocessor)
        • 共享单一物理地址空间的多处理器系统
        • 通过总线连接多个处理器和主存
        • 分类
          • 统一存储访问UMA
            • 所有处理器访问主存的时间大致相同
          • 非统一存储访问NUMA
            • 不同处理器访问主存的时间不同, 某些处理器访问某些内存块的速度更快
  • 6 总线 collapsed:: true
    • 分类
      • 按功能
        • 片内总线: CPU内部总线
        • 系统总线: CPU与存储器和I/O设备之间的总线
          • 按传输内容 id:: 69399760-279d-49cd-8593-287515b0f1fd
            • 数据总线
              • 双向
              • 包含中断类型号, 命令字, 状态字
            • 地址总线
              • 由CPU发出, 指示存储器或I/O设备的地址
            • 控制总线
              • 双向
              • CPU发出读写信号, 存储器和I/O设备响应
        • I/O总线: 连接I/O设备和系统总线
        • 专用总线: 如PCIe总线, USB总线等
      • 按时序
        • 同步总线
          • 由统一的时钟信号控制数据传输
        • 异步总线
          • 不依赖统一时钟信号, 通过握手信号控制数据传输
      • 按数据传输方式
        • 串行总线
          • 数据位逐位传输
          • 适用于长距离传输
        • 并行总线
          • 多位数据同时传输
          • 适用于短距离传输
          • 不一定速度更快, 受限于时钟频率和信号完整性
    • 系统总线结构
      • 单总线
      • 多总线
        • 双总线结构
          • 主存总线 + I/O总线
        • 三总线结构
          • 主存总线 + I/O总线 + DMA总线
        • 总线之间通过桥接器连接
        • 越靠近 CPU 的总线速度越快
    • 总线的性能指标 #🕳 有坑
      • 总线周期
        • 一次总线传输所需的时间, 由若干个总线时钟周期组成
        • 包括申请阶段, 寻址阶段, 数据传输阶段和总线释放阶段
      • 总线时钟周期
        • 总线时钟信号的周期
      • 总线工作频率
        • 总线周期的倒数
        • 为单位时间内总线实际发生传输的次数, 不要与总线时钟频率混淆
          • 如DDR3总线, 在时钟上升沿和下降沿都传输数据, 总线时钟频率为800MHz, 但总线工作频率为1600MHz
          • 如PCIe总线, 本身串行, 通过多通道技术提高总线工作频率, 有多少通道, 总线工作频率就提高多少倍
      • 总线宽度
        • 数据总线宽度决定每次传输的数据量
      • 总线带宽
        • 理想条件下总线的最大传输速率
          • 不考虑总线争用, 寻址, 释放等开销
        • 计算公式: 总线带宽 = 总线宽度 × 总线工作频率
    • 总线数据传输方式
      • 突发传输
        • 一次总线传输中连续传输多个数据单元
        • 优点: 提高总线利用率, 减少寻址开销
      • 非突发传输
        • 每次总线传输只传输一个数据单元
    • 总线定时
      • 同步总线定时
        • 由统一的时钟信号控制数据传输
        • 传输双方在时钟上升沿或下降沿进行数据采样
      • 异步总线定时
        • 通过握手信号控制数据传输
        • 分类
          • 不互锁式
            • 发送方发送数据后立即释放总线, 不等待接收方确认
            • 速度快, 但可靠性差
          • 半互锁式
            • 发送方发送数据后等待接收方确认, 然后释放总线
          • 全互锁式
            • 发送方发送数据后等待接收方确认, 接收方处理完数据后发送完成信号, 发送方收到完成信号后释放总线
            • 可靠性高, 但速度慢
          • image.png
  • 7 输入输出系统 collapsed:: true
    • IO接口(I/O 控制器)
      • 基本功能
        • 数据缓冲
        • 状态控制
        • 地址解码
        • 数据格式转换: 串并转换, 码制转换等
        • 传送控制命令和状态信息
      • IO端口
        • 可被CPU直接访问的寄存器
        • 分类
          • 数据端口: 存放数据
          • 状态端口: 存放设备状态信息
          • 控制端口: 存放控制命令
            • 状态端口和控制端口可以共用一个寄存器
              • 通过方向区分
                • 读端口: CPU从IO设备读数据或状态信息
                • 写端口: CPU向IO设备写数据或控制命令
        • 考点
          • ASCII 异步串行传输
            • 起始位: 1位, 数据位: 7或8位, 奇偶校验位: 0或1位, 停止位: 1或2位
            • 一般会要求计算有效数据传输率(不含起始位, 停止位, 校验位等开销)
      • IO接口的编址方式
        • 统一编址
          • IO设备和存储器共享同一地址空间
          • 通过普通访存指令进行IO操作
        • 独立编址
          • IO设备和存储器有独立的地址空间
          • 通过专门的IO指令进行IO操作
    • IO方式
      • 程序查询方式 id:: 693b708a-8e30-4be1-8e8f-f1d0a6ca4c47
        • CPU通过轮询方式检查IO设备状态
        • 简单但效率低下
        • 两种查询方式
          • 独占查询
          • 定时查询
      • 程序中断方式 id:: 693b708a-9326-4c78-aa6d-2940ceabd813
        • IO设备数据准备完成后通过中断请求通知CPU进行IO操作
        • 提高CPU利用率
        • 中断处理过程
          • 中断请求
          • 中断判优
            • 响应优先级: 硬件确定, 不可修改
            • 处理优先级: 通过设置中断屏蔽字确定, 可修改
          • 中断响应
            • 响应条件: 中断请求有效且未被屏蔽, 无更高优先级中断请求或不可屏蔽中断请求正在处理
          • 中断处理
            • CPU执行中断隐指令, 然后转向执行中断服务程序
          • 中断返回
            • CPU执行中断返回指令, 恢复现场, 继续执行被中断程序
        • 多重中断(中断嵌套)
          • 允许在执行一个中断服务程序时,响应一个优先级更高的新中断请求
          • 实现方式
            • 执行中断服务程序时, 保护现场后重新开启中断
            • 中断返回之前, 恢复现场并关闭中断
          • image.png
      • DMA方式(直接存储器访问) id:: 693b708a-1d58-4146-8ef6-e3505e2c3df9
        • 一种完全由硬件 (DMA 控制器, DMAC) 进行成组信息传送的控制方式
        • 是一种以存储器为中心的高速数据传送方式 #🤔 考前记
        • DMA控制器 (DMAC接口)
          • 组成
            • 主存地址寄存器(DAR): 存放主存地址, 传送时自动递增/减
            • 传送长度寄存器(WC): 存放传送字节数, 传送时自动递减
            • 数据缓冲寄存器(DR): 存放传送数据
            • DMA请求触发器(DRQ): 接收IO设备的DMA请求信号
        • DMA传送过程
          • 预处理阶段
            • CPU初始化控制信息
              • DMA起始主存地址
              • 传送字节数
              • 传送方向
            • CPU启动DMA控制器
          • 数据传送阶段
            • DMA控制器发出总线请求信号(BRQ)
            • CPU响应总线请求, 发出总线授权信号(BG)
            • DMA控制器进行数据传送
              • 主存读/写操作
              • IO设备读/写操作
            • 重复上述步骤, 直到传送完成
          • 后处理阶段
            • DMA控制器发出传送完成中断请求(DRQ)
            • CPU响应中断请求, 执行DMA传送完成处理程序
        • DMA传送方式
          • 猝发模式(停止CPU访问)
            • DMA控制器独占总线, 直到传送完成
          • 周期挪用
            • 每次只请求传送一个字, 传送后释放总线, 允许CPU访问总线
          • 透明模式(DMA与CPU交替工作)
            • DMA控制器在CPU不使用总线时进行传送, 不影响CPU工作
      • 通道控制方式
        • 类似DMA方式, 但更复杂, 通常用于大型机
      • image.png