计算机组成

目录

:link: https://www.coursera.org/learn/jisuanji-zucheng/home/info :desc: 北京大学 陆俊林

1. DONE 计算机组成章节介绍

2023-07-17_07-34-33_screenshot.png

2. DONE 计算机基本结构

  • 推荐的主要教材是《计算机组成与设计》(英文版·第4版)Computer Organization and Design, Fourth Edition,作者:David A. Patterson John L. Hennessy;另外也推荐阅读 《Intel微处理器》(第8版)The Intel Microprocessors, Eighth Edition,作者:Barry B. Brey

2.1. DONE 101 电子计算机的兴起

2.1.1. ENIAC

  • 为了火炮射击表而生
  • 1946.2.14 完成
  • 第一台 通用 计算机

2.1.2. ABC

  • 1939 完成
  • ENIAC 借鉴了它

2.1.3. EDVAC

  • 《关于EDVAC的报告草案》
  • 全称 “离散变量自动电子计算机”
  • 1945
  • 描述了 冯诺依曼结构
  • 提出了储存器的概念

2.1.4. EDSAC

  • 1949.5.6. 正式运行
  • 第一台实用的存储式计算机
  • 第一台采用冯诺依曼结构

2.1.5. UNIVAC

  • 开启了商用计算机时代

2.2. DONE 冯诺依曼结构的要点

  • 计算机由5部分组成
    • 储存器 M
    • 控制器 CC Central Control
    • 运算器 CA Central Arithmetic
    • 输入设备 I
    • 输出设备 O
  • 程序数据二进制 的存放在存储器中,存放位置由储存器的地址指定
  • 计算机在工作时 自动 从存储器中 取出指令 加以执行
  • 主存的组织形式
    • 地址: 每个存储单元的序号
    • 内容: 存储单元存放的信息

因为计算机运行非常迅速,程序储存在存储器中,控制器就不需要等待用户下发的指令,这样子能节省大量的时间

2023-07-18_21-16-04_screenshot.png

2.3. DONE 冯诺依曼结构的小故事

2.3.1. 计算机执行指令的过程

  • 取指
  • 译码
  • 执行
  • 回写: 保存结果

2023-07-19_07-17-11_screenshot.png

2.4. DONE 计算机结构的简化模型

2023-07-19_07-27-51_screenshot.png

2.4.1. 存储器

  • 如果 存储单元字节 编址, 那么一个存储单元可以存放 8 位
  • 存储单元的地址是唯一的
  • 与CPU通过 系统总线 (system bus) 相连
  • 控制总线
  • 控制逻辑: 接受CPU的读、写、完成等控制信号
  • 地址总线: 传输存储单元地址。宽度为 n , 表示CPU最多可以管理 2n 个存储单元。 比如 32位 系统只能管理4G内存

假设控制器有10条地址总线,其对应的储存空间就为 210, 1KB

  • MAR (Memory Address Register) 存储器地址寄存器。 用来存放CPU正在读写的存储单元的地址
  • 数据总线: 一般为存储单元的整数倍。
  • MDR (Memory Data Register)。 用于存在CPU正在读写的存储单元的数据

2.4.2. 控制器

  • 完成 取指、分析、执行等功能
  • IR (指令寄存器): 存放正在执行或即将执行的 指令
  • PC (程序计数器): 储存下次执行的指令的 地址
  • MAR: CPU 的地址寄存器。 流动方向是 单向
  • MDR: CPU 的数据寄存器
  • 指令译码部件: 对 IR 存放的指令进行译码, 确定存放的是哪条指令
  • 控制电路: 确定好指令后, 产生控制信号。 在时序脉动的同步下控制各个部件的动作

2.4.3. 运算器

  • 完成 + - * / 算术运算 和 ! & | 逻辑运算
  • ALU (算术逻辑单元)
  • ALU 对 X, Y 中的数据进行运算, 将结果保存到 Z 。
  • F 则用来存放运算结果的状态 (零/正负/进位/溢出)
  • R0 … Rn 通用寄存器, 用与临时存放数据。 数据可能来源与存储器, 其他通用寄存器, ALU的输出

