计算机系统的层次结构
这一节是全书最重要的”世界观”一节。 它说明一件事:计算机不是一台机器,是一摞机器——每一层用下一层提供的东西,造出一个更好用的东西给上一层。
而”计算机体系结构 vs 计算机组成”这条分界线,就是从这个层次观里切出来的,它是第 1 章唯一年年必考的概念题。
机制
五级层次:M0 到 M4
从下往上读,每一层都问同样三个问题:用什么语言、给谁看、由谁实现。
| 层 | 名称 | 使用的语言 | 由谁把它变成下一层 |
|---|---|---|---|
| M4 | 高级语言机器 | 高级语言(C、Java) | 编译程序 |
| M3 | 汇编语言机器 | 汇编语言 | 汇编程序 |
| M2 | 操作系统机器 | 作业控制语言 / 系统调用 | 操作系统 |
| M1 | 传统机器 | 机器语言(ISA) | 硬件直接执行 |
| M0 | 微程序机器 | 微指令 | 硬件直接执行 |
四条边界,逐条都是考点:
① M0 和 M1 是实际机器,M2~M4 是虚拟机器。
| 定义 | 哪几层 | |
|---|---|---|
| 实际机器 | 由硬件或固件实现,能直接执行该层语言 | M0、M1 |
| 虚拟机器 | 由软件实现,该层语言必须先被翻译 | M2、M3、M4 |
“虚拟机器”和 VMware、KVM 那种虚拟机没有关系——它只是说”这一层看起来像一台机器,其实是软件造出来的假象”。
② M1 与 M0 的分界正是 ISA 的位置。 M1 是机器语言程序员看到的机器,它的规格书就是 ISA。M0 在 ISA 之下,属于实现细节。
③ M0 只在微程序控制器里存在。 用硬布线控制器的 CPU 根本没有可辨认的微程序层。所以”任何计算机都有 M0 层”是错的——教材画五层是以微程序机为模型。这一点在 5.4.3 兑现。
④ M2 层的”语言”不是编程语言。 它指的是操作系统提供的接口:作业控制、系统调用。这一层就是 CO 与 OS 的正式交界。
计算机体系结构 vs 计算机组成
这是本章的招牌考点,判据只有一句话:
| 计算机体系结构(Architecture) | 计算机组成(Organization) | |
|---|---|---|
| 回答 | 有没有 / 是什么 | 怎么实现 |
| 对谁可见 | 机器语言程序员可见 | 对程序员透明 |
| 典型内容 | 指令系统、数据类型、寻址方式、可见寄存器、I/O 机制、中断机构、机器字长 | 数据通路宽度、控制信号、是否采用流水线、Cache 组织、乘法用什么电路、控制器用硬布线还是微程序 |
用一个例子把它彻底分开:
| 问题 | 属于 |
|---|---|
| ”有没有乘法指令” | 体系结构 |
| ”乘法指令用什么电路实现”(阵列乘法器还是移位加) | 组成 |
| ”有多少个通用寄存器” | 体系结构 |
| ”Cache 是几路组相联” | 组成 |
| ”指令字长是多少位” | 体系结构 |
| ”流水线分几段” | 组成 |
同一个 ISA 可以有很多种组成——这就是为什么 Intel 和 AMD 的 CPU 能跑同一份 .exe,但性能和功耗完全不同。
边界辨析:「透明」在计算机里是反直觉的
这个词在 408 里的意思和日常相反,几乎年年设陷阱。
“对某某透明” = 某某看不见它、不需要知道它。 不是”清晰可见”。
对象 对谁透明 意思 Cache 对应用程序员透明 程序员写代码时不用管 Cache 存不存在 浮点运算器 对应用程序员不透明 要用它就得写浮点指令 指令寄存器 IR 对汇编程序员透明 汇编里写不出”访问 IR” 程序计数器 PC 对汇编程序员不透明 转移指令就是在改它 虚拟存储器 对应用程序员透明,对系统程序员不透明 注意分对象 做题模板:先问”谁在看”,再问”他写代码时需不需要知道这个东西”。 需要知道 = 不透明。
注意最后一行:同一个对象对不同层次的程序员透明性不同。题目不说”对谁”,这题就是残缺的——正规题目一定会写明。
三个接口:API / ABI / ISA
教材主线只要求 ISA,但这三个词一起看才不会混。
| 接口 | 约定什么 | 谁和谁之间 | 换了它会怎样 |
|---|---|---|---|
| API | 函数名、参数、返回值 | 源代码与库 | 源码要改 |
| ABI | 调用约定、寄存器谁保存、栈对齐、数据布局、系统调用号 | 二进制与库/OS | .o 不能混用,但机器码合法 |
| ISA | 指令编码、可见寄存器、寻址方式、异常行为 | 软件与硬件 | 机器码根本执行不了 |
一个能记住的例子:同一颗 x86-64 CPU 上,Windows 和 Linux 的 ISA 完全相同,ABI 不同——所以 .exe 在 Linux 上跑不起来,不是因为指令不认识,而是因为调用约定和系统调用号对不上。
这三层的详细展开在 4.1.1。
这一节是全书的目录
把五层结构和后面六章对上,整本书的位置就清楚了:
| 层 | 对应的章 |
|---|---|
| M4 高级语言 | 4.3 C 语句 → 汇编 |
| M3 汇编语言 | 4.1、4.2 指令系统与寻址 |
| M2 操作系统 | 5.5 中断与特权级 → OS |
| M1 传统机器(ISA) | 5.2 指令怎么执行 |
| M0 微程序 | 5.4.3 微程序控制器 |
| M0 之下:数字逻辑 | 2.2.1 运算电路 |
而第 3、6、7 章不在这条竖线上——它们是横向的支撑:存储器(第 3 章)、互连(第 6 章)、外设(第 7 章)为每一层提供数据的存放和搬运。
边界
| 说法 | 判断 | 理由 |
|---|---|---|
| ”所有计算机都有微程序机器级 M0” | ❌ | 硬布线控制器没有 |
| ”虚拟机器就是 VMware 那种虚拟机” | ❌ | 指由软件实现的层 |
| ”M2、M3、M4 都是实际机器” | ❌ | 都是虚拟机器 |
| ”Cache 的容量属于体系结构” | ❌ | 属于组成,对程序员透明 |
| ”指令系统属于计算机组成” | ❌ | 属于体系结构 |
| ”透明就是清楚可见” | ❌ | 恰恰相反:看不见 |
| ”机器字长属于组成” | ❌ | 体系结构(程序员可见) |
| “数据通路宽度属于体系结构” | ❌ | 组成 |
| ”同一 ISA 的两台机器,程序性能相同” | ❌ | 组成不同,性能可以差很多 |
| ”同一 ISA 的二进制程序一定能互相运行” | ❌ | 还要 ABI 相同 |
对照速查
| 层 | 语言 | 实际/虚拟 | 实现者 |
|---|---|---|---|
| M4 | 高级语言 | 虚拟 | 编译程序 |
| M3 | 汇编语言 | 虚拟 | 汇编程序 |
| M2 | 系统调用 | 虚拟 | 操作系统 |
| M1 | 机器语言 | 实际 | 硬件 |
| M0 | 微指令 | 实际 | 硬件/固件 |
| 判据 | 内容 |
|---|---|
| 体系结构 vs 组成 | 机器语言程序员看不看得见 |
| 透明 | 看不见、不用管 |
| 实际 vs 虚拟机器 | 硬件/固件实现 vs 软件实现 |
考点
- 体系结构与组成的划分——第 1 章最高频,几乎必考。
- “透明”的含义,以及”对谁透明”。
- M0~M4 各层的语言与实现者,M2~M4 是虚拟机器。
- 硬布线控制器没有 M0 层。
链接
- 🏠 返回总览:计算机组成原理第 1 章:计算机系统概述总览
- ⬅️ 上一节:1.2.3 计算机软件
- ➡️ 下一节:1.2.5 计算机系统的工作原理
- 🔑 ISA/ABI/API 展开:4.1.1 指令系统的基本概念
- 🔗 M0 层的实现:5.4.3 微程序控制器
- 🔗 M2 层的硬件支撑:5.5.1 异常和中断的基本概念
- 📖 名词库:第 1 章名词库