423 lines
9.7 KiB
Markdown
423 lines
9.7 KiB
Markdown
|
|
# 第8章 CPU的结构和功能
|
|||
|
|
|
|||
|
|
> 📖 本章介绍CPU的功能、内部结构和指令执行过程。
|
|||
|
|
> 🎯 重点理解CPU组成和指令周期
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📋 本章目录
|
|||
|
|
|
|||
|
|
- [[#8.1 CPU的结构]]
|
|||
|
|
- [[#8.2 指令周期]]
|
|||
|
|
- [[#8.3 指令流水]]
|
|||
|
|
- [[#8.4 中断系统]]
|
|||
|
|
- [[#本章小结]]
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8.1 CPU的结构
|
|||
|
|
|
|||
|
|
### 8.1.1 CPU的功能
|
|||
|
|
|
|||
|
|
> [!info] 核心功能
|
|||
|
|
> CPU负责协调并控制计算机各部件执行程序的指令序列。
|
|||
|
|
|
|||
|
|
**基本功能**:
|
|||
|
|
|
|||
|
|
| 功能 | 说明 |
|
|||
|
|
|------|------|
|
|||
|
|
| **指令控制** | 控制程序的顺序执行 |
|
|||
|
|
| **操作控制** | 产生完成每条指令所需的控制命令 |
|
|||
|
|
| **时间控制** | 对各种操作加以时间上的控制 |
|
|||
|
|
| **数据加工** | 对数据进行算术运算和逻辑运算 |
|
|||
|
|
| **中断处理** | 处理异常情况和特殊请求 |
|
|||
|
|
|
|||
|
|
### 8.1.2 CPU结构框图
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
subgraph "CPU内部结构"
|
|||
|
|
subgraph "运算器"
|
|||
|
|
ALU[ALU<br/>算术逻辑单元]
|
|||
|
|
ACC[ACC<br/>累加寄存器]
|
|||
|
|
PSW[PSW<br/>程序状态字]
|
|||
|
|
REG[通用寄存器组]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "控制器"
|
|||
|
|
CU[CU<br/>控制单元]
|
|||
|
|
PC[PC<br/>程序计数器]
|
|||
|
|
IR[IR<br/>指令寄存器]
|
|||
|
|
MAR[MAR<br/>存储器地址寄存器]
|
|||
|
|
MDR[MDR<br/>存储器数据寄存器]
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
ALU <--> |"数据"| REG
|
|||
|
|
ALU <--> |"数据"| ACC
|
|||
|
|
CU --> |"控制信号"| ALU
|
|||
|
|
CU --> |"控制信号"| REG
|
|||
|
|
PC --> |"地址"| MAR
|
|||
|
|
IR --> |"指令"| CU
|
|||
|
|
MAR <--> |"地址"| MEM[主存]
|
|||
|
|
MDR <--> |"数据"| MEM
|
|||
|
|
|
|||
|
|
style ALU fill:#ff9999
|
|||
|
|
style CU fill:#99ccff
|
|||
|
|
style PC fill:#99ff99
|
|||
|
|
style IR fill:#ffcc99
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.1.3 CPU的寄存器
|
|||
|
|
|
|||
|
|
#### 用户可见寄存器
|
|||
|
|
|
|||
|
|
| 寄存器类型 | 功能 | 示例 |
|
|||
|
|
|------------|------|------|
|
|||
|
|
| **通用寄存器** | 可编程使用,存放操作数 | AX, BX, CX, DX |
|
|||
|
|
| **数据寄存器** | 存放操作数 | 数据寄存器 |
|
|||
|
|
| **地址寄存器** | 存放地址 | 基址寄存器、变址寄存器 |
|
|||
|
|
| **条件码寄存器** | 存放运算结果状态 | Z(零)、C(进位)、S(符号)、O(溢出) |
|
|||
|
|
|
|||
|
|
#### 控制和状态寄存器
|
|||
|
|
|
|||
|
|
| 寄存器 | 功能 | 可见性 |
|
|||
|
|
|--------|------|--------|
|
|||
|
|
| **PC** | 程序计数器,存放现行指令地址 | 用户可见 |
|
|||
|
|
| **IR** | 指令寄存器,存放当前指令 | 用户不可见 |
|
|||
|
|
| **MAR** | 存储器地址寄存器 | 用户不可见 |
|
|||
|
|
| **MDR** | 存储器数据寄存器 | 用户不可见 |
|
|||
|
|
| **PSW** | 程序状态字寄存器 | 部分可见 |
|
|||
|
|
|
|||
|
|
**PC(程序计数器)**:
|
|||
|
|
- 存放现行指令地址
|
|||
|
|
- 具有计数功能(PC+1→PC)
|
|||
|
|
- 遇到转移指令时可被修改
|
|||
|
|
|
|||
|
|
**IR(指令寄存器)**:
|
|||
|
|
- 存放当前正在执行的指令
|
|||
|
|
- 包含操作码和地址码
|
|||
|
|
- 操作码送CU译码
|
|||
|
|
|
|||
|
|
**MAR(存储器地址寄存器)**:
|
|||
|
|
- 存放将被访问的存储单元地址
|
|||
|
|
- 位数与地址总线宽度相同
|
|||
|
|
|
|||
|
|
**MDR(存储器数据寄存器)**:
|
|||
|
|
- 存放欲存入存储器的数据或从存储器读出的数据
|
|||
|
|
- 位数与数据总线宽度相同
|
|||
|
|
|
|||
|
|
### 8.1.4 数据通路
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
subgraph "CPU内部数据通路"
|
|||
|
|
PC[PC] --> |"地址"| MAR[MAR]
|
|||
|
|
MAR --> |"地址"| MEM[主存]
|
|||
|
|
MEM --> |"数据"| MDR[MDR]
|
|||
|
|
MDR --> |"指令"| IR[IR]
|
|||
|
|
MDR --> |"数据"| ALU[ALU]
|
|||
|
|
REG[通用寄存器] <--> |"数据"| ALU
|
|||
|
|
ALU --> |"结果"| REG
|
|||
|
|
ALU --> |"状态"| PSW[PSW]
|
|||
|
|
end
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8.2 指令周期
|
|||
|
|
|
|||
|
|
### 8.2.1 指令周期的基本概念
|
|||
|
|
|
|||
|
|
> [!info] 定义
|
|||
|
|
> 指令周期是取出一条指令并执行这条指令的时间。
|
|||
|
|
|
|||
|
|
**组成**:
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph LR
|
|||
|
|
A[指令周期] --> B[取指周期]
|
|||
|
|
A --> C[执行周期]
|
|||
|
|
B --> B1[取指令]
|
|||
|
|
B --> B2[分析指令]
|
|||
|
|
C --> C1[执行指令]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.2.2 指令周期流程
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
START[开始] --> FETCH[取指周期]
|
|||
|
|
FETCH --> DECODE[分析指令]
|
|||
|
|
DECODE --> EXEC[执行周期]
|
|||
|
|
EXEC --> CHECK{中断?}
|
|||
|
|
CHECK -->|是| INT[中断处理]
|
|||
|
|
CHECK -->|否| NEXT[取下一条指令]
|
|||
|
|
INT --> NEXT
|
|||
|
|
NEXT --> FETCH
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.2.3 取指周期
|
|||
|
|
|
|||
|
|
**操作序列**:
|
|||
|
|
1. PC → MAR(地址送MAR)
|
|||
|
|
2. MAR → 地址总线 → 主存(地址送主存)
|
|||
|
|
3. CU发读命令(控制信号)
|
|||
|
|
4. 主存 → 数据总线 → MDR(指令送MDR)
|
|||
|
|
5. MDR → IR(指令送IR)
|
|||
|
|
6. PC + 1 → PC(程序计数器加1)
|
|||
|
|
7. OP(IR) → CU(操作码送CU译码)
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
sequenceDiagram
|
|||
|
|
participant PC
|
|||
|
|
participant MAR
|
|||
|
|
participant MEM as 主存
|
|||
|
|
participant MDR
|
|||
|
|
participant IR
|
|||
|
|
participant CU
|
|||
|
|
|
|||
|
|
PC->>MAR: PC → MAR
|
|||
|
|
MAR->>MEM: 地址送主存
|
|||
|
|
CU->>MEM: 发读命令
|
|||
|
|
MEM->>MDR: 指令送MDR
|
|||
|
|
MDR->>IR: 指令送IR
|
|||
|
|
Note over PC: PC+1 → PC
|
|||
|
|
IR->>CU: 操作码送CU
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.2.4 执行周期
|
|||
|
|
|
|||
|
|
**不同指令的执行周期**:
|
|||
|
|
|
|||
|
|
| 指令类型 | 执行操作 |
|
|||
|
|
|----------|----------|
|
|||
|
|
| **取数指令** | MAR → 主存 → MDR → 寄存器 |
|
|||
|
|
| **存数指令** | 寄存器 → MDR → 主存 |
|
|||
|
|
| **加法指令** | 取操作数 → ALU运算 → 存结果 |
|
|||
|
|
| **转移指令** | 修改PC值 |
|
|||
|
|
| **空操作指令** | 无操作 |
|
|||
|
|
|
|||
|
|
### 8.2.5 指令周期的时序
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
subgraph "指令周期时序"
|
|||
|
|
T0[时钟周期T0] --> T1[时钟周期T1]
|
|||
|
|
T1 --> T2[时钟周期T2]
|
|||
|
|
T2 --> T3[时钟周期T3]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "取指周期"
|
|||
|
|
T0 --> F1[PC → MAR]
|
|||
|
|
F1 --> F2[读主存]
|
|||
|
|
F2 --> F3[MDR → IR]
|
|||
|
|
F3 --> F4[PC+1]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "执行周期"
|
|||
|
|
T0 --> E1[分析指令]
|
|||
|
|
E1 --> E2[取操作数]
|
|||
|
|
E2 --> E3[执行操作]
|
|||
|
|
E3 --> E4[存结果]
|
|||
|
|
end
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.2.6 指令流水
|
|||
|
|
|
|||
|
|
> [!info] 概念
|
|||
|
|
> 将指令执行过程分解为多个阶段,各阶段并行执行。
|
|||
|
|
|
|||
|
|
**流水线阶段**:
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph LR
|
|||
|
|
subgraph "指令流水线"
|
|||
|
|
IF[取指IF] --> ID[译码ID] --> EX[执行EX] --> MEM[访存MEM] --> WB[写回WB]
|
|||
|
|
end
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**流水线时序**:
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
gantt
|
|||
|
|
title 指令流水线时序
|
|||
|
|
dateFormat X
|
|||
|
|
axisFormat %s
|
|||
|
|
|
|||
|
|
section 指令1
|
|||
|
|
取指IF : 0, 1
|
|||
|
|
译码ID : 1, 2
|
|||
|
|
执行EX : 2, 3
|
|||
|
|
访存MEM : 3, 4
|
|||
|
|
写回WB : 4, 5
|
|||
|
|
|
|||
|
|
section 指令2
|
|||
|
|
取指IF : 1, 2
|
|||
|
|
译码ID : 2, 3
|
|||
|
|
执行EX : 3, 4
|
|||
|
|
访存MEM : 4, 5
|
|||
|
|
写回WB : 5, 6
|
|||
|
|
|
|||
|
|
section 指令3
|
|||
|
|
取指IF : 2, 3
|
|||
|
|
译码ID : 3, 4
|
|||
|
|
执行EX : 4, 5
|
|||
|
|
访存MEM : 5, 6
|
|||
|
|
写回WB : 6, 7
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**加速比**:
|
|||
|
|
$$S = \frac{非流水线时间}{流水线时间} = \frac{n \times k}{k + (n-1)}$$
|
|||
|
|
|
|||
|
|
- n:指令数
|
|||
|
|
- k:流水线级数
|
|||
|
|
|
|||
|
|
**流水线冲突**:
|
|||
|
|
|
|||
|
|
| 冲突类型 | 原因 | 解决方法 |
|
|||
|
|
|----------|------|----------|
|
|||
|
|
| **结构冲突** | 硬件资源冲突 | 资源复制 |
|
|||
|
|
| **数据冲突** | 数据依赖 | 数据前递、流水线暂停 |
|
|||
|
|
| **控制冲突** | 分支指令 | 分支预测、延迟分支 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 8.3 中断系统
|
|||
|
|
|
|||
|
|
### 8.3.1 中断的作用
|
|||
|
|
|
|||
|
|
> [!info] 中断定义
|
|||
|
|
> 中断是指CPU暂停现行程序,转去处理中断请求,处理完毕后返回原程序继续执行。
|
|||
|
|
|
|||
|
|
**主要作用**:
|
|||
|
|
1. **实现CPU与IO设备并行工作**
|
|||
|
|
2. **处理机器故障**
|
|||
|
|
3. **实现人机交互**
|
|||
|
|
4. **实现多道程序**
|
|||
|
|
|
|||
|
|
### 8.3.2 中断系统组成
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
subgraph "中断系统"
|
|||
|
|
subgraph "中断源"
|
|||
|
|
IO[I/O设备]
|
|||
|
|
TIMER[定时器]
|
|||
|
|
FAULT[故障]
|
|||
|
|
SOFT[软件中断]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "中断判优"
|
|||
|
|
PRIO[优先级电路]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "中断响应"
|
|||
|
|
MASK[中断屏蔽]
|
|||
|
|
INTR[中断请求]
|
|||
|
|
INTA[中断响应]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "中断处理"
|
|||
|
|
SAVE[保存现场]
|
|||
|
|
SERVICE[中断服务]
|
|||
|
|
RESTORE[恢复现场]
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
IO --> INTR
|
|||
|
|
TIMER --> INTR
|
|||
|
|
FAULT --> INTR
|
|||
|
|
SOFT --> INTR
|
|||
|
|
INTR --> PRIO
|
|||
|
|
PRIO --> MASK
|
|||
|
|
MASK --> INTA
|
|||
|
|
INTA --> SAVE
|
|||
|
|
SAVE --> SERVICE
|
|||
|
|
SERVICE --> RESTORE
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.3.3 中断处理过程
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
START[中断请求] --> CHECK{允许中断?}
|
|||
|
|
CHECK -->|否| WAIT[等待]
|
|||
|
|
CHECK -->|是| SAVE1[保存断点]
|
|||
|
|
SAVE1 --> SAVE2[保存现场]
|
|||
|
|
SAVE2 --> EI[开中断]
|
|||
|
|
EI --> SERVICE[执行中断服务程序]
|
|||
|
|
SERVICE --> DI[关中断]
|
|||
|
|
DI --> RESTORE1[恢复现场]
|
|||
|
|
RESTORE1 --> RESTORE2[恢复断点]
|
|||
|
|
RESTORE2 --> RET[中断返回]
|
|||
|
|
RET --> END[继续执行]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.3.4 中断判优
|
|||
|
|
|
|||
|
|
**优先级原则**:
|
|||
|
|
1. 硬件故障 > 软件中断
|
|||
|
|
2. 高速设备 > 低速设备
|
|||
|
|
3. 输入 > 输出
|
|||
|
|
4. 实时设备 > 普通设备
|
|||
|
|
|
|||
|
|
**判优方法**:
|
|||
|
|
|
|||
|
|
| 方法 | 原理 | 特点 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| 硬件判优 | 优先级电路 | 速度快 |
|
|||
|
|
| 软件判优 | 程序查询 | 灵活,速度慢 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 📝 本章小结
|
|||
|
|
|
|||
|
|
### 核心概念
|
|||
|
|
|
|||
|
|
1. **CPU功能**:指令控制、操作控制、时间控制、数据加工、中断处理
|
|||
|
|
2. **CPU寄存器**:PC、IR、MAR、MDR、通用寄存器、PSW
|
|||
|
|
3. **指令周期**:取指周期 + 执行周期
|
|||
|
|
4. **指令流水**:提高并行度,加速指令执行
|
|||
|
|
5. **中断系统**:实现CPU与IO并行,处理异常
|
|||
|
|
|
|||
|
|
### 关键公式
|
|||
|
|
|
|||
|
|
- **流水线加速比**:$S = \frac{n \times k}{k + (n-1)}$
|
|||
|
|
|
|||
|
|
### 重点图示
|
|||
|
|
|
|||
|
|
> [!summary] 必须掌握的内容
|
|||
|
|
> 1. CPU内部结构框图
|
|||
|
|
> 2. 指令周期流程图
|
|||
|
|
> 3. 指令流水线时序图
|
|||
|
|
> 4. 中断处理流程图
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🧪 自测练习
|
|||
|
|
|
|||
|
|
### 概念题
|
|||
|
|
|
|||
|
|
1. 说明CPU的基本功能。
|
|||
|
|
2. 比较CPU中各类寄存器的作用。
|
|||
|
|
3. 解释指令流水线的原理和冲突。
|
|||
|
|
|
|||
|
|
### 分析题
|
|||
|
|
|
|||
|
|
1. 画出取指周期的时序图。
|
|||
|
|
2. 设计一个简单的中断处理流程。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 🔗 相关链接
|
|||
|
|
|
|||
|
|
- [[07_指令系统]] - 上一章
|
|||
|
|
- [[09_控制单元功能]] - 下一章
|
|||
|
|
- [[10_控制单元设计]] - 控制单元设计
|
|||
|
|
- [[05_输入输出系统]] - 中断系统
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
*本章难度:⭐⭐⭐⭐⭐ 困难*
|
|||
|
|
*重要程度:⭐⭐⭐⭐⭐ 核心重点*
|