2.5. DONE 计算机执行指令的过程

  • 执行指令: ADD R0,[6] — 将 R0 与 地址为 6 (0110) 储存单元 的数据相加, 将结果保存到 R0
  • 初始状态:
    • PC: 0001 ,该指令地址
    • [0001]: 指令内容
    • R0: 0011
    • [6]: 0010
  • 过程:
    1. 取指
      1. 控制器: 将 PC 的地址 送往 存储器。 PC[0001] -> 内部总线 -> MAR[0001] -> 地址总线
      2. 控制电路 -> 控制总线[Read] -> 控制逻辑
      3. 存储器: 地址总线 -> MAR -> 地址译码器 -> [0001] -> MDR -> 数据总线
      4. 控制逻辑 -> 控制总线[Ready] -> 控制电路
      5. 控制器: 数据总线 -> MDR -> 内部总线 -> IR
      6. 控制器: PC 地址+1
    2. 分析
      1. IR -> 指令译码器 -> 控制电路
    3. 执行
      1. 控制器: 控制电路 -> MAR [0110] -> 地址总线
      2. 控制电路 -> 控制总线[Read] -> 控制逻辑
      3. 存储器: 地址总线 -> MAR -> 地址译码器 -> [0110] -> MDR -> 数据总线
      4. 控制逻辑 -> 控制总线[Ready] -> 控制电路
      5. 控制器: R0 -> 内部总线 -> X, 数据总线 -> MDR -> 内部总线 -> Y
      6. 运算器: X,Y -> ALU -> Z,F
    4. 回写
      1. Z -> 内部总线 -> R0
  • 问题:
    • 送往 是什么操作的?
    • 数据是如何传输的?

2.6. DONE 计算机输入和输出

2023-07-23_11-01-59_screenshot.png

  • 外部记录介质 R : 例如 穿孔纸带, 硬盘
  • 输入
    1. 控制电路 -> 控制总线[Read] -> 控制逻辑
    2. MAR[控制器] -> 地址总线 -> MAR[输入设备] -> 地址译码器
    3. MDR[输入设备] -> 数据总线 -> MDR[控制器]
  • 输出
    1. 控制电路 -> 控制总线[Write] -> 控制逻辑
    2. MAR[控制器] -> 地址总线 -> MAR[输出设备] -> 地址译码器
    3. MDR[控制器] -> 数据总线 -> MDR[输出设备]

2.7. DONE 冯诺依曼结构和具体实现

2023-07-24_19-49-23_screenshot.png

  • CPU 与内存通过 北桥 相连
  • 南桥 与各种 I/O 相连
  • BIOS 芯片(属于 ROM)与 南桥 北桥 相连。 CPU初始指令从 BIOS 获得

2.7.1. 南北桥架构演变

2023-07-25_07-25-10_screenshot.png

  • 北桥负责 CPU 与 主存间的数据传输

2023-07-25_07-26-44_screenshot.png

  • CPU 直接与主存相连, 大大提交两者间的数据传输

2023-07-25_07-28-49_screenshot.png

  • PCIe 控制器也移到CPU, CPU与显卡直接相连,提升传输效率
  • 北桥剩余的功能移动到南桥
  • 南桥改名为 PCH

2023-07-25_07-31-55_screenshot.png

  • 系统芯片 (System-on-a-Chip SoC)
  • 将上述集成为单一电路的集成电路

摩尔定律: 每隔18个月,集成电路上的晶体管数目会翻一倍

3. DONE 指令系统体系结构

3.1. DONE 设计自己的计算机

3.1.1. 指令分类

  • 运算类
    • ADD R,M
  • 传送类
    • LOAD R,M 读
    • STORE M,R 写
  • 转向类
    • JMP L 下条指令地址转向到 L(存储单元地址) 去获取

3.1.2. 指令示例

2023-07-29_17-13-50_screenshot.png

  • 一条指令2个字节
  • 第一个字节 高位(前4bit) 为 操作码 , 低位(后4bit) 为寄存器号
    • 可以有 24 16 个操作码 (ADD LOAD 等)
    • 可以有 24 16 个寄存器 R0 … R15
  • 第二个字节为存储器地址
    • 可使用 28 256 个字节的存储器

3.1.3. 任务示例

将 M1 与 M2 的内容相加, 然后存入 M3, 最后转向 L

  • 设 M1=5, M2=6, M3=7, L=18
  • 汇编程序则为
    • LOAD R3,[5]
    • ADD R3,[6]
    • STORE [7],R3
    • JMP [18]
  • 存储器片段为:

2023-07-29_17-20-02_screenshot.png

3.2. DONE x86 体系结构

3.2.1. x86 体系结构 常见型号

2023-07-29_17-50-39_screenshot.png

3.2.2. 8086 处理器

2023-07-29_17-57-02_screenshot.png

  • 内部的通用寄存器为 16 位, 可处理 16 位和8位的数据
  • 地址总线 20 位, 可寻址 220 (1MB) 的数据
  • 数据总线 16 位

2023-07-29_17-56-37_screenshot.png

  • 4个数据寄存器

    2023-07-29_18-00-41_screenshot.png

  • 一个标志寄存器

