Appearance
计算机系统层次结构
大纲定位
对应大纲第一章(一)计算机系统层次结构:计算机系统的基本组成;计算机硬件的基本组成;计算机软件和硬件的关系;计算机系统的工作原理("存储程序"工作方式,从源程序到可执行文件,程序和指令的执行过程)。
考情分析
本章是组成原理的总纲,题目形式几乎清一色是"下列叙述中错误的是"。它的难点不在于知识多,而在于每个概念都有一个紧挨着的近义概念:微架构 vs 物理实现、编译 vs 汇编 vs 解释、指令 vs 数据。下面每一对都用同一张表并排放,方便直接比对。
冯·诺依曼体系结构
冯·诺依曼在研究 EDVAC 机时提出"存储程序"思想,奠定了现代计算机的基本结构。
冯·诺依曼机的核心特点:
- 存储程序工作方式:程序和数据预先存入主存,计算机启动后自动逐条取指并执行,无须人工干预
- 硬件由运算器、控制器、存储器、输入设备、输出设备五大部件组成
- 指令和数据以相同形式(二进制)存放在存储器中,仅凭内容无法区分
- 指令由操作码(指明操作类型)和地址码(指出操作数地址)组成
- 早期冯·诺依曼机以运算器为中心:I/O 与存储器之间的数据传送都要经过运算器中转
- 程序的功能都通过中央处理器执行指令来实现
第 4 条藏着一个常考陷阱
地址码给的是操作数的地址,不是操作数本身。所以"指令按地址访问,数据都在指令中直接给出"是错误说法——只有立即寻址那一种情况下操作数才直接写在指令里,绝大多数指令给的是地址。
第 5 条是另一个经典陷阱:现代计算机已演进为以存储器为中心(I/O 可不经运算器直接与存储器交换数据,如 DMA),但"以运算器为中心"仍是冯·诺依曼机的原始特征。题目问"冯·诺依曼机的特点"选它是对的,问"现代计算机结构"则相反。
为什么用二进制
这一条常被跳过,但它是可以单独成题的。三个理由缺一不可:
| 理由 | 说明 |
|---|---|
| 运算规则简单 | 二进制加法只有 4 条规则,十进制有 100 条,硬件实现的复杂度天差地别 |
| 两个稳态的物理器件容易制造 | 高/低电平、导通/截止、有/无磁性——只要区分两种状态即可,抗干扰能力强 |
| 便于用逻辑门电路实现算术运算 | 0/1 与逻辑值的真/假天然对应,加减乘除都能归结为与或非,可直接用门电路搭出来 |
CPU 靠什么区分指令和数据
既然指令和数据在存储器里长得一模一样,CPU 凭什么不会把一条指令当成数据去加?
答案是:靠指令周期的不同阶段
取指周期里从主存取回的,CPU 一律当作指令送去译码;执行周期里从主存取回的,一律当作数据送去运算。
也就是说,区分它们的不是内容本身,而是取它们的那个时刻,CPU 正处在指令周期的哪个阶段。
排除掉其他三个常见干扰项:
| 说法 | 为什么不对 |
|---|---|
| 靠操作码译码结果 | 译码发生在已经确定它是指令之后,是果不是因 |
| 靠寻址方式 | 寻址方式是指令内部的字段,同样是取回指令之后才谈得上 |
| 靠所在存储单元 | 冯·诺依曼机的指令和数据共用同一个存储器、同一套地址空间,没有物理分区 |
计算机硬件的基本组成
现代计算机将运算器、控制器集成为 CPU(中央处理器)。完整硬件系统包括:
| 部件 | 功能 |
|---|---|
| CPU | 数据通路(ALU + 寄存器组)负责运算;控制单元负责取指译码、生成控制信号 |
| 存储器 | 主存(DRAM)存放当前程序和数据;外存(磁盘/SSD)长期保存 |
| I/O 设备 | 输入设备(键盘、鼠标)和输出设备(显示器、打印机) |
| I/O 接口 | 设备控制器,负责外设与主机之间的通信 |
| 总线 | CPU、主存、I/O 接口之间传输信息的公共通路 |
计算机软件
系统软件 vs 应用软件
| 类别 | 定义 | 举例 |
|---|---|---|
| 系统软件 | 管理系统资源、提供基础服务的软件 | 操作系统、编译器、DBMS |
| 应用软件 | 用户为解决特定问题开发的程序 | Office、浏览器、游戏 |
软硬件逻辑功能等价性
同一功能既可用硬件实现,也可用软件实现,从用户视角看逻辑功能等价。例如浮点运算既可由硬件浮点单元完成,也可由软件子程序模拟,但硬件实现效率远高于软件。
如何划分软硬件的功能边界,是计算机体系结构研究的核心问题之一。
计算机系统的层次结构
自顶向下八层,每一层向上提供简洁接口,向下依赖更底层的功能:
| 层次 | 这一层是什么 | 谁在这一层工作 |
|---|---|---|
| 应用程序 | 最终用户直接使用的软件 | 最终用户 |
| 高级语言 | C / Java 等,由编译器向下翻译 | 应用程序员 |
| 汇编语言 | 助记符,由汇编器向下翻译 | 汇编语言程序员 |
| 操作系统 | 在 ISA 之上做资源管理,向上提供系统调用 | 系统管理员 |
| ISA(指令集体系结构) | 软件与硬件的接口 | 系统程序员 |
| 微体系结构(计算机组成) | ISA 的逻辑实现:数据通路、控制器、流水线 | 硬件设计者 |
| 逻辑电路 | 门电路、组合逻辑与时序逻辑 | 电路设计者 |
| 物理实现 | 晶体管、版图、制造工艺 | 工艺工程师 |
下层的实现细节对上层用户透明。
ISA 与微架构:定义"做什么"和"怎么做"
ISA 是软硬件之间的关键接口,定义了软件可直接使用的硬件功能:
- 指令格式、操作类型、寻址方式
- 可访问的寄存器等硬件资源
- 存储器组织、异常/中断处理方式
ISA 定义"做什么",微体系结构决定"怎么做"。 相同的 ISA 可以有多种不同的微架构实现——Intel 的多代酷睿都遵循 x86 ISA,但内部组织方式完全不同。
微架构不是"物理实现层"
这是本章最容易被绕进去的一处。微架构是 ISA 的逻辑实现,不是物理实现。
| 层 | 回答的问题 | 例子 |
|---|---|---|
| ISA | 有哪些指令、寄存器、寻址方式? | x86-64、RISC-V |
| 微架构 | 用什么样的数据通路和控制器去执行这些指令? | 几级流水线、Cache 多大、是否乱序 |
| 逻辑电路 | 这些部件用什么门电路搭? | 加法器用超前进位还是行波进位 |
| 物理实现 | 用什么晶体管、什么工艺、什么版图造出来? | 7nm、10nm |
微架构和物理实现之间还隔着逻辑电路层。同一套微架构可以用不同工艺去生产——两层关注的完全是两件事,"微架构即物理实现层"是错误说法。
编程语言与翻译程序
三种编程语言
| 语言层次 | 特点 | 硬件能否直接执行 |
|---|---|---|
| 机器语言 | 0/1 二进制编码,与硬件直接对应 | 能 |
| 汇编语言 | 用助记符(mov、add)代替二进制指令 | 不能,需汇编器翻译 |
| 高级语言 | C/Java 等,接近自然语言 | 不能,需编译器/解释器翻译 |
硬件能直接执行的只有机器语言程序。硬件描述语言(Verilog/VHDL)是用来描述电路的,更不是给 CPU 执行的——它经综合后变成电路,不是变成指令。
三种翻译程序
| 翻译程序 | 输入 | 输出 | 特点 |
|---|---|---|---|
| 汇编程序(汇编器) | 汇编语言 | 机器语言 | 一对一翻译 |
| 编译程序(编译器) | 高级语言 | 汇编/机器目标代码 | 一次性翻译全部,生成目标程序 |
| 解释程序(解释器) | 高级语言 | — | 逐条翻译并立即执行,不生成目标程序 |
三者的上位概念是翻译程序。问"将高级语言源程序转换为机器目标代码文件的程序",答案是编译程序——注意题眼是"生成文件",解释器不生成文件,汇编器的输入不是高级语言,链接器的输入不是源程序。
存储程序工作方式
程序执行前,把指令和数据预先加载到主存。启动后 CPU 自动循环:
PC(程序计数器)的更新规则:
- 顺序指令:
- 跳转指令:
从源程序到可执行文件
以 C 语言为例,四个阶段:
hello.c → [预处理 cpp] → hello.i → [编译 cc1] → hello.s → [汇编 as] → hello.o → [链接 ld] → hello| 阶段 | 工具 | 输入 → 输出 | 功能 |
|---|---|---|---|
| 预处理 | cpp | .c → .i | 处理 #include、#define 等预处理指令 |
| 编译 | cc1 | .i → .s | 翻译为汇编语言 |
| 汇编 | as | .s → .o | 翻译为机器语言,生成可重定位目标文件 |
| 链接 | ld | .o → 可执行文件 | 解析外部符号引用、合并库函数,生成可执行目标文件 |
顺序为什么只能是这个
每一步的输出正好是下一步的输入,链条是被文件类型锁死的:编译器只吃 .i 吐 .s,汇编器只吃 .s 吐 .o,链接器只吃 .o。
所以"预处理 → 汇编 → 编译 → 链接"之类的排列一眼就能否掉——汇编器拿不到 .s 文件,根本没法开工。
关于这条工具链在真题里的具体考法(哪个阶段解析符号、哪个阶段确定地址),见 汇编语言基础。
交互可视化
考点清单
- 冯·诺依曼机:存储程序、五大部件、指令和数据同形式存放、指令 = 操作码 + 地址码、以运算器为中心
- 地址码给的是操作数地址,不是操作数本身
- 用二进制的三个理由:运算规则简单、两稳态器件易制造、便于用逻辑门实现运算
- CPU 靠指令周期的不同阶段区分指令和数据——取指周期取的是指令,执行周期取的是数据
- 硬件能直接执行的只有机器语言
- 编译器一次翻译全部并生成目标程序;解释器逐条翻译不生成目标程序
- ISA 是软硬件接口;微架构是 ISA 的逻辑实现,物理实现是晶体管/工艺层,两者中间还隔着逻辑电路
- 源程序到可执行文件:预处理 → 编译 → 汇编 → 链接,顺序被文件类型锁死
- 下层实现对上层用户"透明"