📑 本页目录
配套学习整理 · 第一、二章合订
从二进制表示信息
到一条指令怎样执行计算机系统 · 完整学习讲义
按原书顺序把概念讲清,把计算方法讲全。每一节都回答:学它做什么,做题怎样用,学到哪里就够。
对应原讲义第一章《概述》(正文第 1—35 页)与第二章《计算机系统的基本结构与工作原理》(第 36—82 页)。沿用项目里已有教材整理版的离线 HTML 体例。
第一章:信息如何编码 → 第二章:硬件如何按指令处理信息
从第一章开始 →先决定学到什么程度
把“我看过了”变成“我能独立做出来”
这两章把历史、硬件名词、编码计算、指令执行和性能技术放在了一起。它们需要投入的深度不同。这里完整覆盖各节,同时把做题要求与背景理解分清;重点划分依据章后习题及后续知识的依赖关系,不代表已经知道你的考试范围。
| 要求 | 验收动作 | 典型内容 |
|---|---|---|
| 必须会算、会画 | 不看例题能列步骤,检查宽度、单位、编码规则和适用条件。 | 进制、补码、溢出、ASCII 存储、地址空间、LDR 流程、流水线、地址与性能计算。 |
| 必须会解释 | 能用自己的话说明“为什么”,并举出一个正确例子。 | 系统组成、控制器、RTOS、CISC/RISC、数据相关、并行资源关系。 |
| 了解用途与边界 | 知道它是什么、为解决什么问题出现;遇到名称不会完全陌生。 | 历史、旧型号、产业材料、调试接口与测试工具。具体要求在每节开头说明。 |
每节先读“掌握要求”,再跟讲解做例题。遇到图上的下拉框、输入框或按钮,可以改变条件核对结论。章节末先做短自测,再用答题卡检查章后习题;折叠答案需要你主动展开。
这是完整讲读文件,不是公式速记表。符号约定、边界条件和必要的背景解释都保留。页面中的外部链接仅作核对资料,正文、公式和图解无需联网。
原讲义正文第 1—35 页
CHAPTER 01 · 第一章概述
这一章最容易让人学乱的原因是:计算机史、硬件名词、二进制计算、嵌入式系统,被放在了一起。它们需要掌握的深度差别很大。
先把学习目标摆清楚:
| 内容 | 学到什么程度 |
|---|---|
| 计算机发展史、软件发展史 | 看懂发展脉络,知道代表性事件,不必逐条背人名和年份 |
| 摩尔定律 | 能解释含义和发展受限的原因,对应习题 1.2 |
| 五大部件、CPU、存储器、接口、软件分类 | 能用自己的话解释,能回答简答题 |
| 进制转换、原码反码补码、补码运算、溢出 | 本章计算题核心,必须亲手做熟 |
| 定点数、浮点数 | 理解区别,认识字段;本章不要求先钻研复杂浮点运算 |
| BCD、ASCII、字符串存储 | 必须会编码、算位数、画存储表 |
| 嵌入式系统、MCU/MPU、嵌入式操作系统、RTOS | 能比较、解释和举例 |
| 嵌入式发展史、处理器型号及公司故事 | 知道讲了什么,具体市场数字和旧型号暂不背 |
这些重点依据本章习题及后续章节的依赖关系划分。以下覆盖各节内容,并保留完整计算示范。
第1章 · 讲解单元 01—01
第一章的主线:信息怎样成为计算机可处理的对象
掌握要求:能把“信息—编码—程序—硬件”连成一句话。
为什么讲到这里:先建立整体位置;这里是理解框架,不是计算公式。
1 / 01先建立整章最重要的一句话
计算机用二进制编码保存信息,按照程序中的指令,控制硬件处理这些信息。
这句话里有四件事:
- 信息:数字、文字、图像、声音等。
- 编码:规定一串 0、1 代表什么。
- 程序:规定先做什么、后做什么。
- 硬件:真正执行存储、运算、输入输出的电路和设备。
第一章其实就在回答:
计算机从哪里来?有哪些部件?怎样用 0 和 1 表示信息?把计算机装进设备里,又是什么样子?
先抓住这条线,后面的名词就有地方放了。
第1章 · 讲解单元 02—06
1.1 计算机发展简史
掌握要求:会解释存储程序思想、摩尔定律,能按用途区分计算机类型。
为什么讲到这里:历史帮助解释今天的结构;器件代际、代表事件要认识,旧设备的重量、价格和市场数字不必逐项背。
1 / 02计算机发展简史:为什么要讲这一段?
这一段主要帮助你理解:今天计算机的组织方式,是围绕“怎样更方便地自动计算”逐渐形成的。
对本章计算题,它的直接作用很小;对理解“程序为什么也要放在存储器里”,有作用。
讲义前面的历史可以压缩为:
| 阶段或人物 | 做了什么 | 你需要记住什么 |
|---|---|---|
| 算筹、算盘 | 帮人计数和计算 | 计算工具早于电子计算机 |
| 帕斯卡、莱布尼茨 | 用机械装置实现计算 | 计算可以交给机器完成 |
| 巴贝奇 | 提出差分机、分析机等设计 | 开始探索更通用、可按步骤工作的计算机器 |
| 图灵 | 研究可计算性,提出图灵机模型 | 从理论上研究“什么能够按机械步骤计算” |
| ENIAC | 早期具有代表性的通用电子数字计算机 | 电子电路显著提高计算速度 |
| EDVAC 方案 | 系统阐述存储程序等思想 | 程序可以像数据一样放进存储器 |
| EDSAC、LEO、UNIVAC | 推动存储程序计算机走向实际使用和商业应用 | 计算机从实验装置发展为实际工具 |
图灵机是一个理论模型,这一章不需要你推演它的状态转移。它的意义是帮助人们严格研究计算过程,不能理解成“计算机能解决任何问题”。
讲义把 EDSAC 直接称为第一台存储程序式电子计算机,表述过于绝对。曼彻斯特大学的 Baby 已在 1948 年 6 月 21 日运行电子存储的程序;EDSAC 是随后非常重要的早期实用系统。这里知道发展关系即可。曼彻斯特大学历史资料
ENIAC 有多重、多少电子管、占多少平方米,这些数字用于说明早期计算机庞大、耗电。按本章习题,不需要把这些数字当计算公式背下来。
1 / 03“存储程序”到底解决了什么问题?【重点】
假设你要机器算:
机器需要知道:
- 先取出 2 和 3。
- 把它们相加。
- 再把结果乘以 4。
- 保存或者输出结果。
这些步骤就是程序的一部分。
如果每换一道题,都要重新接线、重新改机器内部连接,使用起来就很麻烦。
存储程序的办法是:
把表示操作步骤的指令也编码,和数据一起预先放进存储器。机器运行时,自动取出指令并执行。
因此,存储器里不只有“要算的数”,还有“告诉机器怎样算的指令”。
习题 1.1 可以这样回答:
冯·诺依曼型计算机主要由运算器、控制器、存储器、输入设备、输出设备五部分组成。其主要思想包括:
- 使用二进制表示指令和数据。
- 采用存储程序方式,将程序和数据存放在存储器中。
- 控制器自动取出、解释并执行指令。
- 指令通常按顺序执行,也可以通过转移指令改变执行顺序。
这里的“顺序执行”不等于永远从第一条直走到底。条件判断、循环都需要改变执行顺序。
1 / 04计算机为什么越来越小?五个发展阶段看什么?
讲义按主要器件把发展过程分成五个阶段:
| 讲义中的阶段 | 主要器件或技术 | 带来的变化 |
|---|---|---|
| 第一阶段 | 电子管 | 体积大、耗电多、可靠性较低 |
| 第二阶段 | 晶体管 | 更小、更省电、更可靠 |
| 第三阶段 | 中小规模集成电路 | 把多个电路功能集成起来 |
| 第四阶段 | 大规模、超大规模集成电路 | 微处理器和个人计算机快速发展 |
| 第五阶段 | 更高集成度及系统集成 | 功能丰富的单片机、嵌入式系统大量出现 |
需要理解的是“集成度提高”这件事:原先需要很多独立器件实现的功能,可以集中到更少的芯片里。
具体分代年份、LSI/VLSI/ULSI/GSI 的历史界限,先认识即可,不必把它们看成全世界统一的严格分界线。
讲义还提到几个指标:
- MTBF:平均故障间隔时间,用于描述可靠性,通常越长越好。
- 性能价格比:花相同的钱能获得多少性能。
- MIPS:这里指每秒百万条指令,是一种指令执行速率单位。
- SPEC:通过一组基准程序评测性能。
这里的 MIPS 是性能单位;本章后面还有一种叫 MIPS 的处理器架构,同名但含义不同。性能如何比较,第二章再展开。
1 / 05摩尔定律:一定分清“晶体管数量”和“运行速度”【习题 1.2】
比较稳妥的表述是:
在一定历史时期内,集成电路上的晶体管数量呈现大约每两年翻一番的发展趋势。
摩尔在 1965 年最初预测的是每年翻倍,1975 年将预测调整为大约每两年翻倍。它属于产业发展中的经验观察与目标,不是自然科学中永远成立的定律。Intel 关于摩尔定律的说明
它不能直接写成:“计算机运行速度每两年必然翻倍。”
因为晶体管更多,可以拿来增加:
- 处理器核心。
- 缓存。
- 图形、人工智能等专用运算单元。
- 安全和控制功能。
这些增加不一定都能让某一个普通程序按同样比例加速。
讲义的性能增长曲线,是想说明:**单纯依靠传统方式,持续取得性能增长越来越困难。**不能仅凭曲线的某个拐点,就断言摩尔定律在某一年统一“失效”。
习题问发展受限的原因,可以抓住四点:
| 原因 | 直观解释 |
|---|---|
| 器件微缩越来越困难 | 尺寸很小时,漏电、量子隧穿等问题更突出 |
| 功耗与散热约束 | 更多器件、更高频率,可能带来难以处理的热量 |
| 互连成为限制 | 晶体管之间的导线也存在电阻、电容和延迟 |
| 制造成本与复杂度上升 | 工艺、设备、设计和验证都越来越昂贵 |
物理限制、散热和互连问题在相关研究中都有讨论。关于微缩极限的研究
学到什么程度:能解释含义,能说明以上原因。暂时不需要推导半导体器件公式。
1 / 06计算机的四种类型:按用途理解,不按外壳判断
| 类型 | 主要用途 | 例子 |
|---|---|---|
| 微型计算机 | 面向个人的通用处理 | 台式机、笔记本、个人工作站 |
| 服务器 | 向其他用户或设备提供服务 | 网站服务器、文件服务器 |
| 嵌入式计算机 | 嵌入设备,完成特定功能 | 洗衣机控制器、汽车控制器 |
| 超级计算机 | 解决计算量特别大的问题 | 天气模拟、流体仿真、科学计算 |
个人工作站强调工程计算、图形等能力。服务器强调提供服务。超级计算机强调大规模计算能力。
讲义列举我国超级计算机的发展,是为了说明高性能计算的重要性。历史排名、处理器数量和当时市场数据,属于背景材料,现阶段不需要背。
第1章 · 讲解单元 07—12
1.2 计算机系统的组成
掌握要求:能画五大部件,解释 CPU、内存、外存、接口及软件分类。
为什么讲到这里:软件史说明程序如何从机器代码发展到现代软件;先理解作用,完整控制时序在第二章学习。
1 / 07计算机系统组成:先看懂这张图【重点】
计算机系统包含硬件和软件。先看硬件:
五大部件的职责,可以用一个“输入两个数并相加”的过程理解:
| 部件 | 干什么 | 在这个例子里 |
|---|---|---|
| 输入设备 | 把外界信息送进来 | 输入两个数 |
| 存储器 | 保存程序和数据 | 保存加法程序、输入值和结果 |
| 运算器 | 算术和逻辑处理 | 做加法 |
| 控制器 | 根据指令协调各部件 | 安排取数、运算、保存 |
| 输出设备 | 把结果送出去 | 显示结果 |
CPU 的核心组成是运算器和控制器,并包含寄存器等内部部件。
CPU 不是整台电脑。硬盘也不在“运算器+控制器”这个定义里面。
1 / 08存储器、寄存器、内存、外存,分别是什么?【习题 1.3】
先按用途分:
| 名称 | 主要作用 | 典型特点 |
|---|---|---|
| 寄存器 | 暂存 CPU 正在使用的数据、地址或状态 | 位于 CPU 内部,数量有限,访问很快 |
| 内存/主存 | 保存正在运行的程序和当前需要处理的数据 | CPU 运行时频繁访问 |
| 外存/辅助存储器 | 长期保存较大量的程序和文件 | 容量通常较大,适合持久保存 |
“外存”的“外”,不是说它必须装在机箱外面。
装在电脑里面的 SSD,也属于外存。
讲义介绍的内存类型:
- RAM:可读可写。普通计算机常见的主存 RAM 掉电后不能保留内容。
- ROM 类存储器:用于保存相对固定的程序和数据;其中有些类型可以按规定方式重新编程。
- Flash:非易失性存储器,在 SSD、嵌入式程序存储等场合都能见到。
“RAM”这个名字首先强调随机访问特性;入门时讨论掉电丢失,通常指常见的 SRAM、DRAM。
外存的例子,讲义包括磁盘、磁带、光盘和闪存设备。这里需要认识它们的用途,具体存储原理不必在第一章展开。
这部分就是我们第三章存储器系统的入口:为什么要用多种速度、容量、价格不同的存储部件。
1 / 09运算器和控制器里面那些缩写,学到哪里?
运算器中的核心部件是 ALU:算术逻辑单元。
它可以完成的操作包括:
- 算术操作:加、减等。
- 逻辑操作:与、或、非等。
- 移位、比较等处理。
寄存器用于保存操作数、临时结果等。
控制器中,讲义提到:
| 名称 | 作用 |
|---|---|
| IR,指令寄存器 | 保存当前正在处理的指令 |
| 指令译码器 | 分析指令要求做什么 |
| 操作控制部件 | 发出完成该指令所需的控制信号 |
你现在需要理解:
指令进入控制器,控制器安排数据如何流动、ALU做什么、结果写到哪里。
暂时不需要在第一章背完整的控制信号时序,那是第二章的内容。
时钟电路则为许多同步操作提供时间节拍。一个时钟周期也不一定刚好完成一条指令,后面会讲。
1 / 10输入输出接口和总线:为什么不能把外设随便接到 CPU 上?
不同外设差别很大:
- 键盘发送信息慢。
- 存储设备可以连续传输大量数据。
- 传感器输出的信号形式可能与 CPU 所需形式不同。
- 设备之间的电气特性、通信规则也可能不同。
因此需要 I/O 接口,负责桥接与匹配,例如:
- 缓冲数据。
- 转换信息形式。
- 配合通信时序。
- 提供状态和控制功能。
**设备与接口要区分。**例如键盘是设备,处理器通过接口电路与它交换信息。
总线是部件之间传输信息的通道,入门模型中分为:
| 总线 | 主要传什么 | 可以怎样记 |
|---|---|---|
| 地址总线 AB | 地址 | 找谁、找哪个位置 |
| 数据总线 DB | 数据或指令内容 | 传什么 |
| 控制总线 CB | 读写命令、状态等 | 做什么、是否准备好 |
以 CPU 为主设备的简单模型里,地址通常由 CPU 发出。到了 DMA、多主设备系统,其他主设备也可以发出地址,不能把“永远只有 CPU 能发地址”当成普遍规律。
习题 1.3 的四个名词,到这里就都能回答了:
CPU 负责执行指令和处理数据;内存服务于当前程序运行;外存保存大量持久信息;I/O 接口负责主机与外设之间的信息交换和匹配。
1 / 11软件分三类:系统软件、应用软件、中间件
| 类型 | 主要解决什么问题 | 例子 |
|---|---|---|
| 系统软件 | 管理资源,支持程序开发与运行 | 操作系统、编译器、调试器等 |
| 应用软件 | 完成具体用户任务 | 浏览器、办公软件、游戏、CAD |
| 中间件 | 为应用之间的通信、集成、协作提供公共服务 | 消息中间件、应用服务器等 |
操作系统 OS 是系统软件的核心。
它管理:
- 处理器时间:谁先运行、运行多久。
- 内存:各程序使用哪些空间。
- 设备:输入输出如何进行。
- 文件:信息如何命名、组织和保存。
- 其他资源以及程序之间的协调。
习题 1.4 按讲义可以列出:
| 系统软件 | 用途 |
|---|---|
| 操作系统 | 管理硬件与软件资源,支持程序运行 |
| 服务性程序 | 自检、诊断、维护、排错等 |
| 语言处理及开发工具 | 汇编、编译、解释、链接、调试 |
| 数据库管理系统 DBMS | 组织、管理、查询和维护数据库 |
软件分类有时存在不同口径,本题按讲义的分类回答即可。
1 / 12软件发展史:把一长串人名整理成五次变化
这一段讲解的目的,是让你知道为什么人们要发明高级语言、操作系统和软件工程。它对本章二进制计算题帮助不大,理解脉络即可。
| 讲义阶段 | 主要变化 | 需要理解的意义 |
|---|---|---|
| 第一代 | 机器语言发展到汇编语言 | 用符号代替直接写 0、1,降低编程负担 |
| 第二代 | 高级语言、编译器发展 | 更接近问题和算法,减少对机器细节的依赖 |
| 第三代 | 分时操作系统、数据库、结构化程序设计、软件工程 | 让多人使用机器,并管理越来越复杂的软件 |
| 第四代 | C、UNIX、个人计算机软件、图形界面、多媒体 | 软件更便于开发、移植和使用 |
| 第五代 | 面向对象、网络应用、分布式系统、API 等 | 支持规模更大、交互更复杂、相互连接的软件系统 |
讲义列举的语言,各自用来说明:
- FORTRAN:科学与工程计算。
- LISP:人工智能及符号处理。
- COBOL:商业数据处理。
- BASIC:降低学习和使用门槛。
- Algol:推动程序语言的系统化设计。
- Pascal:结构化程序设计。
- C:系统和底层软件开发。
- C++、Java、C# 等:面向对象等程序设计方法。
几个容易混的开发工具,值得在这里认识:
| 工具 | 主要做什么 |
|---|---|
| 汇编器 | 把汇编语言转换成目标代码 |
| 编译器 | 对源程序进行分析并生成目标代码等 |
| 解释器 | 按语言实现的方式执行程序,可能结合中间代码等机制 |
| 链接器 | 组合目标文件、库,并处理相关引用 |
| 调试器 | 帮助检查程序执行过程与错误 |
讲义还谈到:
- 结构化程序设计:强调顺序、选择、循环等清晰控制结构。
- “算法+数据结构=程序”:提醒你程序既要考虑处理步骤,也要考虑数据组织。
- 软件危机:软件规模扩大后,成本、进度、质量和维护出现严重困难。
- 软件工程:用系统化的方法组织软件开发、验证和维护。
- 面向对象:围绕对象组织状态和行为;它与结构化控制流程可以同时使用。
- C/S、B/S:客户机/服务器、浏览器/服务器等应用组织方式。
- API:约定软件功能如何被调用的接口。
- 虚拟仪器、SDN、SDS、SDDC、软件定义一切:通过可编程接口,让软件更灵活地配置与控制系统功能。
其中,互联网 Internet 是网络基础设施,万维网 Web 是建立在它之上的一种服务。讲义把一些时间线压得比较紧:Web 方案提出于 1989 年,首个浏览器和服务器于 1990 年完成。CERN 的 Web 历史资料
这一节掌握标准:能解释为什么需要这些软件,不要求现在就会写编译器、设计操作系统或者开发分布式系统。
第1章 · 讲解单元 13—17
1.3.1 数制与进制转换
掌握要求:会算位数和范围,能独立完成二、十、十六进制转换。
为什么讲到这里:这是后面补码、地址与指令编码的基础。小数转换也要认识,不只会整数。
1 / 13数的表示:从这里开始,要拿纸算【核心】
先分清三个问题:
- 数值是多少?
- 用几进制写?
- 用哪一种编码存?
例如,同一个数值十三:
这里改变的是写法,数值没有改变。
但把十三写成普通二进制、BCD 或字符串 "13",对应的位串可能不同。因为它们采用了不同的编码约定。
进制和编码,不能混成一件事。
1 / 14位、字节、字和字长:会算这几个关系
- 位 bit:一位可以是 0 或 1。
- 字节 Byte:本课程中一个字节为 8 位。
- 字 word:本章入门模型中,与机器处理的数据宽度有关。
- 字长:一个字包含的位数。
按照本章习题的约定:
但“字”在具体指令集和技术文档中可能有固定定义,不宜把所有文档里的 word 都机械替换成处理器位数。
最重要的计数规律:
例如:
| 位数 | 不同位串数量 | 按无符号整数解释时的范围 |
|---|---|---|
| 1 | 2 | 0~1 |
| 4 | 16 | 0~15 |
| 8 | 256 | 0~255 |
| 16 | 65 536 | 0~65 535 |
**有 种状态,不等于最大数是 。**从 0 开始计数,最大值是:
按字节编址,表示每个字节有地址,不表示一次访存只能传一个字节。
1 / 15进位计数制的本质:每一位都有权值
十进制:
二进制:
一般来说, 进制中,各位权值是:
小数点左边权值递增,右边是负指数。
例如:
讲义常用的后缀:
B或b:二进制。D:十进制。H或h:十六进制。
所以 1234D 在习题 1.5 中表示十进制 1234。遇到其他编程语言,还要按该语言的语法理解,不能把这套后缀当成所有语言的统一规则。
1 / 16十六进制为什么好用?一位刚好对应四位二进制
需要熟悉这个对应关系:
| 十六进制 | 二进制 | 十六进制 | 二进制 |
|---|---|---|---|
| 0 | 0000 | 8 | 1000 |
| 1 | 0001 | 9 | 1001 |
| 2 | 0010 | A | 1010 |
| 3 | 0011 | B | 1011 |
| 4 | 0100 | C | 1100 |
| 5 | 0101 | D | 1101 |
| 6 | 0110 | E | 1110 |
| 7 | 0111 | F | 1111 |
因为:
所以十六进制与二进制可以直接按四位一组转换:
你可以改下面的数,观察每组怎样对应:
做题方法:
- 十六进制转二进制:每一位写成四位。
- 二进制整数转十六进制:从小数点向左,每四位一组,不足补前导 0。
- 二进制小数转十六进制:从小数点向右,每四位一组,不足在末尾补 0。
补的位置不能反。
1 / 17十进制与其他进制怎么转换?【习题 1.5】
其他进制转十进制:按权展开。
例如:
十进制整数转 进制:不断除以 ,倒序读余数。
以十进制 1234 转十六进制为例:
1234 ÷ 16 = 77,余 2
77 ÷ 16 = 4,余 13,也就是 D
4 ÷ 16 = 0,余 4
从最后一个余数向前读:
同理:
7890 ÷ 16 = 493,余 2
493 ÷ 16 = 30,余 13,也就是 D
30 ÷ 16 = 1,余 14,也就是 E
1 ÷ 16 = 0,余 1
因此习题 1.5 的答案是:
| 原数 | 转换结果 |
|---|---|
| 789AH | 30874D |
| 0CEFH | 3311D |
| 1234D | 4D2H |
| 7890D | 1ED2H |
十进制整数转二进制也一样,只是不断除以 2。
十进制小数转二进制,则使用乘 2 取整数部分,顺序读取:
0.625 × 2 = 1.25 → 取 1,留下 0.25
0.25 × 2 = 0.5 → 取 0,留下 0.5
0.5 × 2 = 1.0 → 取 1,结束
这里补一句是为了后面理解浮点误差:某个十进制有限小数,不一定能写成有限位二进制小数。
第1章 · 讲解单元 18—25
1.3.2 机器数、原码、反码与补码
掌握要求:固定宽度后能编码、解码,能写出三种码的表示范围。
为什么讲到这里:补码为何可用统一加法器实现加减,解释了编码设计的理由;不需要先学门电路。
1 / 18机器数与真值:位串的含义由约定决定【核心】
“真值”是我们要表示的实际数值,例如:
“机器数”是按某种编码规则保存的位串,例如:
1011 0100
只给一串 0、1,却不告诉你位宽和解释方式,有时不能确定它代表什么。
例如,同样是:
1111 1111
它可以被解释为:
| 解释方式 | 含义 |
|---|---|
| 8 位无符号整数 | 255 |
| 8 位原码 | −127 |
| 8 位反码 | −0 |
| 8 位补码 | −1 |
因此,做编码题第一步永远先看:
几位?有无符号?什么编码?
1 / 19原码:最高位表正负,其余位表绝对值
以 8 位为例:
- 最高位 0:正。
- 最高位 1:负。
- 后面 7 位:绝对值。
因为:
所以:
+76 的原码:0100 1100
−76 的原码:1100 1100
原码直观,但直接拿它做普通二进制加法,会出问题。
例如:
+1 原码:0000 0001
−1 原码:1000 0001
直接相加:1000 0010
按原码解释,结果是 −2,而数学结果应该是 0。
这说明原码的运算需要额外处理符号和绝对值,不能直接照搬普通二进制加法。
**为什么学原码?**它帮助你看清“符号”和“数值编码”的关系,也直接出现在习题中。现在要会转换,不需要设计原码加减法电路。
1 / 20反码:正数不变,负数的原码数值部分取反
正数的原码、反码相同。
负数求反码:
保留原码符号位,把其余位的 0、1 互换。
例如:
−76 的原码:1100 1100
保留符号位:1
其余位取反: 011 0011
−76 的反码:1011 0011
也可以从 +76 的完整 8 位二进制出发,全部取反:
+76:0100 1100
取反:1011 0011
这两个说法起点不同,所以操作范围不同。别把它们混着用。
1 / 21补码:本章最值得花时间理解的地方
求补码的实用规则:
- 非负数:补码与普通二进制相同。
- 负数:把绝对值写成规定宽度的二进制,全部取反,再加 1。
以 −76 为例:
绝对值 +76:0100 1100
全部取反: 1011 0011
再加 1: 1011 0100
所以:
你可以改成 −1、−44、−127、−128,比较三种编码:
讲义还给了一个快捷方法:
从绝对值的二进制最右边向左找,保留遇到的第一个 1 及其右边的 0,把左边各位取反。
例如:
+76:0100 1100
↑
从右边遇到的第一个 1
保留末尾 100,左边取反,得到:
−76 补码:1011 0100
先把“取反加一”做熟,再使用快捷方法。没有必要同时硬背很多口诀。
1 / 22为什么补码能把减法变成加法?
关键是:固定 位,只保留结果的低 位,相当于对 取模。
8 位的模是:
例如:
180 的二进制就是:
1011 0100
因此,8 位补码用这个位串表示 −76。
在只保留低 8 位的前提下:
可以转成:
而 229 对应:
1110 0101
作为 8 位补码解释,它表示:
这正是:
所以,补码使加法器可以参与完成减法,简化硬件实现。
讲义用时钟说明这件事:12 小时制中,倒拨 7 格与正拨 5 格会到达相同位置,因为两者相差一整圈。
这段原理值得理解,因为它能解释“为什么负数用这样的位串表示”,不必只靠记忆。
1 / 23补码怎样读回真值?两种方法都要认识
已知 8 位补码:
1011 0100
最高位为 1,表示负数。
方法一:先按无符号数读,再减去 256。
方法二:全部取反,再加 1,得到绝对值。
原位串: 1011 0100
全部取反:0100 1011
加 1: 0100 1100 = 76
原位串代表负数,所以真值为 −76。
还有一个非常重要的直接理解:
在 8 位补码中,最高位的权值是 −128。
因此:
这解释了为什么不能把补码简单理解成“一个负号+后面七位的绝对值”。
1 / 24表示范围、两个零、−128:必须记牢
| 编码 | 位有符号范围 | 8 位范围 | 零的表示 |
|---|---|---|---|
| 原码 | ~ | −127~127 | +0、−0 |
| 反码 | ~ | −127~127 | +0、−0 |
| 补码 | ~ | −128~127 | 只有一个零 |
具体看:
| 位串 | 原码 | 反码 | 补码 |
|---|---|---|---|
| 0000 0000 | +0 | +0 | 0 |
| 0111 1111 | +127 | +127 | +127 |
| 1000 0000 | −0 | −127 | −128 |
| 1111 1111 | −127 | −0 | −1 |
−128 没有对应的 8 位原码或反码,但有 8 位补码。
而 +128 超出 8 位有符号补码范围。
所以,对 1000 0000 在 8 位内取反加一:
1000 0000 → 0111 1111 → 1000 0000
它又回到了自己。原因是 +128 在这个范围内表示不出来。不能因此说“−128 的相反数仍是 −128”。
补一句后面很常用的规则:补码扩大位宽,通常要做符号扩展。
例如:
8 位 −44: 1101 0100
16 位 −44:1111 1111 1101 0100
在前面补符号位 1。若前面补 0,就会改变数值。
1 / 25习题 1.6:六个数全部做完
题目要求转换成 8 位补码。
| 十进制数 | 8 位补码 |
|---|---|
| 19 | 0001 0011 |
| 63 | 0011 1111 |
| −1 | 1111 1111 |
| −44 | 1101 0100 |
| 127 | 0111 1111 |
| −127 | 1000 0001 |
其中 −44 的过程:
+44: 0010 1100
取反: 1101 0011
加 1: 1101 0100
−127 的过程:
+127: 0111 1111
取反: 1000 0000
加 1: 1000 0001
做完要反查一次。
例如:
反查正确,才算这道转换题真正完成。
第1章 · 讲解单元 26—31
1.3.3 补码运算与溢出
掌握要求:会做补码加减,区分保留位串、数学真值、进位与有符号溢出。
为什么讲到这里:符号法和双进位法都要掌握;它们会在第二章的 PSW、条件转移中再次出现。
1 / 26补码加减法:固定宽度、直接相加、解释结果
8 位补码相加:
- 把两个操作数写成 8 位补码。
- 包括最高位在内,按普通二进制规则相加。
- 只保留低 8 位。
- 判断有无有符号溢出。
- 无溢出时,按补码解释结果。
例如:
0011 0001 +49
+ 1011 0100 −76
-----------
1110 0101
补码减法则转成加上相反数:
对应固定宽度位串,可以用:
实现低位结果的计算。
一般计算题直接先求 即可。但碰到最小负数时,要记得它的正相反数可能无法用原宽度表示。
1 / 27习题 1.7:先区分“运算再编码”与“编码后运算”
题目给出:
按本节上下文采用 8 位。
先写编码:
| 数 | 原码 | 反码 | 补码 |
|---|---|---|---|
| 0010 0001 | 0010 0001 | 0010 0001 | |
| 1100 0000 | 1011 1111 | 1100 0000 |
这里 −64 的原码和补码恰好相同,属于这个数的情况,不能推广成一般规律。
① 计算 :
0010 0001
+ 1100 0000
-----------
1110 0001
② 计算 :
因为:
所以:
0010 0001
+ 0100 0000
-----------
0110 0001
结果为 97。
③ 计算 :
④ 计算 :
这道题让你验证的是:
在数学结果可表示的条件下,补码运算得到的结果,与先求数学结果再编码一致。
1 / 28溢出是什么?别看见第九位就喊“溢出”【核心】
对于 8 位有符号补码:
若数学上的正确结果超出这个范围,就发生有符号溢出。
例如:
149 超过 127,发生溢出。
但二进制相加结果是:
0101 1110
+ 0011 0111
-----------
1001 0101
这里没有第九位进位,仍然发生有符号溢出。
因为保留下来的 1001 0101 按 8 位补码解释是 −107,不能表示数学结果 149。
反过来:
1111 1111 −1
+ 0000 0001 +1
-----------
1 0000 0000
舍弃第九位,结果为 0。
数学上:
完全正确,没有有符号溢出。
因此:
1 / 29判断有符号溢出,先学最省力的符号法
加法:
| 情况 | 是否可能有符号溢出 |
|---|---|
| 正数+正数,结果变成负数 | 有 |
| 负数+负数,结果变成非负数 | 有 |
| 一正一负相加 | 不会 |
记成:
同号相加,结果异号,发生溢出。
例如:
- :可能超出上界。
- :可能超出下界。
- :一正一负相加,不会超出两端边界。
减法:
两个操作数异号,且结果符号与被减数不同,发生溢出。
例如:
正数减负数,本来应该更大;保留下来的结果若成了负数,就出现了溢出。
初学做题时,最好再用真值范围检查一遍。这样不容易被符号口诀绕进去。
1 / 30讲义的进位判定法:进入符号位与移出符号位比较
以 8 位加法为例:
- :从第 6 位进入第 7 位,即进入最高符号位的进位。
- :从第 7 位向外,即移出最高符号位的进位。
有符号溢出标志:
异或的意思是:
- 两个相同,结果为 0。
- 两个不同,结果为 1。
所以:
| 结论 | |||
|---|---|---|---|
| 0 | 0 | 0 | 无有符号溢出 |
| 0 | 1 | 1 | 有 |
| 1 | 0 | 1 | 有 |
| 1 | 1 | 0 | 无 |
**注意讲义的记号:它把移出最高位记为 CP,把进入符号位记为 CF。这里的 CF 不是通常 x86 资料中 Carry Flag 的同一命名用法。**为了减少混淆,我们用 。
切换下面四道习题,重点观察:有进位时可能不溢出,没有进位时也可能溢出。
CPU 可以根据这些运算信号更新状态标志,例如 x86 的 OF。程序再根据标志决定后续处理。
对无符号加法,判断是否超过无符号范围,则看向外进位等相应条件。必须先明确题目采用哪种数值解释。
1 / 31习题 1.8:四组结果与溢出判断
| 组别 | 两个补码 | 对应真值 | 数学结果 | 保留的 8 位结果 | 有符号溢出 | |
|---|---|---|---|---|---|---|
| ① | 01H、FFH | 1、−1 | 0 | 0000 0000 | 1,1 | 无 |
| ② | 5EH、37H | 94、55 | 149 | 1001 0101 | 1,0 | 有 |
| ③ | 9EH、C5H | −98、−59 | −157 | 0110 0011 | 0,1 | 有 |
| ④ | 6EH、84H | 110、−124 | −14 | 1111 0010 | 0,0 | 无 |
四个竖式:
① 0000 0001
+ 1111 1111
-----------
1 0000 0000
② 0101 1110
+ 0011 0111
-----------
1001 0101
③ 1001 1110
+ 1100 0101
-----------
1 0110 0011
④ 0110 1110
+ 1000 0100
-----------
1111 0010
② 保留位串按补码读成 −107;③ 保留位串按补码读成 +99。它们都不能表示相应的正确数学结果。
这类题完整答案应包括:保留位串、是否溢出、判断依据。只写一个二进制结果不够。
学到这里可以先停一下。你若能独立做完 1.5—1.8,第一章最主要的数值计算基础就建立起来了。
第1章 · 讲解单元 32—33
1.3.4 定点与浮点表示
掌握要求:理解小数点的约定位置,认识单精度 S、E、F 字段和一个完整编码例子。
为什么讲到这里:浮点帮助解释精度、范围与误差。本章先理解表示,不要求提前练复杂浮点加减、舍入算法。
1 / 32定点数:小数点的位置事先约定
定点的意思是:
小数点位置固定,而且通常不需要把小数点本身存进去。
最简单的是整数:
0001 1000
按无符号整数解释,它是:
如果约定最低四位是小数部分,相当于除以 ,同一个位串就表示:
所以:
定点数不一定没有小数,它只是小数点位置固定。
若用 位表示小数,最小步长通常是:
这帮助你理解一个取舍:固定位宽下,给小数部分的位越多,分辨率越细,整数范围通常就越小。
本章先理解这个思想,不需要立刻学习各种定点数格式的完整运算规则。
1 / 33浮点数:把有效数字和数量级分开保存
十进制科学计数法:
二进制也可以这样表示:
所以可以分别保存:
- 正负号。
- 指数。
- 有效数字相关部分。
讲义用“尾数”和“阶码”说明这个思想。
指数主要决定可表示的数量级范围;有效数字位数主要决定精度。
IEEE 754 常见两种格式:
| 格式 | 总位数 | 符号位 S | 阶码字段 E | 小数字段 F |
|---|---|---|---|---|
| 单精度 binary32 | 32 | 1 | 8 | 23 |
| 双精度 binary64 | 64 | 1 | 11 | 52 |
单精度规格化数的解释公式为:
双精度规格化数则使用偏置 1023。
注意:
- 阶码字段存的是偏置后的编码,不是直接把实际指数写成补码。
- 单精度规格化数有一个隐含的前导 1,所以有效精度是 24 个二进制位,虽然 F 只存了 23 位。Oracle 的 IEEE 浮点格式说明
看 6.5:
所以:
S = 0
E = 2 + 127 = 129 = 1000 0001
F = 101 后面补 0,直到共 23 位
完整字段:
0 | 10000001 | 10100000000000000000000
十六进制表示为:
40D00000H
特殊阶码还用于表示:
| 单精度条件 | 含义 |
|---|---|
| E=0,F=0 | 正零或负零 |
| E=0,F≠0 | 非规格化数 |
| E=255,F=0 | 正无穷或负无穷 |
| E=255,F≠0 | NaN,非数值 |
讲义的约 到 是对单精度正常数量级的概括;还有非规格化数,不能把它当完整边界。
本章掌握到这里即可:
- 说明定点与浮点的区别。
- 知道单精度、双精度字段长度。
- 理解范围和精度的区别。
- 能跟着完成 6.5 这样的简单编码例子。
- 知道浮点数可能近似表示,位数更多也不意味着任何实数都能精确保存。
复杂浮点加法、舍入证明、规格化运算,本章没有要求你先学会。
第1章 · 讲解单元 34—41
1.3.5 BCD、ASCII 与字符串存储
掌握要求:能区分数值与字符编码,会算 BCD 位数、查 ASCII、数控制字符并画存储表。
为什么讲到这里:Unicode 与 UTF-8 是为防止把“一字符一字节”背成通则;先知道边界,不必背完整编码表。
1 / 34BCD:逐个十进制数字编码【重点】
BCD 是 Binary Coded Decimal,二进制编码的十进制数。
本章使用 8421 BCD,每个十进制数字各占四位:
0 → 0000
1 → 0001
……
9 → 1001
例如十进制 59:
5 → 0101
9 → 1001
BCD:0101 1001
但普通二进制的 59 是:
0011 1011
因为:
因此:
两者表示同一个数值,但采用不同编码规则。
再看讲义例子:
BCD 是:
0001 0011 0101
即逐位编码 1、3、5。
小数也可以逐位编码,但小数点的位置需要另行约定或记录,并不是凭空多出一个二进制“小数点字符”。
1 / 35压缩 BCD、非压缩 BCD、ASCII 数字,怎么区分?
对于 59:
| 表示方式 | 存储内容 | 占用 |
|---|---|---|
| 普通二进制,按 8 位容器存 | 0011 1011 | 1 字节 |
| 压缩 BCD | 0101 1001 | 1 字节 |
| 非压缩 BCD | 0000 0101、0000 1001 | 2 字节 |
ASCII 字符串 "59" |
0011 0101、0011 1001 | 2 字节 |
按本章约定:
- 压缩 BCD:一个字节装两个十进制数字。
- 非压缩 BCD:一个字节装一个十进制数字,高四位为 0000。
- ASCII 数字字符:使用字符编码,例如
'5'是 35H。
BCD 的代价是,一组四位本来有 16 种状态,只使用其中 10 种。1010~1111 不是合法的单个 8421 BCD 数字。
为什么还要使用它?因为它与十进制逐位对应,便于处理、显示某些十进制数据。不是所有信息表示方式都只追求最省位数。
BCD 运算还需要调整。例如:
0111 7
+ 0101 5
------
1100
1100 不是一个合法 BCD 数字。正确的十二应是:
0001 0010
对这种单个十进制位的加法,结果大于 9 或发生相应进位时,需要做十进制调整,常见办法涉及加 6。
你需要知道为什么要调整。本章没有要求你掌握各种处理器的完整 BCD 调整指令。
1 / 36习题 1.9:四位十进制数为什么只需十四位二进制?
这里“四位十进制数”指十进制位数,例如 0~9999,不是“四个二进制位”。
要覆盖 0~9999,需要至少 10000 种状态。
找最小的 ,使:
因为:
所以普通无符号二进制最少需要:
非压缩 BCD 中,一个十进制位占一个字节:
顺便比较:
- 压缩 BCD: 位。
- ASCII 保存四个数字字符:32 位,不含额外结束标记。
**本题问的是最少需要多少位,不是必须分配多少个整字节。**实际存储若按整字节分配,14 位数据通常要放入至少两个字节的容器。
1 / 37ASCII:字符 `'1'` 和数值 1 是两件事【重点】
ASCII 为字符分配编码。
标准 ASCII 有 128 个编码位置,范围为:
通常放入一个字节中保存,最高位为 0。
最值得熟悉的是:
| 字符或范围 | ASCII 十六进制 |
|---|---|
'0'~'9' |
30H~39H |
'A'~'Z' |
41H~5AH |
'a'~'z' |
61H~7AH |
| 空格 SP | 20H |
| 回车 CR | 0DH |
| 换行 LF | 0AH |
| 空字符 NUL | 00H |
| 删除 DEL | 7FH |
例如:
数值 1: 0000 0001
字符 '1': 0011 0001
它们不能直接混用。
若已知某字符是 ASCII 数字 '0'~'9',可以用:
例如:
标准 ASCII 的表和控制含义可以查官方早期规范,不必把讲义中个别排版异常的字形硬记下来。RFC 20
1 / 38ASCII 控制字符为什么也要讲?
因为字符序列里不仅有“看得见的字”。
例如:
第一行
第二行
换行也要通过某种约定表示。你看不到它的图案,它仍可能占存储空间。
讲义控制字符表里的内容,可以按用途认识:
| 用途 | 表中代表项 |
|---|---|
| 空、响铃、删除等 | NUL、BEL、DEL |
| 排版和位置控制 | BS、HT、LF、VT、FF、CR |
| 文本或传输边界 | SOH、STX、ETX、EOT、ETB |
| 通信询问与确认 | ENQ、ACK、NAK、SYN |
| 设备及状态控制 | DC1~DC4、CAN、EM、SUB |
| 转义与切换 | ESC、DLE、SO、SI |
| 分隔 | FS、GS、RS、US |
你不需要现在背完这些缩写。本章做题最需要 CR、LF、SP,以及知道不可见字符也要编码存储。
其中:
- CR:回车,历史上对应回到行首。
- LF:换行,历史上对应向下一行移动。
- 空格:不显示笔画,但不是没有字符;它占一个 ASCII 字节。
不同文本约定可能用 LF,也可能用 CRLF。题目指定什么,就按什么算。
1 / 39字符并不总是一个字节:这句补充有必要知道
讲义说字符串每个字节放一个字符,适用于它正在讨论的 ASCII 字符串模型。
不能推广成:
所有语言中的每个字符永远占一个字节。
中文、弯引号、全角标点等,不能直接用标准 ASCII 表示,需要其他字符编码。
这里提这件事,是因为习题 1.10 的排版中就出现了弯引号等问题。不是要求你现在深入学习 Unicode,而是避免遇到非 ASCII 字形还强行查 ASCII 表。
1 / 40字符串存储:地址顺序与字的高低位顺序要分开
考虑四个字符:
It's
使用普通 ASCII 撇号时,其字节为:
49H 74H 27H 73H
按照字符串地址递增读取,总是:
I → t → ' → s
若把这四个字节作为一个 32 位字观察,字节对应到高低数位的方式,可以采用大端或小端格式。
- 大端:低地址字节对应这个多字节数的高位。
- 小端:低地址字节对应这个多字节数的低位。
切换下面的格式,观察两种视图:
同一个 ASCII 字符串的字节地址顺序不需要反转。
出现反序的是:把字节按“32 位字的最高字节到最低字节”排列显示时,看到的左右顺序。
这是第二章大小端问题的提前入口。
1 / 41习题 1.10:完整编码与两种存放表
题目两行文字按 ASCII 题意规范为:
It's $19.9
OK!
先说明两个题面细节:
- 排版里的弯撇号
’不属于 ASCII,这里按普通英文撇号',编码 27H;叹号按半角!,编码 21H。 - 下面先按两行末尾都有 CR+LF计算。若最后一行末尾没有换行,再扣除最后两个字节。
第一行可见字符数:
I t ' s 空格 $ 1 9 . 9
共 10 个。
加 CR、LF 后为 12 字节。
第二行:
O K !
共 3 个。加 CR、LF 后为 5 字节。
总共:
完整地址顺序:
| 相对字节地址 | 字符 | ASCII |
|---|---|---|
| 0 | I | 49H |
| 1 | t | 74H |
| 2 | ' | 27H |
| 3 | s | 73H |
| 4 | 空格 | 20H |
| 5 | $ | 24H |
| 6 | 1 | 31H |
| 7 | 9 | 39H |
| 8 | . | 2EH |
| 9 | 9 | 39H |
| 10 | CR | 0DH |
| 11 | LF | 0AH |
| 12 | O | 4FH |
| 13 | K | 4BH |
| 14 | ! | 21H |
| 15 | CR | 0DH |
| 16 | LF | 0AH |
32 位一字=4 字节。从字起始位置存,需要占及:
字符串内容是 17 字节,不是因此变成 20 字节;最后一个字还有三个字节未由题目指定。
下面统一按照“每个字从高位字节到低位字节”的顺序画表。
方式一:字符按高位到低位排列,对应大端字视图。
| 字的起始相对地址 | 31~24 位 | 23~16 位 | 15~8 位 | 7~0 位 |
|---|---|---|---|---|
| 0 | 49 | 74 | 27 | 73 |
| 4 | 20 | 24 | 31 | 39 |
| 8 | 2E | 39 | 0D | 0A |
| 12 | 4F | 4B | 21 | 0D |
| 16 | 0A | 未指定 | 未指定 | 未指定 |
方式二:字符按低位到高位排列,对应小端字视图。
| 字的起始相对地址 | 31~24 位 | 23~16 位 | 15~8 位 | 7~0 位 |
|---|---|---|---|---|
| 0 | 73 | 27 | 74 | 49 |
| 4 | 39 | 31 | 24 | 20 |
| 8 | 0A | 0D | 39 | 2E |
| 12 | 0D | 21 | 4B | 4F |
| 16 | 未指定 | 未指定 | 未指定 | 0A |
表内数值均为十六进制。
若只在两行之间存 CRLF,第二行末尾没有换行:
占及 4 个字。此时去掉相对地址 15、16 的两个字符即可。
**不要擅自额外加一个 NUL。**只有题目要求 C 风格的零结尾字符串等约定时,才加入结束字节。
第1章 · 讲解单元 42—51
1.4 嵌入式系统
掌握要求:会定义、举例,比较 MCU/MPU,解释嵌入式软件与 RTOS 的时间约束。
为什么讲到这里:DSP、FPGA、SoC、SOPC、ARM/MIPS 和发展史全部认识用途;现阶段不要求设计芯片或背旧型号。
1 / 42嵌入式系统:把计算机作为设备的一部分【习题 1.11】
可以这样理解:
为了实现某种特定功能,把计算机系统嵌入到设备或更大的系统中。
例如洗衣机里面的控制系统:
- 读取按键和传感器。
- 判断洗涤阶段。
- 控制电机、阀门等。
- 按规定流程完成任务。
它主要服务于洗衣机的功能。
按讲义回答定义:
嵌入式系统是以应用为中心、以计算机技术为基础,软硬件可以裁剪,适应具体应用对功能、可靠性、成本、体积和功耗等要求的专用计算机系统。
三个关键词:
主要特点包括:
- 面向特定应用。
- 资源和功能按需求配置。
- 常对成本、功耗、体积有约束。
- 常需长期、稳定运行。
- 部分应用具有严格实时要求。
不是所有嵌入式系统都必须特别小,也不是所有嵌入式系统都必须运行实时操作系统。
1 / 43习题 1.12:十种以上实例
下面这些都能作为嵌入式系统应用的例子:
洗衣机控制器、空调控制器、冰箱控制器、微波炉控制器、路由器、打印机、数码相机、智能门锁、汽车发动机控制器、汽车防抱死制动控制系统、无人机飞行控制器、电梯控制器、工业仪表、智能电表、电子血压计。
答题时,写出设备里的具体控制或处理系统更清楚。例如“汽车发动机控制器”,比只写“汽车”更准确。
1 / 44MPU、MCU、DSP、SoC:不要把四个缩写混成一类
| 名称 | 本章含义 | 主要强调什么 |
|---|---|---|
| MPU/EMPU | 微处理器/嵌入式微处理器 | 处理能力,配合其他部件构建系统 |
| MCU/EMCU | 微控制器,常称单片机 | 在芯片内集成处理器、存储器及外设等 |
| DSP | 数字信号处理器 | 针对信号处理所需运算优化 |
| SoC | 片上系统 | 把系统的多种功能集成到芯片中 |
它们的分类角度并不完全相同。一个 SoC 可以包含 CPU、DSP、存储控制器及多种接口。
习题 1.13,MCU 与 MPU 的核心区别这样理解:
| 比较 | 典型 MCU | 典型 MPU 系统 |
|---|---|---|
| 集成方式 | 常把 CPU、RAM、程序存储器和外设集成到同一芯片 | 常配合外部主存和存储设备 |
| 常见取向 | 控制、低成本、低功耗、确定响应 | 较强计算能力、较大内存、复杂应用 |
| 系统搭建 | 所需外部部件通常较少 | 外部存储与电源等配套往往更复杂 |
| 软件 | 可裸机,也可运行 RTOS 等 | 常见复杂操作系统,也可采用其他软件方案 |
讲义说“MPU 内部没有存储器和外设接口”,只能当作早期简化模型。现代 MPU 往往集成缓存、控制器和多种接口,MCU/MPU 的边界也有所交叠。ST 对 MCU 与 MPU 的说明
答题抓住典型系统集成方式和应用取向,不要写成毫无例外的绝对区别。
1 / 45MCU 里那些外设,各有什么用?
讲义提到的部件,后面都可能碰到:
| 部件 | 主要作用 |
|---|---|
| ROM/Flash | 保存程序和常量等 |
| RAM | 保存运行中的变量和临时数据 |
| 中断控制器 | 管理需要及时响应的事件 |
| 定时器/计数器 | 计时、产生周期事件、统计脉冲等 |
| GPIO | 通用数字输入输出 |
| 串行/并行接口 | 与其他设备交换信息 |
| 看门狗 | 监测程序是否按预期运行,异常时触发恢复措施 |
| ADC | 模拟量转换为数字量 |
| DAC | 数字量转换为模拟量 |
例如测温:
温度传感器信号 → ADC → 程序处理 → 显示或控制
这一段与之后的接口、定时器、中断等章节直接相关,值得认识用途。现在不必先背所有寄存器配置。
讲义还提到嵌入式硬件可能强调温度范围、电压适应性、电磁兼容性、功耗和可靠性。这些是设计要求,“嵌入式”本身不自动保证某产品每项指标都更高。
1 / 46DSP、FPGA、SoC、SOPC:知道它们解决什么问题即可
DSP 面向数字信号处理,例如:
- 数字滤波。
- 音视频编解码。
- 信号特征提取。
- 通信信号处理。
这类任务往往涉及大量重复的乘加运算,因此处理器会针对这些运算和数据流进行优化。
讲义列出定点 DSP、浮点 DSP,以及 TI 的 C2000、C5000、C6000 等系列,目的是说明不同应用取向。暂时不背型号清单。
定点和浮点的精度还取决于位宽、定标和算法,不能一概认为定点必然“精度差”。
FPGA 是可配置逻辑器件,可以按设计实现专用电路。它也能承担数字信号处理,并与处理器结合。
SoC 强调系统功能集成到芯片里。
SOPC 强调在可编程芯片上构建系统。
讲义出现的配套术语:
| 术语 | 认识到什么程度 |
|---|---|
| EDA | 辅助电子系统设计的工具 |
| HDL | 描述硬件结构和行为的语言 |
| 网表 netlist | 描述电路部件及连接关系的表示 |
| IP 核 | 可复用、可授权的电路设计模块;这里的 IP 不是网络地址 |
| 综合 | 把设计转换为相应电路实现 |
| 仿真、验证 | 检查设计行为与要求是否一致 |
| 流片 tape-out | 把完成的芯片设计交付制造流程 |
| 系统内编程 | 在相应设备或系统中进行编程、配置或更新 |
**为什么要讲?**后面你会见到“ARM 内核+总线+存储器+外设”这种系统。这里是告诉你:它们可以通过模块复用和集成组成芯片。
现在不要求你会设计 SoC,也不要求你写 FPGA 工程。
1 / 47嵌入式软件分两层,也可以没有操作系统
复杂系统常见:
嵌入式应用软件
↓
嵌入式操作系统
↓
硬件
嵌入式操作系统负责:
- 任务调度。
- 内存分配和管理。
- 中断及定时相关管理。
- 任务之间的通信与同步等。
但简单应用也可以:
应用程序直接控制硬件
这种通常称为裸机方式。
例如,一个简单控制程序反复执行:
读取输入 → 判断状态 → 更新输出
未必需要操作系统。
因此:
嵌入式应用软件仍然要完成具体任务,并在满足功能、时间和可靠性要求的前提下,控制代码及资源开销。
1 / 48嵌入式操作系统的三个特点【习题 1.14】
按讲义回答:
| 特点 | 含义 |
|---|---|
| 实时性 | 对有实时要求的任务,在规定时间内完成响应和处理 |
| 可靠性 | 能长期稳定工作,并按需要具备诊断、恢复、告警等能力 |
| 可裁剪性 | 根据应用选择功能模块,减少不需要的资源开销 |
“可裁剪”例如:
- 不需要文件系统,就不配置该模块。
- 不需要图形界面,就不加入图形相关功能。
- 不需要网络,就不加入完整网络功能。
这样可以减少内存占用和系统复杂度。
不过,功能更少不自动证明系统更可靠,可靠性仍需要设计和验证。这里要理解的是:去除不必要功能,有助于控制复杂度。
1 / 49RTOS:“实时”最重要的是能否按时完成【习题 1.15】
RTOS 是实时操作系统。
假设某项控制任务要求:
事件发生后,必须在 10 ms 内完成响应。
两个系统:
| 系统 | 平时响应 | 最坏情况 | 是否满足这个要求 |
|---|---|---|---|
| A | 1 ms | 偶尔 100 ms | 不满足 |
| B | 5 ms | 可保证不超过 8 ms | 满足 |
因此:
平均速度很快,但偶尔严重拖延,仍可能不满足实时要求。
需要实时处理的典型场景:
- 汽车制动和部分车辆控制。
- 工业运动控制、电机控制。
- 无人机飞行控制。
- 某些医疗设备的控制任务。
- 需要规定时序的通信和采集任务。
这些场景可能采用 RTOS,也可能用经过设计与验证的裸机方案。装了 RTOS 也不等于整个系统自动保证期限,还要看任务、驱动、硬件及调度等。
补充认识两个词:
- 硬实时:错过期限不可接受。
- 软实时:偶尔错过期限会降低体验或服务质量,但后果通常不同。
这两个词有助于理解应用差别,本章先能举例即可。
1 / 50嵌入式系统发展史:记能力变化,不背四段长句
讲义概括为四个阶段:
| 阶段 | 主要变化 |
|---|---|
| 第一阶段 | 简单控制系统,直接编程,功能和资源较有限 |
| 第二阶段 | MCU 发展,开始配合简单操作系统 |
| 第三阶段 | 操作系统与开发接口成熟,支持多任务、网络、文件、图形等 |
| 第四阶段 | 与互联网、物联网结合,设备能够连接和协作 |
FPGA、SOPC 的发展,则提供了更灵活的硬件配置方式。
讲义提到 Intel 4004,是为了说明把处理器集成到芯片的重要意义。微处理器集成到一颗芯片,不等于把整台完整计算机的所有部件都集成进去了。
这一段属于发展背景。你需要知道能力怎样扩展,不必在本章记住早期芯片的晶体管数量和频率。
1 / 51ARM 与 MIPS:本章先建立名字和定位
Arm 的架构与处理器内核授权模式,在本课程中很重要:
芯片厂商可以基于获得授权的架构或内核,加入自己的存储器、接口和其他功能,形成具体芯片。
所以:
- ARM 内核不是完整的开发板。
- 采用同一内核的不同 MCU,外设、存储容量、封装等可以不同。
- 学会内核原理后,具体芯片仍要看对应手册。
讲义提到的早期 ARM7、ARM9、ARM11,知道它们是历史上的处理器系列即可。
Cortex 的三个常见方向值得记:
| 系列 | 主要方向 | 典型需求 |
|---|---|---|
| Cortex-A | 应用处理 | 较复杂的软件系统和应用 |
| Cortex-R | 实时处理 | 确定响应、可靠性等要求 |
| Cortex-M | 微控制器 | 控制、低功耗、资源受限等应用 |
这是定位区别,不是说只有 Cortex-R 才能做实时任务。Arm 的架构分类说明
讲义列举 STM32、i.MX、三星旧产品、StrongARM/XScale、OMAP 等,是说明同一架构生态下可以出现多种芯片。现阶段不必背全这些型号和历史市场比例。
书里还提到英伟达拟收购 Arm。该交易后来于 2022 年终止,不能读成已经完成。英伟达公告
MIPS 处理器架构也是本章介绍的一种 RISC 路线。名称来自早期“无内部互锁流水级的微处理器”的设计思想,讲义借它说明软硬件如何配合提高性能。
这里先知道:
- 它是一种处理器架构路线。
- 曾应用于工作站、服务器及多种嵌入式设备。
- 它与前面“每秒百万条指令”的 MIPS 单位不同。
讲义把龙芯与 MIPS 联系起来,反映了早期产品路线。后来龙芯推出了独立的 LoongArch,不能将所有龙芯产品都概括为 MIPS。龙芯关于 LoongArch 的说明
公司收购金额、市场份额预测、旧芯片出货量,对本章题目没有直接作用。知道这些是在介绍产业背景即可,不必为记不住它们停下主线。
第1章 · 讲解单元 52—53
第一章验收与自测
掌握要求:能脱离讲解完成自测,按习题定位表回查不足。
为什么讲到这里:“看得懂”只是第一步。计算题要在纸上独立完成,简答题要能说明因果。
1 / 52本章学会的标准:用这些动作检查,不靠“看着眼熟”
| 能完成的动作 | 对应习题 |
|---|---|
| 画出五大部件,解释存储程序思想 | 1.1 |
| 解释摩尔定律及发展受限的原因 | 1.2 |
| 解释 CPU、内存、外存、I/O 接口 | 1.3 |
| 列出系统软件并说明用途 | 1.4 |
| 独立完成十进制、二进制、十六进制转换 | 1.5 |
| 写出规定宽度的原码、反码、补码,并读回真值 | 1.6、1.7 |
| 做补码加减法,区分进位与有符号溢出 | 1.7、1.8 |
| 比较普通二进制、BCD 所需位数 | 1.9 |
| 查 ASCII、数不可见字符、画两种字视图 | 1.10 |
| 定义嵌入式系统并列举应用 | 1.11、1.12 |
| 比较 MCU、MPU | 1.13 |
| 说明嵌入式操作系统特点及 RTOS 的意义 | 1.14、1.15 |
另外,定点浮点、软件发展、SoC/FPGA/IP、ARM/MIPS 等内容,在本讲义中也全部覆盖。它们目前的要求是理解用途和关系,不必把每一项都练到能独立实现。
1 / 53短自测:先独立完成,再展开答案
- 8 位无符号整数最大是多少?8 位补码最大、最小是多少?
A6H的二进制是什么?- −44 的 8 位补码是什么?
1111 0010按 8 位补码解释,真值是多少?- 8 位补码中,127+1 是否溢出?有没有向第九位进位?
- −1+1 出现向第九位进位,是否发生有符号溢出?
- 十进制 59 的压缩 BCD 是多少?字符
'5'的 ASCII 是多少? - “实时系统平均很快就行”,这句话哪里有问题?
展开短自测答案与复习建议
- 无符号最大 255;补码最大 127、最小 −128。
1010 0110。1101 0100。- 。
- 有符号溢出;没有向第九位进位。
- 没有有符号溢出,结果为 0。
- 压缩 BCD 为
0101 1001;'5'的 ASCII 为35H。 - 必须考虑规定期限和最坏响应情况,平均快不能保证按时完成。
这一章最需要反复练的是第 2—7 题对应的计算方法。历史材料读懂后可以先放下;补码、溢出和字符存储,需要你能够离开讲解独立做出来。
第1章 · 章后习题全覆盖
15 道习题的答题卡
题意经过归纳,计算条件和原题号保持对应。先在纸上写出答案,再展开检查;需要看完整推导时,点击“回到完整讲解”。本节的短答案不能代替正文中的条件和过程。
习题 1.1 / 冯·诺依曼计算机的部件与设计思想
列出五大部件,并说明“存储程序”改变了什么。
展开答题要点
五大部件是运算器、控制器、存储器、输入设备、输出设备。程序与数据均可用二进制编码保存在存储器中,控制器按指令组织执行;通常顺序执行,也可通过转移改变顺序。CPU 的核心功能包括运算与控制。
习题 1.2 / 摩尔定律与发展限制
解释摩尔定律,并说明为什么不能把它理解为 CPU 速度永远按相同比例增长。
展开答题要点
摩尔定律描述集成电路晶体管集成数量随时间增长的经验趋势;常见表述约为每两年翻倍。限制包括功耗与散热、器件尺度效应、互连及制造复杂度和成本。晶体管数与实际任务执行速度不成固定比例,不宜把某一年当成一条自然定律的“失效日”。
习题 1.3 / CPU、内存、外存、I/O 接口
分别说明四个名词的用途。
展开答题要点
CPU 执行指令、进行运算并控制过程;内存保存正在使用的程序和数据;外存提供通常容量更大、可长期保存的信息存储;I/O 接口连接系统与外设,协调数据格式、速度、时序和状态。
习题 1.4 / 系统软件及用途
列出常见系统软件,并说清它们各负责什么。
展开答题要点
操作系统管理资源并提供运行环境;驱动程序控制设备;编译、汇编和链接等工具把源程序转化为可运行形式;系统服务和实用工具承担维护等任务。分类口径可能略有不同,关键是说明其系统支撑作用。
习题 1.5 / 十进制与十六进制互换
把 789AH、0CEFH 转为十进制;把 1234D、7890D 转为十六进制。
展开答题要点
结果依次为 30874、3311、4D2H、1ED2H。十六进制转十进制按权展开;十进制整数转十六进制用除 16 取余、逆序排列。
习题 1.6 / 六个数的 8 位补码
写出 19、63、−1、−44、127、−127 的 8 位补码。
展开答题要点
依次为:0001 0011、0011 1111、1111 1111、1101 0100、0111 1111、1000 0001。正数补码与普通二进制相同;负数可将对应正数的全部 8 位取反再加 1。
习题 1.7 / 编码后运算与运算后编码
按 8 位表示 x=33、y=−64,写出原码、反码,并计算四种补码表达式。
展开答题要点
x 的原码、反码均为 0010 0001;y 的原码为 1100 0000,反码为 1011 1111,补码为 1100 0000。保留低 8 位:[x]补+[y]补=1110 0001,[x]补−[y]补=0110 0001;[x−y]补=0110 0001,[x+y]补=1110 0001,分别对应 97 和 −31。
习题 1.8 / 四组补码加法与溢出
计算讲义习题 1.8 的四组补码和,并判断有符号溢出。
展开答题要点
| 组 | 保留低 8 位 | 读回真值 | 有符号溢出 |
|---|---|---|---|
| ① | 0000 0000 | 0 | 否 |
| ② | 1001 0101 | −107 | 是,数学结果为 149 |
| ③ | 0110 0011 | 99 | 是,数学结果为 −157 |
| ④ | 1111 0010 | −14 | 否 |
也可用进入符号位与移出符号位的进位异或判断:①为 1/1,②为 1/0,③为 0/1,④为 0/0。
习题 1.9 / 四位十进制数需要多少位
覆盖无符号四位十进制数的全部取值,需要多少普通二进制位?非压缩 BCD 呢?
展开答题要点
取值为 0~9999,共 10000 种,因 2¹³<10000≤2¹⁴,所以至少 14 位。非压缩 BCD 每位十进制数字占 1 字节,需 32 位;压缩 BCD 则为 16 位。
习题 1.10 / ASCII、控制字符与两种字视图
为两行 It's $19.9 与 OK! 编码,计入空格与 CR/LF,并按 32 位字比较两种字节序。
展开答题要点
按正文约定,把排印弯引号、全角感叹号规范为 ASCII,且每行末尾均计 CR/LF,共 17 字节、5 个 32 位字。字节序列为 49 74 27 73 20 24 31 39 2E 39 0D 0A 4F 4B 21 0D 0A。若最后一行不含 CR/LF,则为 15 字节、4 个字。正文给出了完整地址表和两种字视图;补齐字节不能擅自假定为字符串终止符。
习题 1.11 / 嵌入式系统的含义和特点
用自己的话定义嵌入式系统,并概括其特点。
展开答题要点
它是嵌入设备或产品、面向特定应用的计算机系统。抓住嵌入性、专用性及软硬件协同;常受到体积、功耗、成本、资源与响应时间限制。不是“凡是体积小都叫嵌入式”,也不必然带操作系统。
习题 1.12 / 至少十种应用实例
给出至少十种,并指出其控制、监测或处理任务。
展开答题要点
可举洗衣机控制器、微波炉、空调控制器、汽车发动机控制器、ABS 控制器、数码相机、打印机、路由器、智能电表、医疗监护仪、工业机器人、无人机飞控等。列举设备时说明其中嵌入的计算或控制功能,比只列品牌更清楚。
习题 1.13 / MCU 与 MPU 的主要差别
从集成资源与适用任务比较 MCU 和典型嵌入式 MPU。
展开答题要点
MCU 常把处理器内核、片上存储和多类控制外设集成在一片芯片中,适合控制与资源受限任务;典型 MPU 系统强调处理能力与较复杂软件,常配置外部存储。区别是集成取向与应用侧重,不能背成“MPU 一律没有外设、MCU 一律不能跑操作系统”。
习题 1.14 / 嵌入式操作系统的特点
按讲义概括主要特点,并说明每一项的意义。
展开答题要点
通常强调可裁剪和资源适应性、针对应用的实时响应能力、可靠性与稳定性;具体要求取决于应用。不是每个嵌入式操作系统都必须提供相同强度的硬实时保证。
习题 1.15 / RTOS 与应用场景
说明实时操作系统关心什么,并举出需要确定响应期限的场景。
展开答题要点
RTOS 关注任务能否在规定期限内完成,强调可预测、确定的响应,而不只看平均速度。可举工业闭环控制、汽车控制、飞控或特定医疗设备中的实时任务;具体期限与保证要求由应用确定。
原讲义正文第 36—82 页
CHAPTER 02 · 第二章计算机系统的基本结构与工作原理
这一章最重要的目标是:
看到一条指令,能说清:地址从哪里来,数据经过哪里,哪个部件发控制信号,结果存到哪里,下一条指令怎么确定。
后半章的流水线、超标量、多核,都是在这套基本过程上提高效率。
内容较多,你实际学习可以分三段:**先学存储与 CPU,再学指令执行,最后学并行技术和性能评测。**以下完整保留全章内容。
第2章 · 讲解单元 01—01
第二章学习目标与阅读路线
掌握要求:看到指令能追踪地址、数据、控制信号和结果去向。
为什么讲到这里:全章较长,可按“存储与 CPU—指令执行—并行和性能”分三次学;完整内容都保留在这里。
2 / 01先划重点:这一章需要学到什么程度
| 内容 | 要求 |
|---|---|
| 体系结构、组成、实现、层次模型 | 能区分概念,说明彼此关系 |
| 地址空间、存储体、对齐、大小端 | 能计算、画图、解释访问过程 |
| ALU、寄存器、PC、IR、PSW、控制器 | 知道各自保存什么、负责什么 |
| 微操作、微指令、微程序 | 能区分,解释两种控制器 |
| 指令含义、加载存储、执行流程 | 能逐步写出一条指令的执行过程 |
| CISC、RISC | 能比较设计思路与取舍 |
| 流水线、三类冒险、分支预测 | 本章理解难点,必须能举例分析 |
| 超标量、超线程、多处理器、多核 | 能区分“增加了什么”“共享什么” |
| 安达尔定律、性能计算 | 会代公式,理解为什么不能无限加速 |
| 8086、Pentium、ARM7、ARM9 | 掌握讲义用于说明结构的特点及对应习题 |
| 历史人名、旧型号、市场故事、测试工具清单 | 知道用途,不必背全部细节 |
第2章 · 讲解单元 02—04
2.1 计算机系统的基本结构
掌握要求:区分体系结构、组成和实现,解释层次模型与冯·诺依曼瓶颈。
为什么讲到这里:分层让你知道问题属于哪一层;不必现在实现完整编译器或操作系统。
2 / 02体系结构、计算机组成、计算机实现,分别研究什么?【习题 2.1】
用一个例子区分。
假设计算机支持:
ADD R1, R2, R3
规定它表示:
这属于程序员能够看到的规则。
但处理器内部可以用不同方式完成:
- 一个加法器分多步处理。
- 多个部件配合处理。
- 使用不同流水线。
- 使用不同控制器。
再往下,还要决定使用什么电路工艺、怎样布线、怎样供电散热。
| 层次 | 主要研究 | 例子 |
|---|---|---|
| 体系结构 | 机器向程序员提供什么功能和规则 | 指令集、寄存器、寻址方式 |
| 计算机组成 | 内部部件怎样组织起来实现这些功能 | 数据通道、控制器、流水线、Cache |
| 计算机实现 | 怎样把设计做成具体电路与产品 | 工艺、布局布线、电源、封装、散热 |
三者关系:
体系结构规定功能,组成安排实现这些功能的部件与联系,实现技术把它们做成实际硬件。
同一指令集,可以有不同的内部组织,因此可以出现软件指令层面相近、性能却不同的处理器。
2 / 03层次模型:为什么需要分层?
因为直接从高级语言一路研究到晶体管,问题太复杂。
讲义的层次,可以整理为:
| 从上到下 | 主要内容 |
|---|---|
| 用户程序层 | 用户需要完成的任务 |
| 语言处理层 | 编译、解释等 |
| 操作系统层 | 资源管理及系统服务 |
| 指令系统层 | 机器指令及其规则 |
| 微体系结构层 | 控制器、数据通道,以及某些实现中的微程序等 |
| 数字逻辑层 | 门电路、寄存器等实际逻辑部件 |
分层是观察和设计的方法,不表示每条机器指令运行时都必须“再经过一次编译器和操作系统”。
程序编译之后,CPU 可以直接执行其中的机器指令;需要系统服务时,再按照约定请求操作系统。
讲义说“软硬件在逻辑上等价”,主要想表达:
某些计算功能既可以由专用硬件完成,也可以由软件组合较基础的操作完成。
但两者在速度、能耗、成本和开发方式上可能差别很大。
本节学到能解释这种分工即可,不需要推导完整的分层理论。
2 / 04模型机与冯·诺依曼瓶颈【习题 2.2】
讲义模型机包含:
- CPU。
- 存储器。
- I/O 接口。
- 连接它们的地址、数据、控制总线。
指令和数据放在同一存储系统中,通过共用通路访问。
问题在于:
CPU 想取下一条指令时,前一条指令也可能正在访问数据。两种需求争用同一通路。
再加上 CPU 运算速度与主存访问速度存在差距,处理器可能花时间等待信息。
这就是本章强调的技术瓶颈:
- 处理器与存储系统之间的速度和带宽差距。
- 取指令与访问数据竞争共享资源。
后面介绍的 Cache、多总线、分离指令数据通路、流水线等,都与这些问题有关。
注意:简单模型里的共享通路是一种组织方式,不能据此认为所有现代处理器内部都只有一条总线。
第2章 · 讲解单元 05—12
2.2 存储器与总线
掌握要求:会算地址空间、画字节存储体,能区分对齐与大小端并说明读写过程。
为什么讲到这里:开机和存储分级是程序运行的背景,缓存、虚拟存储等更深入机制留到相应章节。
2 / 05开机时,程序是从哪里来的?
普通 RAM 掉电后不能保存有效内容。
但这不等于重新上电后每个位置自动为 0。初始化之前,不能随便把其中内容当有效数据使用。
系统需要某种非易失存储保存启动代码,例如 ROM 或 Flash。启动后大致经历:
复位入口
→ 执行启动代码
→ 初始化必要硬件和内存
→ 建立运行环境
→ 执行后续程序
具体系统可能把程序从外存调入 RAM,也可能直接从 Flash 执行,不能把某一种启动方式看成所有计算机的唯一方式。
这里要理解:
- 非易失存储负责保留必要代码和数据。
- RAM 用于程序运行时的数据和工作空间。
- 需要长期保存的信息,要按系统约定保存到非易失存储中。
2 / 06地址位数、数据总线位数、机器字长,不能混用【重点】
这三个参数回答不同问题:
| 参数 | 回答的问题 |
|---|---|
| 地址位数 | 可以区分多少个地址 |
| 数据总线位数 | 一次数据传输可以并行传多少位 |
| 机器字长 | 本课程模型中,处理器主要整数处理宽度是多少 |
例如:
数据总线 16 位,地址总线 24 位,按字节编址。
可以有:
所以地址空间为:
地址范围:
不能因为数据总线是 16 位,就说只能访问 字节。
同样,一次传 16 位,不表示每个地址对应 16 位。题目明确按字节编址,每个地址仍对应一个字节。
讲义常把这些二进制容量写作 MB、GB;这里用 MiB、GiB 把含义写得更明确。
2 / 07习题 2.6:怎样既传一个字,又能只传其中一个字节?
采用两个 8 位字节存储体并行连接。
总空间为 16 MiB,平均分成:
每体有:
连接方式:
| 部分 | 连接 |
|---|---|
| 低字节存储体数据口 | D7~D0 |
| 高字节存储体数据口 | D15~D8 |
| 两体内部行地址 | 共用 A23~A1 |
| 读写控制 | 送往两个存储体 |
| 字节选通信号 | 分别控制低、高字节存储体是否参与 |
以类似 8086 的小端字节组织方式为例:
- 偶地址字节放低字节存储体。
- 奇地址字节放高字节存储体。
- 偶地址开始的一个 16 位字,两个存储体同时输出即可。
若仿照 8086,用 A0 和低有效的高字节使能 控制:
| A0 | 参与传输的部分 | |
|---|---|---|
| 0 | 1 | 低字节 |
| 1 | 0 | 高字节 |
| 0 | 0 | 两个字节 |
| 1 | 1 | 两者均不选 |
这是一个可采用的接口设计,不是说任何 16 位处理器都必须使用同名引脚。
讲义还用 8086 举例:20 位地址、16 位数据,其总空间为 1 MiB,两个字节存储体各为 512 KiB,原理相同。
2 / 08对齐存放:为什么四字节数据最好从 4 的倍数地址开始?【习题 2.5】
本章 32 位字占 4 字节。
自然对齐要求:
因此:
0、4、8、12……
都是对齐地址。
假设一次能访问的对齐块是:
第 0 块:地址 0、1、2、3
第 1 块:地址 4、5、6、7
一个四字节数据:
- 从地址 0 开始:全部位于第 0 块。
- 从地址 1 开始:占地址 1、2、3、4,跨越两块。
在这种简化总线模型下,第二种情况要分次访问,再拼出完整数据。
下面同时展示对齐与大小端。起始位置和字节序是两个独立问题。
习题 2.5 可以这样答:
32 位数据若未按四字节边界对齐,可能跨越两个对齐存储块,需要多次访问及数据组合,降低访问效率。例如从地址 1 存放一个四字节字,会占用地址 1~4。
再补充一个实际限制:是否允许非对齐访问,还取决于处理器、指令和存储区域。有些情况会产生异常,不能把讲义“没有硬性规定”理解成任何访问都允许不对齐。Arm 关于对齐要求的说明
2 / 09大小端:先拆成字节,再填地址
假设:
从高位到低位拆成:
12 34 56 78
| 地址 | 小端 | 大端 |
|---|---|---|
| m | 78 | 12 |
| m+1 | 56 | 34 |
| m+2 | 34 | 56 |
| m+3 | 12 | 78 |
记忆规则:
- 小端:低有效字节放低地址。
- 大端:高有效字节放低地址。
这里“高低”说的是在整个数中的权重。
不是把一个字节里的各个二进制位倒过来,也不是把所有字符串倒过来。
讲义的两个字:
W0 = 44332211H
W1 = 88776655H
按地址递增观察:
小端:11 22 33 44 | 55 66 77 88
大端:44 33 22 11 | 88 77 66 55
做题步骤固定:确定数据宽度 → 拆字节 → 确定大小端 → 按地址填表。
2 / 10读、写、块传送:地址、数据、命令分别从哪里走?
读操作:
- CPU 提供目标地址,送到地址总线。
- 控制器发读命令。
- 存储器把所选内容送到数据总线。
- CPU 接收数据。
普通内存读完后,原内容不因这次读取而改变。
写操作:
- CPU 提供目标地址。
- CPU 把要写的内容送到数据总线。
- 控制器发写命令。
- 存储器在规定时序下保存数据,覆盖目标位置原内容。
要分清:
- 地址总线上是“去哪里”。
- 数据总线上是“传什么”。
- 控制线上是“读还是写”等控制信息。
讲义还介绍连续块传送:协议若允许根据首地址、传输宽度、方向和长度推导后续地址,就能减少重复地址开销。
这需要双方支持相应协议,不是 CPU 随便发一次地址,任何存储器都会自动继续传输。这与第四章讲过的突发传输相联系。
2 / 11习题 2.14:同一总线上的 A→B,能否一个总线周期完成?
按本章“CPU 发起一次读或一次写”的普通存储器模型:
过程:
A 单元 → CPU 内部暂存位置
CPU 暂存位置 → B 单元
第一步访问 A 的地址并读取,第二步访问 B 的地址并写入。
总线够宽,只能说明一份数据不需要拆成多个数据片段,不能把读 A 和写 B 自动合并成同一次访问。
一条复杂机器指令可以包含这两个过程,但“一条指令”不等于“一个总线周期”。
2 / 12存储器分级:这一节与第三章怎样接上?
讲义这一节建立基本关系:
| 层级 | 主要角色 | 典型取舍 |
|---|---|---|
| 寄存器 | CPU 直接使用的少量工作数据 | 快、少 |
| Cache | 保存近期或可能需要的指令和数据 | 较快、容量有限 |
| 主存 | 程序运行的主要工作空间 | 较大,访问慢于寄存器等 |
| 外存 | 大量持久信息 | 容量大,访问延迟通常更高 |
Cache 常用 SRAM,主存常用 DRAM。
分级的目的,是综合容量、速度、成本,而非找到一个各方面都最好的单一存储器。
第三章已经进一步讲过 Cache、局部性和虚拟存储,这里无需再背一遍具体电路,但要知道它们在整个系统中的位置。
第2章 · 讲解单元 13—21
2.3 CPU 的内部结构
掌握要求:认识 ALU、寄存器、PSW、PC、IR、控制器与数据通道,区分三个“微”概念。
为什么讲到这里:知道两类控制器的取舍即可;本章不要求编写真实 CPU 的微程序。
2 / 13CPU 内部部件,先按“保存、计算、控制、连接”分类
| 类别 | 部件 | 作用 |
|---|---|---|
| 保存 | 通用寄存器、PC、IR、状态寄存器等 | 保存数据、地址、指令或状态 |
| 计算 | ALU、移位器、乘法器、FPU 等 | 处理数据或计算地址 |
| 控制 | 指令译码器、操作控制器等 | 产生完成指令所需的控制信号 |
| 连接 | 内部总线、地址和数据缓冲器等 | 在部件间传送信息 |
看到 CPU 结构图时,不要先试图背所有箭头。
先问:
哪些位置保存值?哪些部件改变值?谁决定什么时候传送和改变?
2 / 14运算器:ALU、累加器、暂存器、FPU,各做什么?
- ALU:完成算术、逻辑、移位等操作。
- ACC 累加器:在某些模型或指令中,保存操作数或运算结果。
- 暂存器:保存内部处理中需要的中间值,可能不对程序员直接可见。
- FPU:专门处理浮点运算。
没有 FPU,也能用软件组合整数操作实现浮点算法,只是实现方式和效率不同。
讲义提到的加法器、先行进位、移位器,是在说明运算电路的基础。先行进位主要用于减少等待进位逐级传播的延迟。
累加锁存器、暂存器等,则帮助分隔不同时间阶段的数据,避免当前运算所需的输入被结果更新干扰。
本章需要知道它们为什么存在,不要求你现在画出完整门电路。
另外,不能把累加器理解成“所有处理器做任何加法都必须经过一个叫 ACC 的寄存器”。具体使用哪些寄存器,由指令集和内部组织决定。
2 / 15PSW 是什么?【习题 2.7,联系第一章】
**程序状态字 PSW,是描述处理器当前状态的一组位。**保存它的部件可称状态寄存器、标志寄存器等,具体名字随架构不同。
本章分两类:
| 类型 | 内容 |
|---|---|
| 状态标志 | 运算结果的特征 |
| 控制标志 | 对处理器行为的控制状态 |
常见状态位:
| 标志 | 主要含义 |
|---|---|
| Z | 保留的运算结果是否为零 |
| N/S | 保留结果的最高位等符号相关信息 |
| C/CF | 进位等无符号运算信息,具体规则看架构 |
| V/OF | 有符号溢出 |
第一章已经学过:
例如,8 位计算:
127 + 1 → 1000 0000
保留结果最高位为 1,但数学结果是正的 128。此时必须结合溢出标志理解,不能只凭 N 判断数学结果。
还有一个讲义需要修正的地方:
**Arm 减法中,C=1 通常表示没有借位;C=0 表示发生借位。**不能简单背成“C=1 就是有借位”。Arm 的 Carry flag 说明
控制位方面,讲义用 8086 举例:
- D/DF:串操作中的地址变化方向。
- I/IF:是否允许响应可屏蔽外部中断。
- T/TF:单步调试相关控制。
不同架构不能混记。例如 8086 的 IF=1 表示允许可屏蔽中断,而传统 Arm CPSR 的 I=1 表示屏蔽 IRQ。
2 / 16寄存器与主存有什么区别?【习题 2.8】
| 比较 | 寄存器 | 主存 |
|---|---|---|
| 位置 | CPU 内部 | 属于主存系统 |
| 容量 | 通常较少 | 通常较大 |
| 访问方式 | 指令中的寄存器编号等 | 通过内存地址 |
| 主要用途 | 当前运算、地址及状态 | 程序代码和运行数据 |
| 访问速度 | 通常更快 | 通常较慢 |
CPU 寄存器分为:
- 通用寄存器:保存数据、地址或结果等。
- 专用寄存器:具有特定职责,例如 PC、IR、状态寄存器。
本章还出现 SP,栈指针。
栈按后进先出方式使用:
先压入 A,再压入 B
先弹出 B,再弹出 A
SP 用来跟踪栈顶位置。SP 本身保存的是相关位置,不是把整个栈都装在这个寄存器里。
栈的具体增长方向、压栈和弹栈规则,后续结合指令再深入。
2 / 17控制器各部分做什么?【习题 2.9】
| 部件 | 作用 |
|---|---|
| PC,程序计数器 | 提供指令地址,跟踪执行位置 |
| IR,指令寄存器 | 保存当前取得、需要处理的指令 |
| ID,指令译码器 | 分析操作码,识别指令要求 |
| OC,操作控制器 | 结合时序、状态等产生控制信号 |
| 地址生成部件 | 根据指令信息和寄存器等计算有效地址 |
最重要的区别:
不是都存“下一条指令”。
例如:
PC = 20000004H
内存 20000004H 中保存 LDR 的机器码
取指后:
IR ← 这条 LDR 的机器码
PC 则按约定更新为后续指令位置。
在真实流水线处理器中,取指位置、正在执行位置以及程序员读到的 PC 值可能不同。本章先按模型机的明确约定分析。
2 / 18PC 到底加 1、加 2,还是加 4?
取决于:
- 地址的计量单位。
- 当前指令长度。
- 是否发生控制转移。
本章模型机:
- 按字节编址。
- 一条指令固定 32 位=4 字节。
顺序执行时:
如果某模型按字计数,一个指令占一个字,可以表现为 PC+1。
如果采用变长指令,按当前指令的字节长度更新。
遇到跳转时,则按转移规则确定目标地址。
因此,不要背成“CPU 每执行一条指令,PC 一定加 1”。
2 / 19微操作、微指令、微程序:分清三个层次【习题 2.10】
考虑:
ADD R1, R2, R3
它的功能是:
内部需要若干更细的动作,例如:
- 读取 R2。
- 读取 R3。
- 选择 ALU 加法功能。
- 将结果写入 R1。
- 按指令规定更新状态。
这些细化动作叫微操作。
在微程序控制器中:
- 微指令:编码控制信息和后续微指令顺序等。
- 微程序:为实现某项机器指令功能而安排的一段微指令序列。
- 控制存储器/控制 ROM:保存微程序。
一条微指令可以控制一个或多个可同时进行的微操作,不能把两者硬性看成一一对应。
控制 ROM 与保存应用程序的主存不同。
程序员写的机器程序是一层;CPU 内部可能用来实现机器指令的微程序,是另一层。
2 / 20微程序控制与硬连线控制,怎样比较?
| 比较 | 微程序控制 | 硬连线控制 |
|---|---|---|
| 产生控制信号的主要办法 | 读取并解释控制存储器中的微指令 | 由逻辑电路结合操作码、状态、时序产生 |
| 传统优势 | 结构规整,较便于实现和调整复杂操作 | 控制路径可以较直接,适合高速实现 |
| 传统代价 | 读取和解释微指令有开销 | 复杂功能的设计、修改和验证可能更困难 |
这里比较的是设计思路,不是给所有处理器贴“永远快”“永远慢”的标签。
现代实现可以结合不同办法。指令集风格,也不强制内部只能采用某一种控制器。
这一节要能回答概念题,不需要现在独立设计控制 ROM 编码表。
2 / 21数据通道是什么?地址与数据缓冲器有什么用?【习题 2.11】
数据通道是数据被传送、保存和处理的部件及连接路径。
本章模型中包括:
- 寄存器。
- ALU 等运算部件。
- 内部总线及相应连接。
- 与系统总线交互的接口等。
控制器决定“现在做什么”,数据通道完成具体传送和处理。
例如:
R2、R3 → ALU → R1
就是一条运算数据路径。
内存 → 数据总线 → 缓冲器 → 内部通路 → R1
是一条加载路径。
地址和数据缓冲器负责 CPU 内部与系统总线之间的缓冲、传送配合及相关驱动作用。
数据通道不是仅指某一根数据线,也不只包含 ALU。
第2章 · 讲解单元 22—28
2.4 指令系统与执行过程
掌握要求:能读懂本章模型指令,逐步写出 LDR 的取指、译码、访存和写回。
为什么讲到这里:本章模型用于理解流程;真实 Arm 的编码和具体时序必须按相应架构核对。
2 / 22先读懂指令,再研究执行过程【重点】
本章采用模型机助记符。它借鉴 RISC 风格,不等于可以原样复制到任意真实 Arm 汇编器中执行。
先记三个约定:
Rd:目的寄存器。Rs:源寄存器。#数值:立即数,即指令本身给出的数值。
还有方括号:
假设:
R3 = 1000H
内存地址 1000H 中的内容 = 7
则:
MOV R1, R3
得到:
R1 = 1000H
而:
LDR R1, [R3]
得到:
R1 = 7
一个复制地址值,一个按照地址去取内容。这个区别必须弄明白。
2 / 23本章模型指令逐项解释
| 指令 | 含义 |
|---|---|
ADD Rd, Rs1, Rs2 |
两个源寄存器相加,结果写 Rd |
ADD Rd, Rs, #Imm |
寄存器值加立即数,结果写 Rd |
SUB Rd, Rs1, Rs2 |
Rs1 减 Rs2,结果写 Rd |
AND Rd, Rs1, Rs2 |
按位与 |
OR Rd, Rs1, Rs2 |
按位或 |
MOV Rd, Rs |
复制寄存器内容 |
MOV Rd, #Imm |
把立即数送入寄存器 |
LDR Rd, [地址] |
从内存或相应映射端口加载数据 |
STR Rs, [地址] |
把寄存器内容存入内存或相应映射端口 |
JMP Label |
无条件转移到标号位置 |
JX/JNX Label |
按指定条件决定是否转移 |
CALL |
调用子程序,并按约定保存返回位置 |
RET |
按保存的返回位置继续执行 |
HLT |
本模型中的停机 |
讲义表中把单操作数 NOR 用作按位取反,是它的模型约定;常见逻辑运算术语中的 NOR 通常指“或非”,不要混为统一语法。
表里又把 HLT 说明成“空操作”,也容易误导:
- NOP:不做有实质效果的操作,程序通常继续。
- HLT:停止正常继续执行,具体唤醒等规则看机器。
这里只需按模型理解停机,不需要先学习真实处理器的所有停机机制。
2 / 24定长指令为什么限制立即数和地址?【习题 2.12】
一条指令不仅要保存“数”,还要保存:
- 做什么操作。
- 使用哪些寄存器。
- 寻址方式等信息。
假设一个示意编码总长 32 位:
操作码 8 位 | Rd 4 位 | Rs 4 位 | 立即数 16 位
那么立即数只剩 16 位。
处理器能处理 32 位数据,不代表每条 32 位指令都能直接塞进任意 32 位立即数。
同理,若指令还要包含操作码、寄存器编号,就无法再无条件放入完整的 32 位绝对地址。
所以会使用:
- 寄存器保存地址。
- 基址加偏移。
- PC 相对寻址。
- 组合多条指令等办法。
定长编码的优点:
- 指令边界容易确定。
- 取指、译码较规则。
- 有利于流水线组织。
代价:
- 编码空间有限。
- 立即数、偏移量或可直接表示的地址受限制。
- 简单操作也可能占用整个指令长度,影响代码密度。
定长不保证一次总线传输一定取完整条指令,还要看总线宽度和存储接口。
2 / 25指令周期、总线周期、时钟周期怎样区分?
| 概念 | 本章中的含义 |
|---|---|
| 时钟周期/T 周期 | 时钟一个周期 |
| 总线周期 | 完成一次相应总线访问的过程 |
| 指令周期 | 从取指开始到完成这条指令所规定操作的过程 |
时钟频率与周期:
例如:
假设某模型:
- 一次总线访问需要 4 个 T。
- 一条指令需要两个这样的总线周期。
则:
这是给定模型下的计算。
讲义把 CPU 周期、机器周期、总线周期按同一层次说明。实际资料用词可能不同,看到“cycle”要先确认它指什么。
还要纠正一个关键概念:
流水线稳定后平均每拍完成一条指令,不等于每条指令从开始到结束只花一拍,也不等于它是单周期处理器。
后面会用图直接对比。
2 / 26例 2.1:先把程序本身讲对
按题意:
- 读取 R3 指向的数据。
- 与常量
000FF000H相加。 - 若有符号溢出,直接停机。
- 若不溢出,把这个常量存入 R3+80H 指向的位置。
- 停机。
按模型约定写成:
START:
MOV R0, #0x000FF000
LDR R1, [R3]
ADD R1, R0, R1
JO L2
STR R0, [R3 + #0x80]
L2:
HLT
这里有两个重点:
ADD R1, R0, R1的结果写入 R1。讲义那一行注释写到 R0,是笔误。STR R0, ...存的是 R0 中的常量,不是 R1 中的加法结果。题目文字本来就是这样要求的。
另外,本模型让加法更新溢出状态,再由 JO 检查。真实 A32 编程中通常还要注意 ADDS 等更新标志的写法,不能把模型指令当实际 Arm 指令语法背。
2 / 27把例题跑一遍:每一步到底改了什么?
假设初始:
R3 = 00001000H
内存 [1000H] = 00000007H
则:
| 步骤 | 执行结果 |
|---|---|
| MOV | R0=000FF000H |
| LDR | R1=00000007H |
| ADD | R1=000FF007H,无有符号溢出 |
| JO | 条件不成立,继续 |
| STR | 内存 [1080H]=000FF000H |
| HLT | 停机 |
注意:
80H 是十进制 128,不是十进制 80。
若原数据换成:
[1000H] = 7FFFFFFFH
则:
超过 32 位有符号正数上界。保留结果为:
800FEFFFH
产生有符号溢出,JO 跳到 HLT,不执行 STR。
程序存放地址若从 20000000H 开始,每条 4 字节:
20000000:MOV
20000004:LDR
20000008:ADD
2000000C:JO
20000010:STR
20000014:HLT
跳转时最清楚的写法是:
如果要计算相对位移,必须先确认位移相对于当前指令地址,还是已更新后的 PC,不能机械照抄“PC+8”。
讲义给出的那组 MOV 机器码只适合作为本章的取指示意,不应作为真实 Arm 编码背诵;真正编码还要按立即数旋转等规则核对。Arm 对立即数编码的说明
2 / 28习题 2.13:逐步写出 `LDR R1, [R3]` 的执行过程【必须会】
题目称它为“数据存储指令”,但 LDR 是数据加载指令。
仍假设:
PC = 20000004H
R3 = 00001000H
[00001000H] = 7
它包含两次不同目的的读取:
先读指令本身,再读指令要求的操作数。
完整答题过程可以写为:
- PC 的内容送入地址生成及地址缓冲部件,再通过地址总线选中指令所在内存。
- 控制器发出读命令。
- 指令机器码经数据总线、数据缓冲器等送入 IR。
- 按本模型的顺序取指约定,PC 加 4,变为
20000008H。 - 指令译码器识别 LDR,确定目的寄存器为 R1,地址来自 R3。
- 读取 R3 的内容,将
00001000H经地址通路送往地址总线。 - 控制器再次发读命令,读取该地址处的操作数。
- 操作数经数据总线、缓冲器及 CPU 内部通路写入 R1。
结束后:
R1 = 7
R3 仍然是 1000H
内存 [1000H] 仍然是 7
加载会改变目的寄存器,不会因为“取出了数据”就把普通内存原内容清空。
第2章 · 讲解单元 29—48
2.5 体系结构的改进与并行技术
掌握要求:比较 CISC/RISC,分析流水线和相关,区分多发射、SMT、多核,并会算理想加速比。
为什么讲到这里:理解每种技术究竟增加了什么、共享什么、受什么限制;不要求先实现乱序调度器。
2 / 29CISC 和 RISC,关键在设计取向【习题 2.3、2.4】
先看典型风格:
| 比较 | 传统 CISC 风格 | 传统 RISC 风格 |
|---|---|---|
| 指令功能 | 可以较复杂 | 强调较规则的基础操作 |
| 指令长度 | 常为变长 | 常强调固定或规则编码 |
| 访存运算 | 某些算术指令可以直接使用内存操作数 | 常用 Load/Store 模型 |
| 寻址方式 | 较丰富 | 较规则 |
| 通用寄存器 | 传统设计中往往较受限制 | 强调较充足的寄存器 |
| 控制实现 | 传统上常借助微程序 | 传统上强调较直接的控制逻辑 |
| 优化重点 | 丰富指令表达能力、代码密度等 | 简化常用操作,利于流水与编译优化 |
这些是典型设计特征,不是永无例外的判定清单。
尤其不能背成:
- RISC 的所有指令永远一样快。
- RISC 永远只有几十条指令。
- CISC 不能做流水线。
- RISC 一定比 CISC 快。
性能必须结合具体实现、程序和编译结果分析。
2 / 30为什么一条 CISC 指令能对应三条 RISC 指令?
要做:
一种 CISC 风格可以写:
ADD [A], R2
Load/Store 风格则通常分成:
LDR R1, [A]
ADD R1, R1, R2
STR R1, [A]
它们都要完成:
读内存 → 运算 → 写内存
区别是这些动作怎样组织成机器指令。
一条指令功能复杂,不代表内部不用做那些动作。
CISC 的典型优点:
- 指令表达能力强。
- 某些任务所需机器指令较少。
- 可能具有较好的代码密度。
典型代价:
- 译码、控制和调度可能更复杂。
- 指令边界、执行延迟等更不规则。
RISC 的核心思想:
- 让常用操作规则、高效。
- 用较简单指令组合复杂功能。
- 强调寄存器运算、加载存储及编译优化。
- 便于组织流水线和并行执行。
讲义的历史人物及 IBM 801、RISC-I、SPARC、MIPS、PowerPC、Alpha、PA-RISC、Itanium/EPIC 等,是介绍这些思路的发展与相互影响。知道它们是代表性路线即可,不必背每款芯片的晶体管数量。
“二八定律”在这里也是说明:应关注实际高频使用的操作,不是每个程序都严格符合 80% 和 20%。
2 / 31流水线:让不同指令的不同阶段重叠【核心】
本章示例把指令过程分成:
F:取指
D:译码
R:读源寄存器
E:执行
W:写回
串行执行时:
I1 全部做完 → I2 才开始 → I3……
流水执行时:
I1 进入 D 时,I2 可以进入 F
I1 进入 R 时,I2 进入 D,I3 进入 F
各阶段之间加入流水线寄存器,保存上一阶段产生、下一阶段需要的信息。
流水线主要提高吞吐率:单位时间完成更多指令。
它不保证单条指令从开始到结束更快。流水线寄存器等还有额外开销。
稳定运行时每拍完成一条,也不意味着那条指令只经历了一拍。
2 / 32流水线的基本计算:先声明理想条件
假设:
- 每条指令有 个阶段。
- 每阶段时间均为 。
- 指令之间无冲突。
- 暂不计额外寄存器开销。
执行 条指令:
串行:
流水:
因为第一条要先经过 拍,之后每拍完成一条。
例如 :
加速比:
不是用了五级流水线,四条指令就直接快五倍。
只有当指令数量足够多、其他条件理想时,加速比才趋近 。
如果各阶段耗时不相同,流水时钟还会受到最慢阶段和寄存器开销的限制,不能任意缩短。
2 / 33流水线为什么会停?三类冒险先分清
| 类型 | 问题 |
|---|---|
| 结构冒险/资源相关 | 同时想用同一个不能同时服务的资源 |
| 数据冒险 | 数据读写先后关系受到破坏 |
| 控制冒险 | 还没确定下一条该从哪里取 |
“有相关”描述指令之间的关系;“冒险”强调具体执行时序可能因此出现问题。
不是发现某两条指令相关,处理器就一定算错。正确实现必须通过等待、旁路、调度等保持程序语义。
2 / 34结构冒险与哈佛结构:取指和读数据撞在一起
假设:
- 前一条 LDR 要访问数据内存。
- 后一条指令同拍需要取指。
- 系统只有一套无法同时服务两者的访存接口。
就发生资源冲突。
解决办法之一是等待,即插入停顿或气泡。
另一种办法是分离指令与数据通路:
哈佛结构强调指令与数据具有分离的存储或访问通路。
现代处理器还可能在靠近 CPU 的位置分设 I-Cache、D-Cache,而后面连接统一的主存系统。
分离通路可以缓解对应的取指与数据访问冲突,不能消除所有结构冲突。例如两个操作仍可能争用同一个乘法器。
2 / 35RAW:后一条要读前一条尚未产生的结果
例子:
SUB R1, R2, R3
AND R4, R1, R5
第一条写 R1,第二条读 R1。
程序本意:
先产生新的 R1
→ 再把这个新 R1 用于 AND
但在流水线上,第二条可能在第一条写回之前就进入读寄存器阶段。
这叫:
它是真实的数据依赖。
解决思路:
- 后一条等待。
- 把前一条已算出的结果直接旁路给后一条。
- 在保持语义的前提下,安排其他独立指令填补等待。
**旁路不一定能消除所有等待。**例如加载数据尚未返回时,依赖它的指令仍可能需要停顿。
具体等待几拍,取决于阶段划分、结果何时产生、寄存器读写时序和旁路路径,不能脱离模型只背一个固定数字。
2 / 36WAR 与 WAW:习题 2.15 要会自己举例
WAR:Write After Read,读后写。
I1: ADD R4, R1, R2
I2: SUB R1, R5, R6
程序要求:
I1 先读取旧 R1
I2 再写入新 R1
若某种乱序执行让 I2 先写 R1,I1 再读取,就读错了。
WAW:Write After Write,写后写。
I1: MUL R1, R2, R3
I2: ADD R1, R4, R5
程序最后应保留 I2 写入的 R1。
若 I1 较慢,I2 先完成写入,而 I1 随后又覆盖 R1,最终结果就错了。
区别可以记为:
| 类型 | 必须维护的顺序 |
|---|---|
| RAW | 前一条写 → 后一条读 |
| WAR | 前一条读 → 后一条写 |
| WAW | 前一条写 → 后一条写 |
**在简单、顺序读寄存器、顺序写回的五级流水线中,WAR 和 WAW 通常不会出现。**它们在更复杂的乱序或不同延迟执行结构中才成为实际风险。马里兰大学流水线课程资料
这里讲它们,是为理解后续更复杂并行执行;不应把三种风险都硬套到所有简单流水线。
2 / 37旁路、调度、乱序、寄存器重命名,各解决什么?
| 方法 | 主要作用 |
|---|---|
| 停顿/插入气泡 | 等条件满足后再继续 |
| 旁路/转发 | 直接传递已产生但尚未按通常路径写回的结果 |
| 编译器指令调度 | 静态安排独立指令,减少等待 |
| 硬件乱序执行 | 运行时让已准备好的操作先执行 |
| 寄存器重命名 | 为不同版本的结果分配不同物理位置,缓解 WAR、WAW 等名字冲突 |
编译器重新排列指令,与 CPU 运行时动态乱序,不是同一个机制。
两者都必须保持程序应该具有的结果,不能随便换顺序。
本章需要理解用途,不要求你现在实现调度器或重命名表。
2 / 38控制冒险:下一条究竟取顺序地址,还是跳转目标?【习题 2.16】
例如:
JO L2
在确定是否溢出、是否跳转之前,流水线可能已经取了后面几条指令。
如果最终需要跳转,错误路径上的后续指令就要取消,再从目标地址继续。
几个名词:
| 名词 | 含义 |
|---|---|
| 转移目标指令 | 跳转后应该执行的目标位置处的指令 |
| 转移目标地址 | 该指令的位置 |
| 转移代价 branch penalty | 因转移处理或预测失败等造成的额外周期开销 |
| BTB | 帮助尽早获得分支目标等信息的快速表 |
所谓“排空”,主要是取消错误路径上较新的指令,不是把所有较早正确指令也一律抹掉。
尽早确定目标地址、尽早判断条件,可以降低代价,但能提前到什么阶段,要看相关数据和硬件是否已经准备好。
2 / 39动态分支预测:根据历史结果更新猜测【习题 2.17】
本章的示例是二位饱和计数器:
| 状态 | 预测 |
|---|---|
| 00,强不转移 | 不转移 |
| 01,弱不转移 | 不转移 |
| 10,弱转移 | 转移 |
| 11,强转移 | 转移 |
实际结果:
- 转移:计数值加 1,最大保持 3。
- 不转移:减 1,最小保持 0。
“饱和”表示到边界后停住,不会从 11 加一绕回 00。
例如从 01 开始:
| 实际结果 | 原状态的预测 | 是否正确 | 更新后 |
|---|---|---|---|
| T | 不转移 | 错 | 10 |
| T | 转移 | 对 | 11 |
| N | 转移 | 错 | 10 |
| T | 转移 | 对 | 11 |
这种设计不会因为一次偶然的相反结果,就马上从“强转移”变成预测不转移。
答题过程可以写:
- 根据当前分支地址查询历史预测信息。
- 预测转移或不转移。
- 转移时尽早选择目标地址,不转移时选择顺序地址。
- 指令实际执行后检查预测。
- 预测错误时取消错误路径操作,恢复正确执行。
- 根据实际结果更新预测状态。
2 / 40BTB 与“转不转”的预测表,不必一定是同一张表
讲义把信息放在一个简化表中:
分支指令地址
预测状态
转移目标地址
这样方便理解。
更一般地:
- 方向预测信息回答:转不转?
- BTB 主要帮助回答:转到哪里?
实际实现可能将这些信息分开组织。
BTB 容量有限,需要匹配和替换。讲义的 1024 项只是示例,不是所有处理器的固定容量。
这一节要掌握工作过程,不需要记住某一张表必须有多少项。
2 / 41转移延迟槽:讲义这一段必须单独澄清【习题 2.16】
在某些采用延迟转移的指令集中:
分支后面规定位置的指令,按架构规则仍会执行,然后才发生转移效果。
这个位置称为分支延迟槽。
例如简化表示:
BRANCH Target
某条延迟槽指令
编译器可能安排一条合适且安全的指令放进去,否则可能使用 NOP。具体规则及取消执行等变体由指令集决定。Oracle 对分支延迟槽的说明
必须分清:
- 被预测路径上的指令取入了流水线,不代表它一定应当完成。
- 架构规定的延迟槽指令,是程序语义的一部分。
- 分支预测与延迟槽,是不同机制。
**不是所有流水线处理器都有延迟槽。**本章介绍 Arm 时,也不能把这种延迟槽规则随意套进去。
这里值得讲清楚,因为讲义把“分支后的时间片”“预测取指”和“延迟槽”写得过于接近,很容易造成概念混淆。
2 / 42超标量与多发射:一拍可以送出多条指令【习题 2.18】
普通单发射流水线,理想情况下每拍进入一条指令。
超标量设计增加执行能力,可以在满足条件时,每拍发射多条指令到相应执行资源。
但发射前必须检查:
- 操作数是否准备好。
- 指令之间有无数据关系。
- 需要的执行单元是否可用。
- 其他执行限制是否满足。
例如:
ADD R1, R2, R3
SUB R4, R5, R6
若资源支持,两条互不依赖,适合并行安排。
但:
ADD R1, R2, R3
SUB R4, R1, R5
第二条依赖第一条的新结果,就不能简单当作彼此无关的两条指令同时执行。
即使没有寄存器依赖,两条指令都需要同一个、不能同时服务两者的功能单元,也会受限制。
“配对检查”的目的,是保证并行安排正确且资源允许。
编译器可以帮助优化排列,运行时是否发射及相关检查也通常由处理器硬件参与,不能把责任全归给编译器。
2 / 43超流水线、超标量、向量/SIMD,分别增加什么?
| 技术 | 主要办法 |
|---|---|
| 更深流水线/超级流水线 | 把处理过程分成更多阶段 |
| 超标量 | 在同一核心中增加并行发射和执行能力 |
| 向量/SIMD | 一条指令对多个数据元素做相应操作 |
例如四组数相加:
a0+b0,a1+b1,a2+b2,a3+b3
SIMD 可以让一条指令处理多个元素。
超标量则可能同时安排多条不同指令。
更深流水线也不是级数越多越好,因为:
- 寄存器及控制开销增加。
- 分支失败恢复可能更贵。
- 功耗、时序和设计复杂度增加。
- 其他瓶颈仍然存在。
讲义列举某些旧处理器有多少流水级,是历史实例,理解取舍即可,不必把数字当普遍最优值。
2 / 44进程、线程、时间片:为什么这里要讲操作系统名词?
因为后面的“超线程”需要区分软件执行任务与硬件资源。
- 程序:静态代码和相关内容。
- 进程:程序运行中的实例,具有地址空间、状态和资源。
- 线程:进程内可以被调度执行的一条执行流。
同一进程的线程通常共享代码、全局数据、堆等资源,但各自有:
- PC。
- 寄存器执行状态。
- 栈等线程相关状态。
所以不能把“共享进程资源”理解成“所有线程的运行状态都相同”。
时间片调度,让处理器轮流运行不同线程。切换时需要保存和恢复现场等。
讲义说进程每次切换都回收并重新分配全部资源,表述过重。普通上下文切换不是把整个进程的内存等全部销毁后重建。
这部分用于理解调度和硬件线程,不要求现在学完操作系统课程。
2 / 45超线程 SMT:两个线程共享一个核心,也可以真正重叠执行
SMT 是同时多线程。Intel 的 Hyper-Threading 是其相关技术实现和名称。
典型的双线程 SMT 核心:
- 为两个硬件线程保持相应的架构执行状态。
- 共享核心中的执行单元、部分缓存和其他资源。
- 可以利用一个线程未用上的资源,安排另一个线程的指令。
**共享资源不等于完全不能并行。**不同线程的指令可以重叠执行,但也会竞争资源,不能当成两套完全独立核心。Intel 关于超线程执行上下文的说明
讲义中:
- “不是真正意义的并行处理”不够准确。
- “固定提升约 30%”不能当保证。
- “单线程应用一定下降”也不是普遍结论。
实际收益取决于任务与资源竞争情况。
把三种思路放在一起看:
它们也可以同时存在:一个多核处理器,每个核心内部又支持超标量和 SMT。
2 / 46多处理器、多计算机、分布式系统,区别在哪里?
| 名称 | 本章需要抓住的特征 |
|---|---|
| 多处理器计算机 | 一台系统拥有多个处理器,协同使用系统资源 |
| 多计算机集群 | 多台计算机通过网络等互连,各节点有自己的计算和存储资源 |
| 分布式系统 | 多个节点通过通信协作,对外完成共同服务或任务 |
多处理器中:
- SMP:处理器地位对称,参与相应任务执行及资源共享。
- AMP:处理器职责可不同,例如专门承担控制、运算或 I/O 工作。
集群和分布式系统部分,讲义用于扩展视野。需要补充两点:
- 多台机器放在一起,不会自动消除单点故障,还要设计冗余、故障转移等。
- 分布式协作可以通过操作系统、中间件或应用软件完成,并不都要求一个统一的“分布式操作系统”。
现在能说清一个系统内多个处理器与多台独立计算机协作的区别即可,不必深入分布式一致性算法。
2 / 47多处理器与多核有什么区别?【习题 2.19、2.20】
按本章比较:
- 多处理器系统通常强调多个独立处理器。
- 多核强调一个处理器中集成多个执行核心。
- 二者可以共存:一台机器安装多个多核处理器。
核心通常有自己的执行与寄存器等资源,但仍可能共享末级缓存、内存接口等,不能理解成每个核心拥有一整台完全独立电脑。
同构多核:核心的主要结构和能力相近。
异构多核:采用不同类型、性能或功耗特性的核心。
异构的目的:
让不同任务使用更合适的硬件,在性能、能耗和成本之间取得更好的配合。
例子:
- 高性能 CPU 核处理计算压力较大的任务。
- 低功耗 CPU 核处理较轻任务。
- GPU 处理适合大规模数据并行的工作。
- NPU 等加速特定计算。
讲义的麒麟 980、990 是历史实例,借它认识大核、小核、GPU、NPU 的分工即可,不必背频率和晶体管数量。
2 / 48安达尔定律:为什么增加核心不能无限加速?【重要补充计算】
假设原任务:
- 20% 的执行时间必须串行。
- 80% 可以理想并行。
- 使用 个同等并行节点。
- 暂不考虑通信、调度等额外开销。
则:
其中 是原执行时间中可并行部分的比例,不是代码行数比例。
当 :
使用 4 个节点:
使用 8 个节点:
节点无限多时:
这里讲它,是为了让你能定量解释“核心翻倍,程序不一定快一倍”。
实际还有并行开销,通常比这个理想模型更复杂。
第2章 · 讲解单元 49—52
2.6 Intel 8086 与 Pentium
掌握要求:会算 8086 物理地址,认识 EU/BIU,解释 Pentium 的配对与共享资源。
为什么讲到这里:旧处理器用来把前述技术放进具体结构;不必背所有寄存器位定义和历代型号参数。
2 / 498086 结构,重点看 EU 与 BIU
8086 是本章的历史实例,重点参数:
| 项目 | 本章要掌握的内容 |
|---|---|
| 主要整数处理宽度 | 16 位 |
| 外部数据总线 | 16 位 |
| 地址总线 | 20 位 |
| 按字节编址空间 | B=1 MiB |
| 主要组织 | EU 与 BIU |
| 指令预取队列 | 6 字节 |
- EU,执行单元:译码和执行指令,包含 ALU、寄存器和相关控制等。
- BIU,总线接口单元:地址生成、取指及相应总线访问等。
预取队列用于提前保存指令字节,使取指与执行在一定条件下重叠。它不是说每条指令都恰好长 6 字节。
寄存器按用途认识:
| 类别 | 名称 |
|---|---|
| 数据相关通用寄存器 | AX、BX、CX、DX |
| 指针与变址等 | SP、BP、SI、DI |
| 段寄存器 | CS、DS、SS、ES |
| 指令位置及状态 | IP、FLAGS |
AX 等四个寄存器可分成高、低两个 8 位部分,例如 AH、AL。
某些指令对寄存器有特定要求,但不能把它概括成“所有算术操作都只能使用 AX”。
8086 本身没有集成相应浮点单元,可配合 8087。8088 则是讲义用于说明“内部处理宽度与外部数据总线宽度可以不同”的实例,其外部数据总线为 8 位。
这些旧产品的售价、全部指令条数和商业故事,不影响本章主线,知道历史作用即可。
2 / 5016 位寄存器怎样产生 20 位地址?【习题 2.21】
8086 的典型物理地址计算:
左移四位,就是乘以 16,也是在十六进制末尾加一个 0。
例如:
段值:1234H
偏移:5678H
则:
12340H
+ 05678H
--------
179B8H
不是把两个 16 位数直接拼成 32 位地址。
不同的段值和偏移组合,也可能指向相同物理位置。
对于原始 8086,最终地址受 20 根地址线限制,超出的高位不会输出。本章先会做正常的段值加偏移计算即可。
2 / 51Pentium:用它把前面的技术串起来
本章所讲的早期 Pentium,具有:
- 32 位主要整数寄存器。
- 32 位物理地址总线,对应 4 GiB 地址空间。
- 64 位外部数据总线。
- 分离的 8 KiB 指令 Cache 和 8 KiB 数据 Cache。
- U、V 两条整数流水线。
- 浮点流水线。
- 分支目标等预测机制。
- 硬连线与微程序等控制思想结合。
外部数据总线 64 位,不会因此把它变成 64 位整数架构处理器。
讲义计算:
这个结果是按每个数据拍传 8 字节得到的理想数据通路上限。实际持续传输还受到访问时序、地址和等待等开销影响。
这里介绍 Pentium,是为了让你看到:CISC 指令集同样可以通过内部组织改进,使用流水线、超标量和缓存等技术。
2 / 52习题 2.22:“Pentium 不能同时执行整数和浮点”怎样理解?
按讲义想考查的点:
整数与浮点处理共用部分前级流水和发射资源,不是两条完全独立、可任意配对的通路。
但更严格地说,原始 Pentium 手册规定的是:
浮点指令不与整数指令组成同拍发射的指令对。
这不应该扩大成“整数与浮点指令在任何阶段都绝不可能重叠执行”。手册还规定了某些浮点指令与 FXCH 的特殊配对。
另外,讲义写共享前四级;原始手册在对应流水阶段说明中写的是前五级共享。答这题抓住共享资源与配对发射限制,不背讲义的绝对化结论。
核对依据:Intel《Pentium Processor User’s Manual, Volume 1》(1993),流水线及配对规则相关说明。
第2章 · 讲解单元 53—59
2.7 ARM 处理器结构
掌握要求:区分架构、内核、芯片,比较 ARM7/ARM9,认识 MMU/MPU 和调试接口。
为什么讲到这里:软硬核、CP15、JTAG 等要知道用途;不要求现在配置完整片上系统或页表。
2 / 53ARM 体系结构版本、内核、具体芯片,分三层认识
| 层次 | 是什么 | 例子 |
|---|---|---|
| 体系结构 | 指令和程序可见行为等规则 | ARMv4T |
| 内核产品 | 对相应规则的具体处理器实现 | ARM7TDMI、ARM9TDMI |
| 具体芯片 | 在内核基础上集成存储器、接口等 | 某款 MCU 或 SoC |
ARM7TDMI 与 ARM9TDMI 都实现 ARMv4T。
所以不能看见名字中有 7、9,就误认为对应 ARMv7、ARMv9。
同一架构有助于指令层面的兼容,但整个系统软件是否直接兼容,还要看扩展、运行环境、接口和其他约定。
讲义的“只到 ARMv8”属于写作时的材料。还要注意:不能把所有 Armv8 都等同于 64 位,例如 Armv8-M 仍是 32 位架构。看版本还要看 A/R/M 等具体系列。Arm 的架构分类
2 / 54ARM 的指令特点:哪些与 RISC 相联系?
本章需要掌握:
- 以寄存器为主要算术逻辑操作对象。
- 使用加载、存储指令访问相应内存操作数。
- 指令编码较规则。
- 支持流水处理。
- 提供移位、条件标志等机制。
- 兼顾性能、代码密度、面积和功耗。
同时要知道:
- 不是每条指令都只花一个时钟。
- 不同 Arm 指令集的指令长度规则不同。
- 传统 A32、早期 Thumb、后来的 Thumb-2 等不能混成一个“所有指令永远一样长”的集合。
- 块传送、复杂寻址等是为了实际用途进行的设计取舍。
本节提这些,是为第五、六章做准备。现在先理解特点,暂时不背全指令编码。
2 / 55ARM7TDMI:三条线索最重要
第一,32 位处理核心。
讲义介绍:
- 32 位 ALU。
- 桶形移位器。
- 乘法实现部件。
- 寄存器资源。
- 调试与跟踪相关支持。
桶形移位器帮助高效完成不同位数的移位。
图中“32×8”乘法器描述的是内部实现特点,不能据此理解成它的乘法指令只允许一个操作数为 8 位。
第二,三级流水线:
取指 F → 译码 D → 执行 E
第三,支持两种指令状态:
- ARM 状态:32 位 ARM 指令。
- 早期 Thumb 状态:16 位 Thumb 指令。
Thumb 指令较短,不会把处理器寄存器和 ALU自动变成 16 位。
讲义提到总共 37 个程序相关物理寄存器资源,其中包括不同模式下的分组资源,所以不是同一时刻都能访问全部。最多可见多少、哪些切换,要到第五章按模式细讲。
名称后缀:
| 后缀 | 本章认识 |
|---|---|
| T | Thumb |
| D | 调试支持 |
| M | 乘法相关支持 |
| I | EmbeddedICE 等支持 |
| -S | 可综合版本 |
软核、固核、硬核属于 IP 交付形态:大致从硬件描述、门级网表到固定物理实现,抽象程度不同。这里知道含义即可,不要求现在完成芯片综合。
2 / 56ARM7 的读写数据线分开,为什么仍是统一指令数据结构?
这两个“分开”说的不是同一件事:
- 读数据线与写数据线分开:区分传输方向。
- 指令与数据通路分开:区分访问用途。
因此,ARM7TDMI 的一些读写方向接口设计,不能直接等同于哈佛结构。
本章对照重点:
- ARM7TDMI:统一的指令/数据访存组织,三级流水。
- ARM9TDMI:分离的指令/数据接口,五级流水。
2 / 57ARM9TDMI 相比 ARM7TDMI 改进了什么?【习题 2.23】
| 比较 | ARM7TDMI | ARM9TDMI |
|---|---|---|
| 架构版本 | ARMv4T | ARMv4T |
| 流水线 | 3 级 | 5 级 |
| 阶段 | F、D、E | F、D、E、M、W |
| 指令数据访问 | 统一组织 | 分离通路 |
| 取指与数据访问冲突 | 较易受统一通路限制 | 对应冲突得到缓解 |
| 实现目标 | 较小、简洁等 | 通过阶段划分和内部组织提高性能 |
Arm 官方把 ARM9 的五阶段列为取指、译码、执行、数据访存、寄存器写回。ARM9TDMI 技术手册
讲义还强调 Thumb 译码实现的改进,这一点可以作为答题补充,但不能理解成 ARM7 用软件译码、ARM9 才使用硬件。ARM7TDMI 也会实时完成 Thumb 指令的硬件解压与执行。ARM7TDMI 官方说明
对于本题,优先答清五级流水、分离指令数据通路及相应实现优化。
2 / 58ARM920T:在核心外面,又加了什么?
ARM920T 以 ARM9TDMI 为核心,讲义重点介绍:
| 部件 | 作用 |
|---|---|
| 16 KiB I-Cache | 缓存指令 |
| 16 KiB D-Cache | 缓存数据 |
| 指令/数据 MMU | 地址翻译及访问保护等 |
| 写缓冲 | 暂存相应写操作,提高处理配合效率 |
| CP15 | 配置与控制相关系统功能 |
| AMBA 接口 | 连接系统其他部件 |
| 调试、跟踪接口 | 测试、观察及调试执行 |
**这些不是说任何叫 ARM9 的基本核心都自动含有全部相同配置。**要分清 ARM9TDMI 核心与基于它构成的处理器产品。ARM920T 技术手册
讲义还提到 ARM9E、DSP 扩展及一些支持 Java 扩展的型号,用于说明同一产品家族也有不同功能分支。旧芯片和操作系统型号属于背景,现在不用逐个背。
2 / 59VA、PA、MMU、MPU、CP15、JTAG,分别是什么?
| 名称 | 本章需要知道的作用 |
|---|---|
| VA,虚拟地址 | 程序使用的地址 |
| PA,物理地址 | 翻译后用于访问物理存储系统的地址 |
| MMU | 按配置完成地址翻译、权限检查等 |
| MPU,存储保护单元 | 主要提供区域访问保护等功能,通常不承担完整虚拟内存翻译 |
| CP15 | 传统相应 Arm 系统中的系统控制接口 |
| JTAG | 测试、调试相关标准接口 |
| ICE/ETM 等 | 调试或跟踪执行的支持 |
| 回写物理地址标记 | 帮助记录需要回写的 Cache 数据对应的物理位置 |
注意 MPU 在这里是 Memory Protection Unit,存储保护单元;第一章 MPU 表示微处理器,是另一种缩写含义。
操作系统负责内存分配及建立映射等管理工作,MMU 按配置执行翻译和保护。不能理解成 MMU 自己决定给哪个进程分配多少内存。
这部分与第三章虚拟存储衔接。先认清角色,具体配置第五章以后再结合寄存器讲。
第2章 · 讲解单元 60—65
2.8 计算机性能评测
掌握要求:会用执行时间、CPI、IPC、MIPS 等关系,理解 DMIPS 与基准测试的适用范围。
为什么讲到这里:RASIS 和系统测试说明“快”以外的系统要求;知道各工具测什么,不必逐一安装使用。
2 / 60性能评测,先看“完成什么任务”
讲义列了多个维度:
| 指标 | 能说明什么 | 不能直接推出什么 |
|---|---|---|
| 机器字长 | 某些数据处理和地址等能力 | 64 位机器执行任何程序都比 32 位快 |
| Cache、内存容量与速度 | 数据供应条件 | 容量越大,每个程序都按比例变快 |
| 总线宽度、频率、吞吐 | 数据传送能力 | 理论带宽必然等于实际吞吐 |
| 功耗、能量 | 运行与续航成本 | 只看瞬时功率就能知道完成任务的能耗 |
| 核心数、并行能力 | 潜在的并行资源 | 核心翻倍,所有任务时间减半 |
EPI 是每条指令消耗的能量。不过跨不同指令集、不同任务比较时,还应关注完成同一任务的总能量。
讲义提到噪声、有害物质和废弃物处理等,是补充系统评价维度。它们对本章指令执行题没有直接作用,认识这些也是工程设计要考虑的因素即可。
2 / 61RASIS:性能好,也要可靠、可用、可维护
讲义用 RASIS 概括:
| 特性 | 含义 |
|---|---|
| Reliability 可靠性 | 在规定条件和时间内持续正确运行的能力 |
| Availability 可用性 | 系统在需要时能够提供服务的程度 |
| Serviceability 可维护性 | 故障是否容易定位、修复 |
| Integrity 完整性 | 信息或处理结果不被不当破坏、改变等 |
| Security 安全性 | 防止未经授权的访问和操作等 |
相关指标:
- MTTF:平均失效前时间。
- MTBF:平均故障间隔时间。
- MTTR:平均修复时间。
一般希望正常工作时间长、修复时间短。
例如 99.9% 可用性,按一年 365 天计算:
意思是一年不可用时间约 8.76 小时的量级。
这里不是让你现在做可靠性工程推导,而是理解:一台跑分很高但经常停机的机器,未必满足系统需求。
2 / 62MIPS、CPI、IPC 与真正完成任务的时间【习题 2.25】
几个量:
- IC:实际执行的指令数。
- CPI:平均每条指令消耗多少时钟。
- IPC:平均每个时钟完成多少指令。
- f:时钟频率。
对同一次测量:
按真实机器指令计数的 MIPS:
因此,频率、平均周期和指令数量都会影响任务完成时间。
为什么不能只看 MIPS?
假设完成同一任务:
| 机器 | 需要指令 | 执行速率 | 完成时间 |
|---|---|---|---|
| A | 100 万条 | 100 MIPS | 0.01 秒 |
| B | 300 万条 | 200 MIPS | 0.015 秒 |
B 的 MIPS 更高,却更晚完成。
因为不同指令集和编译结果,完成同一任务所需的指令数量和单条功能可能不同。
习题 2.25 的结论:MIPS 不能单独、普遍地客观代表计算机完成任务的速度。
2 / 63习题 2.24:300 MHz 的 ARM920T,答案为什么是 330,又为什么要说明单位?
按讲义给出的系数:
乘以:
得到:
但原始 Arm 资料中的 0.9、1.1,指的是 Dhrystone VAX MIPS/MHz,即 DMIPS/MHz。
因此更准确地说:
这是一种基准性能分数,不能直接断言它每秒真实执行 3.3 亿条 Arm 指令。
Arm 自己的应用笔记明确区分:
- Dhrystone VAX MIPS。
- 根据实际指令数和平均 CPI 计算的真实指令吞吐。
真实指令吞吐仍应使用:
Arm《Benchmarking with ARMulator》
做这道讲义题可以写“按给定指标为 330 MIPS”,同时理解其历史基准含义。这样既完成题目的乘法,也不会把它和 IPC 混起来。
2 / 64各种基准测试到底测什么?所有名称都给你一个位置
| 名称 | 主要关注 |
|---|---|
| Whetstone | 包含浮点等运算的传统综合基准 |
| Dhrystone | 整数、控制、字符串等传统基准,不以浮点为重点 |
| CoreMark | 面向嵌入式 CPU/MCU 的基准工作负载 |
| SPECint/SPECfp | 整数、浮点相关计算负载 |
| SPEC CPU | 计算密集型基准套件,区分任务时间与吞吐等测试 |
| SPECjbb | Java 服务端相关负载 |
| TPC-C | 联机事务处理 |
| TPC-H | 决策支持、查询分析类负载 |
| LINPACK | 线性代数计算,常用于高性能计算浮点评测 |
| SAP 基准 | 企业业务系统相关负载 |
| PCMark、WinBench 等 | 讲义列举的整机或相关子系统测试 |
| 3DMark | 图形相关测试 |
| HD Tune | 存储设备相关测试 |
| 安兔兔、鲁大师等 | 面向消费设备的综合测试例子 |
FLOPS 表示每秒浮点运算次数,不是每秒机器指令数。
CoreMark 包括矩阵、链表、状态机、CRC 等工作。其分数主要按规定工作迭代的执行速率报告,CoreMark/MHz 则再按频率归一化。不能把它简单说成“执行次数与代码大小合成的一个值”。EEMBC 的 CoreMark 项目说明
讲义用 SPEC CPU2017 作为具体例子,可以认识它的整数/浮点、速度/吞吐等分类;不用把版本号和项目数量作为本章重点背诵。SPEC CPU2017 说明
这些测试都会受到工作负载、编译器、内存和配置等影响。基准是一把针对某些问题的尺,不是一串能概括所有用途的万能分数。
2 / 65为什么还要介绍 JMeter、LoadRunner 等系统测试工具?
因为一个信息系统除了 CPU,还包括:
- 网络。
- 数据库。
- 存储。
- 软件架构。
- 并发请求。
- 业务处理流程等。
用户关心的可能是:
- 一次请求多久返回。
- 同时能服务多少人。
- 每秒完成多少业务。
- 高负载下是否稳定。
讲义列举 WebLoad、NeoLoad、JMeter、LoadRunner,以及 Katalon、WinRunner 等不同侧重点的测试工具,是为了说明系统还需要功能自动化、负载及性能等多类测试。
它们不都等同于 CPU 跑分软件,也不要求你现在安装使用。
这里学习的必要性在于:以后你不能看到某个 CPU 参数高,就直接推断整个网站或业务系统一定快。
第2章 · 讲解单元 66—67
第二章验收与自测
掌握要求:能逐题定位 25 道习题,并不看答案写出 LDR 流程、流水线时序和性能计算。
为什么讲到这里:背景内容仍需认识用途;验收优先检查能否独立分析与计算。
2 / 66本章 25 道习题,需要掌握的东西都在哪里
| 习题 | 完整讲解对应内容 |
|---|---|
| 2.1 | 体系结构、组成、实现 |
| 2.2 | 存储与处理速度差距、共享通路竞争 |
| 2.3、2.4 | CISC/RISC 特点与设计取舍 |
| 2.5 | 对齐及跨块访问 |
| 2.6 | 24 位地址空间、双字节存储体及选通 |
| 2.7 | PSW 的状态与控制信息 |
| 2.8 | 寄存器与主存比较 |
| 2.9 | 控制器组成与职责 |
| 2.10 | 微操作、微指令、微程序、控制 ROM |
| 2.11 | 数据通道 |
| 2.12 | 定长指令优点与编码限制 |
| 2.13 | LDR 完整执行步骤 |
| 2.14 | 同一总线上的读 A、写 B |
| 2.15 | WAR、WAW 例子与时序条件 |
| 2.16、2.17 | 转移代价、延迟槽、BTB、动态预测 |
| 2.18 | 超标量配对及资源、数据检查 |
| 2.19、2.20 | 多处理器、多核、同构与异构 |
| 2.21 | 段值左移四位加偏移 |
| 2.22 | Pentium 共享资源与整数/浮点配对限制 |
| 2.23 | ARM7 与 ARM9 对比 |
| 2.24 | 330 的计算及 DMIPS 含义 |
| 2.25 | MIPS 的局限与任务执行时间 |
历史型号、软硬核、调试接口、各类测试工具等背景内容,也都已经提到。它们目前的要求是知道用来解决什么问题,不需要全部达到独立设计和使用的程度。
2 / 67短自测:先独立完成,再展开答案
- 16 位数据总线、24 位地址总线,按字节编址,地址空间是多少?
- 四字节数据从地址 3 开始存,是否四字节对齐?跨几个图示对齐块?
R3=1000H,[1000H]=7,MOV R1,R3与LDR R1,[R3]分别得到什么?- PC 与 IR 分别保存什么?
- 四条指令,每条五阶段,每阶段一拍,理想流水共几拍?
- 第一条写 R1,第二条读取这个新 R1,是什么相关?
- 超线程与双核,最重要的区别是什么?
- 原耗时 20% 无法并行,四核理想加速比是多少?无限核上限是多少?
- 8086 段值 1234H、偏移 5678H,物理地址是多少?
- 330 DMIPS 能否直接解释成每秒真实执行 3.3 亿条指令?
展开短自测答案与复习建议
- B=16 MiB。
- 不对齐,占地址 3~6,跨两个四字节对齐块。
- MOV 得到 1000H;LDR 得到 7。
- PC 跟踪指令地址;IR 保存所取指令内容。
- 拍。
- RAW,写后读。
- 超线程共享一个核心的多种执行资源;双核有两个执行核心,但仍可能共享某些系统资源。
- 四核 2.5 倍;无限核上限 5 倍。
- 179B8H。
- 不能,它是基准性能分数,真实指令吞吐还需按指令数、时间或 CPI 等计算。
实际复习时,先独立完成第 1—6 题,再把 LDR R1,[R3] 的执行过程不看讲解写一遍。这两项做稳,第二章前半部分就有了清晰的骨架;随后再练流水线相关和并行性能计算。
第2章 · 章后习题全覆盖
25 道习题的答题卡
题意经过归纳,计算条件和原题号保持对应。先在纸上写出答案,再展开检查;需要看完整推导时,点击“回到完整讲解”。本节的短答案不能代替正文中的条件和过程。
习题 2.1 / 体系结构、组成与实现的关系
用一条指令的视角区分三个层次。
展开答题要点
体系结构关注软件可见的指令、寄存器、数据类型和寻址规则;组成关注如何组织数据通道、控制、存储层次等以实现这些规则;实现关注器件、电路、工艺等物理落实。相同体系结构可以有不同组成和实现。
习题 2.2 / 冯·诺依曼瓶颈
说明为什么 CPU 很快,系统仍可能等存储器。
展开答题要点
处理速度与存储访问速度存在差距,指令和数据还可能竞争共享传输通路。仅提高 CPU 运算速度,不能保证取指和访存跟得上;缓存、分级存储、预取或分离部分通路等旨在缓解这些约束。
习题 2.3 / CISC 的取舍
从功能、代码、译码和控制复杂度说明优缺点。
展开答题要点
丰富指令和寻址方式可提高部分任务的代码密度,某些复杂操作可用较少指令表达;代价可能是编码、译码和控制更复杂,指令执行特征不统一。不能直接推出所有 CISC 程序都慢或所有指令都多周期。
习题 2.4 / RISC 的主要思想
概括指令、寄存器和访存的设计取向。
展开答题要点
强调较规整、易译码的指令,较多通用寄存器,以及以加载/存储指令访问内存,让普通运算多在寄存器间完成,并便于流水执行。不要把这些趋势背成每个 RISC 指令集都无例外的硬定义。
习题 2.5 / 非对齐存放的问题
用一个四字节数据跨越四字节边界的例子解释。
展开答题要点
四字节数据若从地址 3 开始,占地址 3~6,跨两个四字节对齐块。在正文简化总线模型中需分次访问并组合;具体机器可能支持、限制或异常处理,代价也依实现而异。四字节对齐的判据是起始地址 mod 4=0。
习题 2.6 / 24 位地址与双字节存储体
16 位数据总线、24 位地址总线,按字节编址。求容量并画出整字/高字节/低字节访问方案。
展开答题要点
地址空间为 2²⁴ B=16 MiB。用两组各 8 MiB、每单元 8 位的存储体,分别接 D7…D0 和 D15…D8;A23…A1 提供共用行地址,A0 配合高字节选通控制。偶地址起始整字访问同时选两组,单字节访问只选一组。详细选通表和 SVG 见正文。
习题 2.7 / PSW 的内容
说明程序状态字保存哪些状态或控制信息。
展开答题要点
典型内容包括 N/S、Z、C、V 等运算状态,以及体系结构规定的中断、特权或模式等控制信息。具体字段依架构而异;进位 C 与有符号溢出 V 不能混用。
习题 2.8 / 寄存器与主存
从位置、速度、容量、用途和寻址比较。
展开答题要点
寄存器位于 CPU 内,数量较少,直接服务于操作数、地址和状态等;主存容量较大,经存储访问路径读取。一般寄存器访问更直接、更快,但不能只凭“都存数据”把两者看成相同部件。
习题 2.9 / 控制器各部分的职责
解释 PC、IR、译码、时序和操作控制的分工。
展开答题要点
PC 跟踪指令地址;IR 保存已取出的指令;译码部件判断指令功能;时序部件安排各阶段;操作控制部件依据指令、状态和时序发出控制信号。名称与划分会随具体设计变化。
习题 2.10 / 微指令、微程序、控制 ROM
先说明微操作,再解释其余三个名词。
展开答题要点
微操作是内部基本数据操作;微指令规定一个微周期内的控制动作及后续微地址等信息;微程序是一组按序或分支执行的微指令;在微程序控制器中,控制 ROM 等控制存储器保存微程序。硬连线控制器不要求同样的控制 ROM。
习题 2.11 / 数据通道
说明它包含什么、怎样受控制。
展开答题要点
数据通道是寄存器、ALU、内部总线/连线、选择器、缓冲等构成的数据传送和处理路径。控制信号决定哪个源送数据、做什么运算、写到哪里;只有路径而没有正确控制,无法完成指令。
习题 2.12 / 固定长度指令的收益与限制
解释为什么易取指、译码,同时又会限制可编码的信息。
展开答题要点
定长便于确定边界、取指、译码与流水组织;但指令总位数固定,操作码、寄存器字段、立即数和地址字段相互争用位数,可能需要多条指令装常量或形成地址,也可能影响代码密度。
习题 2.13 / LDR R1,[R3] 的执行过程
参照模型机,分步追踪第二条指令。
展开答题要点
按模型依次:PC 给出指令地址并发起读;主存返回指令送 IR,PC 按四字节指令规则更新;译码识别加载和寄存器字段;取 R3 作为有效地址;向主存发起数据读;返回数据送入 R1,结束本条指令。具体缓冲寄存器名、PC 更新时刻和周期数须依模型,不能凭空指定。
习题 2.14 / 同一总线上的 A→B 传送
在普通单次读/写总线周期模型下,能否一次周期直接完成?
展开答题要点
通常不能。先读 A,把内容暂存在 CPU 或总线主设备的缓冲寄存器,再写 B,至少一次读和一次写。数据总线足够宽只解决传输宽度,不能让同一地址总线同时给出两个不同的单元地址。
习题 2.15 / WAR 与 WAW 相关举例
分别构造读后写和写后写,并解释错误的发生条件。
展开答题要点
WAR:I1 读 R1,I2 写 R1;若乱序让 I2 先写,I1 读到错误新值。WAW:I1、I2 都写 R1;程序应保留 I2 的值,若 I1 后完成覆盖就错。简单顺序读、顺序写回五级流水线通常不会出现这两类实际冒险;正文给出完整指令例子。
习题 2.16 / 转移术语
解释目标指令、代价、延迟槽和 BTB。
展开答题要点
目标指令是转移后应执行的目标位置指令;转移代价是因确定方向、目标或冲刷等带来的额外开销;延迟槽是某些指令集规定的、分支之后具有特定执行语义的指令位置;BTB 缓存分支目标等信息。延迟槽不等于处理器碰巧取到的顺序指令。
习题 2.17 / 动态分支预测的过程
以历史状态更新为主线说明。
展开答题要点
用分支地址等信息查预测状态,提前猜方向并结合目标信息取指;分支真正执行后核对结果,正确则继续,错误则恢复正确路径并付出相应代价;据实际结果更新状态。两位饱和计数器是一种典型方案,不是所有处理器唯一实现。
习题 2.18 / 超标量为何要配对检查
给出一个不能任意同时发射的例子。
展开答题要点
多条指令发往不同执行通路前,要检查数据依赖、可用执行资源和发射规则。例如 I1 写 R1、I2 立即读 R1,若缺少正确处理不能当作独立指令任意并行;两条都需要唯一的访存端口也可能资源冲突。
习题 2.19 / 多处理器与多核
说明处理器、芯片和核心三个层次。
展开答题要点
传统多处理器系统常由多个处理器器件或封装构成;多核把多个执行核心集成在一个芯片/封装中。二者都能提供多个执行核心,资源共享、互连与存储结构则依设计;不要仅凭封装数量推断性能。
习题 2.20 / 同构与异构多核
比较核心能力,并说明异构的目的。
展开答题要点
同构核心通常具有相近结构与能力;异构核心存在能力、结构或任务分工差别。异构可在性能、功耗和专用任务效率之间取舍,例如性能核/能效核组合,或 CPU 与专用加速单元协作;术语范围依讨论上下文明确。
习题 2.21 / 8086 的 20 位物理地址
说明 16 位段值与偏移怎样产生地址,并计算 1234H:5678H。
展开答题要点
物理地址=段值×16+偏移,即段值左移四位再相加。本例 12340H+5678H=179B8H。原始 8086 仅有 20 根地址线,超出部分不会成为第 21 根地址线输出。
习题 2.22 / Pentium 整数/浮点的共享与配对
解释讲义“不能同时执行”所要考查的约束,并保留准确边界。
展开答题要点
抓住整数、浮点处理共享部分前级和发射资源,原始 Pentium 的浮点指令不与整数指令组成同拍发射的指令对。不能扩大成任何阶段绝不能重叠。正文也指出讲义的共享级数与原始手册不一致,并说明特殊 FXCH 配对。
习题 2.23 / ARM9TDMI 相对 ARM7TDMI 的改进
从流水线、指令/数据通路和吞吐解释。
展开答题要点
ARM7TDMI 为三级流水,ARM9TDMI 为五级流水,并分离指令与数据访问接口,以缓解取指/数据访问竞争、提高可达频率与吞吐。更深流水仍有数据依赖和转移代价;不要混用本章模型的 F/D/R/E/W 与 ARM9 的具体阶段。
习题 2.24 / 300 MHz ARM920T 的给定指标
用讲义 1.1 的系数计算,并解释结果的实际含义。
展开答题要点
300×1.1=330。原始系数是 Dhrystone VAX MIPS/MHz,因此准确写为 330 DMIPS。若按讲义旧写法答“330 MIPS”,应同时说明这是基准分数,不能直接断言真实每秒执行 3.3 亿条 Arm 指令。
习题 2.25 / MIPS 为什么不是万能速度指标
比较指令吞吐与完成同一任务的时间。
展开答题要点
不同指令集、编译结果与工作负载所需指令数 IC 不同,平均 CPI 也不同。MIPS 高并不保证同一任务更快。应明确任务,并结合 T_CPU=IC×CPI/f 或真实耗时比较;基准分数也只能在其测试条件内解释。
两章学完以后
先把六条主线接起来,再向第三章走
第一章留下三项本领
- 位串要结合编码规则解释,不能只看 0、1 就直接判定数值。
- 固定宽度后再算补码,分别检查进位和有符号溢出。
- 字符、数值、字节地址与整数高低位是不同层面的概念。
第二章留下三项本领
- 追踪一条指令的地址、数据和控制过程。
- 分析并行技术增加了什么资源、仍共享什么资源。
- 比较性能先固定任务,再看执行时间与指标的定义。
复习时,把第一章的进制、补码和字符串表重新做一遍;第二章把 LDR R1,[R3] 的执行过程写一遍,再画五级流水线和两组字节存储体。不顺的地方沿题号回查,不必每次从历史材料重新读起。
正文指出的讲义问题需要连同边界一起记:进位不等于有符号溢出,延迟槽不等于任意预取,SMT 可以真实重叠执行,330 DMIPS 不等于每秒真实执行 3.3 亿条指令。这里的修正是为避免形成错误模型。