2023-07-29_18-01-36_screenshot.png

  • IP 是作为 PC 来使用
    • IP 的寻址能力位 216 (64K), 而地址总线为 220
    • IP 与 段寄存器联合从而获得 220 的寻址能力

      2023-07-29_18-08-54_screenshot.png

    • 逻辑地址与物理地址的转化

      2023-07-29_18-09-38_screenshot.png

3.2.3. 80386 处理器

  • 第一款 x86 系列的 32 位处理器

    2023-07-29_18-12-58_screenshot.png

  • 各个寄存器扩展为 32 位

3.2.4. x86-64 的寄存器模型

  • 与32位兼容

    2023-07-29_18-14-16_screenshot.png

  • 额外增加了8个通用寄存器(共16个)

3.3. DONE x86 指令简介

3.3.1. 指令分类

  • 运算类: 加 减 与 非 等
  • 传送类: 从存储器到通用寄存器 从通用寄存器到 I/O 等
  • 控制类: 暂停处理器 清除标记位 等
  • 转移类: 无条件转移 条件转移 过程调用 等

3.3.2. 程序示例

计算 [2000H] 和 [3000H] 起始的两个数之和, 数的长度存储在 [2500H]

2023-07-30_11-03-53_screenshot.png

  1. x86 传送类指令

    2023-07-30_11-05-26_screenshot.png

    1. MOV
      • 格式: MOV DST,SRC
      • 操作: DST <- SRC
      • DST 和 SRC 可以是:
        • MOV EBX,40 寄存器名称, 立即数
        • MOV [4000H],EBX 存储器地址
        • MOV [DI],AX 存放存储器地址的寄存器名称
        • MOV WORD PTR[BX+SI*2+200H], 01H “存放操作数的存储器地址” 的 计算方法
      • 编码

      2023-07-30_11-13-30_screenshot.png

      2023-07-30_11-15-22_screenshot.png

      x86 的指令是变长的, 指令灵活,但是 CPU 的硬件设计复杂了

  2. x86 运算类指令
    1. 逻辑运算

      2023-07-30_11-19-04_screenshot.png

    2. 算术运算

      2023-07-30_11-19-54_screenshot.png

      1. ADD
        • 格式: ADD DST,SRC
        • 操作: 将SRC与DST 相加, 存储到 DST 中
      2. INC
        • 格式: INC OPR
        • 操作: 将 OPR 加1
        • 只有一个字节
      3. ADC
        • 格式: ADC DST,SRC
        • 操作: DST <- DST+SRC+CF
        • 会使用到 标记寄存器 的 CF 位, 故之前的运算结果会影响到当前的运算结果
  3. x86 转移类指令

    2023-07-30_11-38-55_screenshot.png

  4. x86 控制类指令

    2023-07-30_11-44-40_screenshot.png

  5. 汇编示例
    • MOV CL,[2500H] 将 [2500H] 传送到 CL 寄存器
    • MOV SI,2000H 将 SI 寄存器设置成 2000H 这个立即数
    • MOV DI,3000H
    • CLC 清除标记位 CF
    • LOOP1: MOV AX,[SI] 将 SI 存储的地址指向的数据放入 AX; [2000H] 的数据存到 AX
    • ADC AX,[DI] 将 DI 存储的地址指向的数据 与 AX 存储的数据 相加; [2000H] 与 [3000H] 的数据相加
    • MOV [SI],AX 将 AX 存储的数据 存放到 SI 储存的地址指向的内存地址; 相加的结果写入 [2000H]
    • INC SI 获取高位数的地址
    • INC SI
    • INC DI
    • INC DI
    • DEC CL 将数据长度减1, 当减到0时, 说明取够了的数据长度。 这时会把 ZF 置为 1
    • JNZ LOOP1 检查 标志寄存器 的 ZF 标记位
    • MOV AX,0H
    • ADC AX,0H 会把进位结果写到 AX 中
    • MOV [SI],AX 将前述的运算结果的最后一个进位结果写入存储器

    为什么要 INC 两次?
    — 从图中看出, 字长为2 ([2000H] 储存的是 AAH )

    两次 INC 能够用 ADD SI,2
    — 不能, ADD 会改变 CF

3.4. DONE 复杂的 x86 指令举例

3.4.1. 串操作指令

2023-07-30_15-31-15_screenshot.png

  • 对存储器中的数据串进行每次一个元素的操作
  • 串的基本单位是 字节 或 字 (即一个元素)
  • 串长度可达 64KB

3.4.2. MOVSB

  • 格式: MOVSB
  • 操作: 在存储器中将特定位置的一个字节单元传送到另一个指定位置
  • 没有显示的操作数
  • 隐含的操作数: 源串地址 (DS:SI), 目标串地址 (ES:DI), 串的长度存储在 (CX)
  • 硬件自动完成的操作:
    • 处理完一个串元素操作后, 将 SI和DI 指向下一个串元素
    • 如果有重复前缀, 则 CX <- CX-1

3.4.3. REP

  • 格式: REP 串操作指令
  • 操作: 当 CX != 0 时, 重复执行 串操作指令

3.4.4. 指令示例

2023-07-30_15-49-45_screenshot.png

  • 传送: 将数据从存储器读到CPU, 然后再写入目标存储器位置
  • DS, ES 是段寄存器, 段寄存器间不能进行相互写入,故用 AX 中转
  • 标识寄存器 DF 位:
    • DF=0 从源串 低地址 开始传送, 传送后 SI DI 自动增量
    • DF=1 从 高地址 开始, 传送后 SI DI 自动减量
    • 为了解决 源串和目标串有重叠的情况

3.5. DONE MIPS 体系结构

3.5.1. MIPS 的设计指导思想

  • 全称: Microprocessor without Interlocked Pipeline Stages (无内部互锁流水线级的微处理器)
  • 减少指令的类型
  • 降低指令复杂度

3.5.2. 做法

  • 固定的指令长度: 32 位 (一个字)
    • 简化了从存储器取指
  • 简单的寻址模式
    • 简化了从存储器取操作数
  • 指令数量少, 指令功能简单 (一条指令只完成一个操作)
    • 简化指令的执行过程
  • 只有 Load 和 Store 可以访问存储器
    • 例如, 不支持 x86 的 ADD AX [0001H] 这种

3.5.3. 指令示例

2023-07-30_16-52-42_screenshot.png

  1. 加法
    • 格式: add a,b,c
    • 操作: 将 b c 求和, 存入 a
  2. 例子

    2023-07-30_16-54-47_screenshot.png

    • lw $8,12($19) 加载 相对于 $19 偏移量为 12 的存储单元 (32位,字长为4,故 3*4=12)
    • add $8,$8,$18
    • sw $8,40($19)

3.5.4. MIPS 寄存器

2023-07-30_17-01-21_screenshot.png

  • 都是32位
  • 可以使用编号或名称

3.6. DONE MIPS 指令简介

3.6.1. 基本格式

2023-07-31_06-51-44_screenshot.png

  • R (Register) 型: 寄存器
  • I (Immediate) 型: 立即数
  • J (Jump) 型: 无条件转移

3.6.2. 分类

2023-07-31_06-54-14_screenshot.png

3.6.3. R 型

2023-07-31_06-55-44_screenshot.png

  • opcode 指令类型, 都为 0
  • funct: 和 opcode 组成操作码
  • rs rt rd: 25 32 个寄存器 , rs rt 指定源操作数寄存器, rd 指定保存运算结果的寄存器
  • shamt
    • 用于指定移位指令的位数
    • 对于非移位指令, 该域为0

3.6.4. I 型

2023-07-31_07-02-14_screenshot.png

  • opcode 指定指令操作类型
  • rs 指定源操作数, rt 指定 保存结果
  • immediate 操作的立即数 -216 ~ 216-1
    • 对于访存指令, lw rt,imm(rs) 可以满足访存地址偏移量的需求
    • 对于运算指令, addi rt,rs,imm 可能过小
  1. I 型条件分支指令
    • beq rs,rt,imm
      • if rs == rt; goto imm
    • bne rs,rt,imm

      2023-07-31_07-10-30_screenshot.png

    • imm 用来表示目标指令的地址的位移量
      • 16-bit 可表示 -215 ~ 215-1 的位移量
      • 但是 MIPS 的指令是 4 个字节对齐的, 所以实际可以表达的位移量为, -217 ~ 217-1 字节 (128kb)
      • 所以判断目标指令地址, 需要 PC + 4 + imm*4

3.6.5. J 型

2023-07-31_07-17-04_screenshot.png

  • 不需要判断条件
  • 地址位移量为 -225 ~ 225-1
  • 表达的地址位置范围 -227 ~ 227-1 (128MB), 视频是 \(\pm 2^{28}\) ?
  • 到达更远的目标地址
    • 多次调用 j
    • 使用 jr rs (将地址存在寄存器)

4. TODO 算术逻辑单元

5. TODO 乘法器和除法器

6. TODO 单周期处理器

7. TODO 流水线处理器

8. TODO 储存层次结构

9. TODO 中断与异常

10. TODO 输入输出设备

日期: 2023-07-17

Validate