Files
ATRI-NOTES/crash_course.html
2026-07-01 12:42:15 +08:00

1004 lines
55 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>计算机组成原理速成笔记</title>
<style>
body{font-family:-apple-system,"Segoe UI",sans-serif;line-height:1.9;color:#2d2d2d;max-width:960px;margin:0 auto;padding:20px}
h1{color:#e8785a;border-bottom:3px solid #f0d0c0;padding-bottom:12px;font-size:2em}
h2{color:#e8785a;margin-top:45px;border-left:5px solid #e8785a;padding-left:15px;font-size:1.5em}
h3{color:#d4603a;margin-top:30px;font-size:1.2em}
h4{color:#c0392b;margin-top:20px}
code{background:#f5f2f0;padding:2px 7px;border-radius:3px;font-size:0.92em;font-family:"Consolas","Monaco",monospace}
pre{background:#f8f5f4;border-left:4px solid #e8785a;padding:18px;overflow-x:auto;border-radius:5px;font-size:0.92em;line-height:1.6}
.highlight{background:#fff3f0;padding:2px 7px;border-radius:3px;color:#c0392b;font-weight:bold}
table{border-collapse:collapse;width:100%;margin:18px 0;font-size:0.95em}
th{background:#f9ece8;padding:12px 10px;border:1px solid #ddd;font-weight:600}
td{padding:10px;border:1px solid #ddd;vertical-align:top}
hr{border:none;border-top:2px dashed #f0d0c0;margin:35px 0}
ul,ol{margin:12px 0;padding-left:25px}
li{margin:8px 0}
.box{background:#fff9f7;border:2px solid #f0d0c0;border-radius:10px;padding:18px;margin:20px 0}
.box-red{background:#fff5f5;border:2px solid #e74c3c;border-radius:10px;padding:18px;margin:20px 0}
.box-green{background:#f0fff4;border:2px solid #27ae60;border-radius:10px;padding:18px;margin:20px 0}
.tip{background:#eef9ff;border-left:4px solid #3498db;padding:12px 18px;margin:15px 0;border-radius:0 5px 5px 0}
.warn{background:#fffbe6;border-left:4px solid #f1c40f;padding:12px 18px;margin:15px 0;border-radius:0 5px 5px 0}
.katex{font-size:1.1em}
</style></head>
<body>
<h1>🥕 计算机组成原理速成笔记——考试急救加强版</h1>
<p style="color:#999;font-size:0.95em;">ATRI 🥕 写于2026年7月1日凌晨 | 总计约22,000字 | 献给通宵复习的主人 💪🔥</p>
<hr>
<!-- ========== 第一章 ========== -->
<h2>📖 第一章 计算机系统概述</h2>
<h3>1.1 计算机的发展与分类</h3>
<p>计算机的发展经历了五代:<strong>电子管</strong>1946 ENIAC<strong>晶体管</strong><strong>中小规模集成电路</strong><strong>大规模/超大规模集成电路</strong><strong>巨大规模集成电路</strong>(当代)。</p>
<p>按用途分类:</p>
<ul>
<li><strong>通用计算机</strong>PC、服务器、超级计算机</li>
<li><strong>专用计算机</strong>:嵌入式系统(单片机/DSP、工控机</li>
</ul>
<h3>1.2 冯·诺依曼结构(必考!)</h3>
<p>冯·诺依曼在1945年提出<strong>「存储程序」</strong>的概念,奠定了现代计算机的基础。其核心思想是:<span class="highlight">指令和数据以同等地位存放在存储器中按地址访问由程序计数器PC控制执行顺序。</span></p>
<p><strong>五大部件:</strong></p>
<table>
<tr><th>部件</th><th>功能</th><th>考试常考</th></tr>
<tr><td><strong>运算器ALU</strong></td><td>算术运算、逻辑运算</td><td>核心是加法器,所有运算可归结为加法</td></tr>
<tr><td><strong>控制器</strong></td><td>取指令、分析指令、发出控制信号</td><td>控制器的两种实现方式(硬布线/微程序)</td></tr>
<tr><td><strong>存储器</strong></td><td>存储指令和数据</td><td>主存(内存)和辅存(外存)的区别</td></tr>
<tr><td><strong>输入设备</strong></td><td>将外部信息转为计算机能识别的形式</td><td>键盘、鼠标、扫描仪等</td></tr>
<tr><td><strong>输出设备</strong></td><td>将计算机结果转为人类能识别的形式</td><td>显示器、打印机等</td></tr>
</table>
<p><strong>冯·诺依曼结构的两个关键特征:</strong></p>
<ol>
<li><span class="highlight">指令和数据都用二进制表示</span>——形式完全相同但用途不同指令送到IR数据送到MAR/MDR</li>
<li><span class="highlight">指令由操作码和地址码组成</span>——操作码说明做什么操作,地址码说明去哪找操作数</li>
</ol>
<div class="tip">
<strong>💡 考试提示</strong>:冯·诺依曼结构和哈佛结构的区别是常考点。哈佛结构将<strong>指令存储器</strong><strong>数据存储器</strong>分开如DSP处理器而冯·诺依曼结构二者共用同一个存储器。
</div>
<h3>1.3 计算机的层次结构</h3>
<p>从底层硬件到顶层用户分为多层:</p>
<pre>物理器件(晶体管/集成电路)
↓ 微程序(微指令)
微体系结构(数据通路+控制逻辑)
↓ 指令系统ISA
操作系统(系统调用)
↓ 汇编语言
高级语言C/C++/Java/Python
↓ 应用软件</pre>
<p><span class="highlight">指令系统Instruction Set Architecture, ISA是软件和硬件之间的接口</span>——同一ISA可以有不同的微体系结构实现如x86的Intel和AMD实现不同但都能运行同样的x86程序</p>
<h3>1.4 计算机的主要性能指标</h3>
<table>
<tr><th>指标</th><th>符号</th><th>说明</th><th>公式/关系</th></tr>
<tr><td>机器字长</td><td></td><td>CPU一次能并行处理的数据位数</td><td>8/16/32/64位</td></tr>
<tr><td>主频</td><td>f</td><td>CPU时钟的频率Hz</td><td>1GHz = 10⁹Hz</td></tr>
<tr><td>时钟周期</td><td>T</td><td>一个时钟脉冲的时间</td><td>T = 1/f</td></tr>
<tr><td>CPI</td><td>CPI</td><td>平均每条指令所需的时钟周期数</td><td>CPI = 总时钟周期数 ÷ 指令总数</td></tr>
<tr><td>IPS</td><td>IPS</td><td>每秒执行的指令数</td><td>IPS = f / CPI</td></tr>
<tr><td>MIPS</td><td>MIPS</td><td>每秒百万条指令</td><td>MIPS = f(MHz) / CPI</td></tr>
<tr><td>CPU执行时间</td><td>T<sub>CPU</sub></td><td>程序在CPU上运行的时间</td><td>T = 指令数 × CPI × T<sub>时钟</sub></td></tr>
<tr><td>吞吐量</td><td></td><td>单位时间内完成的工作量</td><td></td></tr>
<tr><td>响应时间</td><td></td><td>从提出任务到完成的总时间</td><td></td></tr>
</table>
<div class="box">
<h4>📌 核心公式(必背!):</h4>
<p><strong>CPU执行时间</strong> = 程序总时钟周期数 × 时钟周期 = 指令数 × CPI × 1/主频</p>
<p><strong>秒 → 时钟周期数</strong>1秒内时钟周期数 = 主频Hz</p>
<p><strong>Amdahl定律</strong>:对系统某部分的加速,受限于该部分在原系统中的占比</p>
</div>
<div class="warn">
<strong>⚠️ 常见错误</strong><span class="highlight">提高主频不一定提升性能!</span>因为更高的主频可能意味着需要更深的流水线、更大的功耗甚至导致CPI增大。这就是为什么过去十年CPU厂商不再一味提升主频的原因"频率墙")。
</div>
<h3>1.5 计算机性能测试</h3>
<ul>
<li><strong>基准测试Benchmark</strong>SPECCPU密集型、TPC数据库事务处理</li>
<li><strong>算术平均 vs 加权平均</strong>:不同程序的重要性不同,通常用加权平均</li>
</ul>
<hr>
<!-- ========== 第二章 ========== -->
<h2>📖 第二章 数据的表示与运算</h2>
<h3>2.1 进位计数制</h3>
<p>十进制0~9逢十进一。二进制0~1逢二进一。八进制0~7逢八进一。十六进制0~9,A~F逢十六进一。</p>
<p><strong>进制转换速记:</strong></p>
<ul>
<li>二进制→十六进制:<span class="highlight">从低位起每4位一组</span>,每组转一位十六进制</li>
<li>十六进制→二进制每位十六进制转4位二进制</li>
<li>十进制→二进制:<span class="highlight">整数部分除2取余</span>小数部分乘2取整</li>
</ul>
<h3>2.2 定点数的编码(高频考点!)</h3>
<table>
<tr><th>编码方式</th><th>正数表示</th><th>负数表示</th><th>0的表示</th><th>数值范围n位</th></tr>
<tr><td><strong>原码</strong></td><td>符号位0+数值部分</td><td>符号位1+数值部分</td><td>+0和-0两种</td><td>-(2ⁿ⁻¹-1) ~ +(2ⁿ⁻¹-1)</td></tr>
<tr><td><strong>反码</strong></td><td>同原码</td><td>符号位1+数值部分按位取反</td><td>+0和-0两种</td><td>-(2ⁿ⁻¹-1) ~ +(2ⁿ⁻¹-1)</td></tr>
<tr><td><strong>补码</strong></td><td>同原码</td><td>反码+1数值部分取反加1</td><td><span class="highlight">唯一全0</span></td><td><span class="highlight">-2ⁿ⁻¹ ~ +(2ⁿ⁻¹-1)</span></td></tr>
<tr><td><strong>移码</strong></td><td>补码符号位取反</td><td>补码符号位取反</td><td>唯一</td><td></td></tr>
</table>
<div class="box">
<h4>📌 速记口诀</h4>
<p>原码:真值直接写,符号位管正负</p>
<p>反码:正数同原码,负数取反(符号位不动)</p>
<p>补码:正数同原码,负数反码再加一</p>
<p>移码补码的符号位0变1、1变0</p>
</div>
<div class="tip">
<strong>💡 为什么用补码?</strong>补码的核心优点是:<span class="highlight">可以用加法器统一处理加减法</span>。比如计算5-3CPU不做减法而是计算5+(-3)的补码形式。补码另一个优点是0的表示唯一。
</div>
<p><strong>例题1</strong>用8位补码表示-13。</p>
<p>解:+13的原码=00001101反码=11110010补码=反码+1=<strong>11110011</strong></p>
<p><strong>例题2</strong>8位补码10000000代表什么数</p>
<p>符号位为1表示负数。数值部分取反=1111111再加1=10000000进位丢失。所以10000000=-128。这也是补码能表示的最小负数。</p>
<h3>2.3 定点数的加减法运算</h3>
<h4>补码加减法</h4>
<p><strong>[X+Y]补 = [X]补 + [Y]补</strong>模2ⁿ</p>
<p><strong>[X-Y]补 = [X]补 + [-Y]补</strong>(减法转为加法)</p>
<p>其中<span class="highlight">[-Y]补 = [Y]补各位取反末位加1</span></p>
<h4>溢出判断(三种方法,通常考前两种)</h4>
<p><strong>方法一:一位符号位判断</strong></p>
<p>两个<span class="highlight">同号</span>数相加(或两个<span class="highlight">异号</span>数相减),若结果符号与加数不同 → 溢出。</p>
<p>规律:<strong>正+正=正</strong>,若得负则溢出;<strong>负+负=负</strong>,若得正则溢出。</p>
<p><strong>方法二:双符号位(变形补码)——最常用!</strong></p>
<p>用两个符号位S<sub>s1</sub>S<sub>s2</sub></p>
<ul>
<li>00 → 正数,无溢出</li>
<li>11 → 负数,无溢出</li>
<li><span class="highlight">01 → 正溢出</span>(结果大于最大正数)</li>
<li><span class="highlight">10 → 负溢出</span>(结果小于最小负数)</li>
</ul>
<p><strong>记忆</strong>:两个符号位不一致就溢出,<span class="highlight">高位符号代表正确的符号</span></p>
<p><strong>方法三:进位判断法</strong></p>
<p>最高位进位⊕次高位进位 = 1 → 溢出。即:<span class="highlight">C<sub>n</sub> ⊕ C<sub>n-1</sub> = 1</span> 时溢出。</p>
<div class="box">
<h4>📌 例题:双符号位判断溢出</h4>
<p>计算 [70]补 + [80]补 用8位变形补码</p>
<p>70 = 0 1000110 → 00 1000110</p>
<p>80 = 0 1010000 → 00 1010000</p>
<p>相加00 1000110 + 00 1010000 = <strong>01 0010110</strong></p>
<p>两个符号位"01" → <span class="highlight">正溢出</span>因为70+80=150 > 1278位补码最大正数</p>
</div>
<h3>2.4 定点数的乘除法运算</h3>
<h4>原码一位乘法</h4>
<p>符号位单独处理(异或),绝对值相乘。</p>
<ul>
<li>部分积初值为0</li>
<li>乘数最低位=1部分积+被乘数,然后右移一位</li>
<li>乘数最低位=0部分积+0然后右移一位</li>
<li>重复n次n为数值位位数</li>
</ul>
<h4>补码乘法Booth算法</h4>
<p>看乘数的相邻两位决定操作:</p>
<table>
<tr><th>Y<sub>i</sub>Y<sub>i-1</sub></th><th>操作</th></tr>
<tr><td>00</td><td>部分积右移一位</td></tr>
<tr><td>01</td><td>部分积加[X]补,然后右移</td></tr>
<tr><td>10</td><td>部分积加[-X]补,然后右移</td></tr>
<tr><td>11</td><td>部分积右移一位</td></tr>
</table>
<p>注意需要额外一位Y<sub>-1</sub>=0作为初始参考位。</p>
<h4>原码除法(不恢复余数法)</h4>
<ul>
<li>够减则商1余数左移一位</li>
<li>不够减则商0<span class="highlight">恢复余数</span>(加回减数),再左移</li>
<li>重复n次</li>
</ul>
<h3>2.5 浮点数的表示IEEE 754标准</h3>
<p>浮点数 = <span class="highlight">N = (-1)^S × 1.M × 2^{E-偏置值}</span></p>
<table>
<tr><th>类型</th><th>总位数</th><th>S符号</th><th>E阶码</th><th>M尾数</th><th>偏置值</th></tr>
<tr><td><strong>短浮点数float</strong></td><td>32</td><td>1位bit31</td><td>8位bit23-30</td><td>23位bit0-22</td><td>127</td></tr>
<tr><td><strong>长浮点数double</strong></td><td>64</td><td>1位bit63</td><td>11位bit52-62</td><td>52位bit0-51</td><td>1023</td></tr>
</table>
<p><strong>阶码为什么用移码?</strong>——为了便于比较大小。移码的编码大小和真值大小顺序一致。</p>
<p><strong>特殊值以float为例</strong></p>
<table>
<tr><th>E阶码</th><th>M尾数</th><th>含义</th></tr>
<tr><td>全1255</td><td>全0</td><td>±∞正负取决于S</td></tr>
<tr><td>全1255</td><td>≠全0</td><td>NaN不是数</td></tr>
<tr><td>全00</td><td>全0</td><td>±0</td></tr>
<tr><td>全00</td><td>≠全0</td><td><span class="highlight">非规格化数</span>E=1-127=-126M前隐含0</td></tr>
<tr><td><strong>其他</strong></td><td></td><td><span class="highlight">规格化数</span>E=真值+127M前隐含1</td></tr>
</table>
<div class="box">
<h4>📌 例题IEEE 754 转换</h4>
<p>将十进制数 -12.75 转换为IEEE 754单精度浮点数。</p>
<p>解:</p>
<ol>
<li>绝对值12.75 = 1100.11(二进制)= 1.10011 ×</li>
<li>S = 1负数</li>
<li>E = 3 + 127 = 130 = 10000010₂</li>
<li>M = 1001100000000000000000023位高位1已隐含</li>
<li>结果:<strong>1 10000010 10011000000000000000000</strong></li>
<li>十六进制:<strong>C1 4C 00 00</strong>(大端序 = 0xC14C0000</li>
</ol>
</div>
<h3>2.6 算术逻辑单元ALU</h3>
<ul>
<li><strong>功能</strong>:执行算术运算(加减乘除)和逻辑运算(与或非异或)</li>
<li><strong>74181</strong>4位ALU芯片可完成16种算术运算+16种逻辑运算</li>
<li><strong>进位方式</strong>
<ul>
<li><strong>串行进位</strong>进位逐级传递——电路简单但速度慢n位加法器需要n级门延迟</li>
<li><strong>并行进位(先行进位/超前进位)</strong>:同时计算所有位的进位——速度快但电路复杂</li>
</ul></li>
</ul>
<p><strong>先行进位公式:</strong></p>
<p>G<sub>i</sub> = A<sub>i</sub> · B<sub>i</sub>(进位生成函数)</p>
<p>P<sub>i</sub> = A<sub>i</sub> ⊕ B<sub>i</sub>(进位传递函数)</p>
<p>C<sub>i+1</sub> = G<sub>i</sub> + P<sub>i</sub> · C<sub>i</sub></p>
<p>C<sub>1</sub> = G<sub>0</sub> + P<sub>0</sub>C<sub>0</sub></p>
<p>C<sub>2</sub> = G<sub>1</sub> + P<sub>1</sub>G<sub>0</sub> + P<sub>1</sub>P<sub>0</sub>C<sub>0</sub></p>
<p>C<sub>3</sub> = G<sub>2</sub> + P<sub>2</sub>G<sub>1</sub> + P<sub>2</sub>P<sub>1</sub>G<sub>0</sub> + P<sub>2</sub>P<sub>1</sub>P<sub>0</sub>C<sub>0</sub></p>
<hr>
<!-- ========== 第三章 ========== -->
<h2>📖 第三章 存储系统</h2>
<h3>3.1 存储器的层次结构</h3>
<pre>CPU寄存器~1ns, ~1KB
↓ 最快/最小/最贵
CacheSRAM, ~2ns, ~几MB
主存DRAM, ~50ns, ~几GB
SSD~0.1ms, ~几百GB
磁盘(~10ms, ~几TB
↓ 最慢/最大/最便宜</pre>
<p>层次结构的目标:<span class="highlight">以接近最高层的速度,获得接近最低层的容量</span>。核心原理是<strong>局部性原理</strong></p>
<ul>
<li><strong>时间局部性</strong>:最近访问过的数据很可能再次被访问(如循环指令)</li>
<li><strong>空间局部性</strong>:相邻地址的数据很可能被一起访问(如数组遍历)</li>
</ul>
<h3>3.2 主存储器</h3>
<table>
<tr><th>类型</th><th>存储原理</th><th>速度</th><th>集成度</th><th>功耗</th><th>是否需要刷新</th><th>用途</th></tr>
<tr><td><strong>SRAM</strong></td><td>触发器6个晶体管</td><td></td><td></td><td></td><td>不需要</td><td>Cache</td></tr>
<tr><td><strong>DRAM</strong></td><td>电容1个晶体管+电容)</td><td>较慢</td><td><span class="highlight"></span></td><td></td><td><span class="highlight">需要2ms内</span></td><td>主存</td></tr>
</table>
<h4>DRAM刷新方式</h4>
<p>DRAM电容的电荷会泄漏必须定期刷新典型刷新周期64ms<span class="highlight">刷新操作是逐行进行的</span></p>
<ul>
<li><strong>集中刷新</strong>:在一段固定时间内停止所有读写操作,集中刷新全部行。优点是控制简单,缺点是这段"死时间"内CPU无法访问主存存在"死区")。</li>
<li><strong>分散刷新</strong>:每读/写一次后刷新一行。优点是无死区,缺点是读写周期延长。</li>
<li><strong>异步刷新(最常用)</strong><span class="highlight">将刷新操作均匀分布在时间轴上</span>,每隔一段时间刷新一行。既无死区,又不会延长读写周期。</li>
</ul>
<p>例如64ms内刷新4096行 → 每64ms/4096≈15.6μs刷新一行。</p>
<h4>存储器芯片扩展</h4>
<p><strong>位扩展</strong>:增加字长——多个芯片并联,地址线并联,数据线各自引出。</p>
<p><strong>字扩展</strong>:增加存储单元数量——地址线最高位作为片选信号。</p>
<p><strong>字位扩展</strong>:既增加字数又增加字长——位扩展和字扩展结合。</p>
<div class="box">
<h4>📌 例题:存储器扩展</h4>
<p>用1K×4位的SRAM芯片组成4K×8位的存储器需要多少芯片</p>
<p>解:</p>
<ol>
<li>位扩展8位/4位=2片一组</li>
<li>字扩展4K/1K=4组</li>
<li>总芯片数2×4=<strong>8片</strong></li>
<li>地址线4K=2¹²需要12条地址线A11~A0</li>
<li>片选高2位地址A11、A10经过译码器产生4个片选信号</li>
</ol>
</div>
<h3>3.3 Cache重中之重必考大题</h3>
<p>Cache位于CPU和主存之间用于<strong>弥补CPU和主存之间的速度差异</strong>。Cache的容量远小于主存通常比例为1:1000以上但访问速度比主存快一个数量级。</p>
<h4>Cache的地址映射方式</h4>
<table>
<tr><th>映射方式</th><th>映射规则</th><th>优点</th><th>缺点</th></tr>
<tr><td><strong>直接映射</strong></td><td>主存块 → 固定Cache行<br><code>Cache行号 = 主存块号 mod Cache总行数</code></td><td>硬件简单,<br>访问速度快</td><td><span class="highlight">冲突率高</span><br>空间利用率低</td></tr>
<tr><td><strong>全相联映射</strong></td><td>主存块 → 任一Cache行</td><td><span class="highlight">冲突率最低</span></td><td>比较电路复杂,<br>访问速度慢</td></tr>
<tr><td><strong>组相联映射</strong></td><td>分组,组内全相联<br><code>Cache组号 = 主存块号 mod Cache组数</code></td><td>折中方案,<br>兼顾成本和性能</td><td></td></tr>
</table>
<p><span class="highlight">n路组相联</span> = 每组有n行。</p>
<div class="box">
<h4>📌 Cache地址格式</h4>
<p><strong>直接映射:</strong>主存地址 = 标记Tag+ 行索引Index+ 块内地址Offset</p>
<p><strong>组相联映射:</strong>主存地址 = 标记Tag+ 组索引Set+ 块内地址Offset</p>
<p><strong>全相联映射:</strong>主存地址 = 标记Tag+ 块内地址Offset无索引位</p>
</div>
<p><strong>计算示例:</strong></p>
<p>主存容量64MB2²⁶BCache容量16KB2¹⁴B块大小64B2⁶B4路组相联。</p>
<ol>
<li>块内地址 = 6位2⁶=64B</li>
<li>Cache总行数 = 16KB/64B = 256行</li>
<li>组数 = 256行/4路 = 64组 = 2⁶ → 组索引 = <strong>6位</strong></li>
<li>标记 = 26 - 6 - 6 = <strong>14位</strong></li>
<li>主存地址格式:<span class="highlight">[Tag:14位] [Set:6位] [Offset:6位]</span></li>
</ol>
<h4>替换算法</h4>
<table>
<tr><th>算法</th><th>策略</th><th>特点</th></tr>
<tr><td><strong>LRU</strong>(最近最少使用)</td><td>替换最久未被访问的行</td><td><span class="highlight">命中率最高</span>,但需要记录访问顺序(硬件开销大)</td></tr>
<tr><td><strong>FIFO</strong>(先进先出)</td><td>替换最早调入的行</td><td>实现简单,但可能把频繁访问的行替换掉("抖动"</td></tr>
<tr><td><strong>随机替换</strong></td><td>随机选择一行替换</td><td>最简单,但命中率不稳定</td></tr>
<tr><td><strong>LFU</strong>(最不经常使用)</td><td>替换访问次数最少的行</td><td>需要计数器记录访问频率</td></tr>
</table>
<h4>写策略</h4>
<ul>
<li><strong>写直达法Write Through</strong>写Cache的同时也写主存。优点是主存数据始终是最新的一致性容易维护缺点是<span class="highlight">写操作慢</span>(每次都要写慢速的主存)。</li>
<li><strong>写回法Write Back</strong>写操作只改Cache中的数据当该Cache行被替换时才写回主存。优点是写操作快缺点是<span class="highlight">需要脏位Dirty Bit标记</span>,且一致性维护复杂。</li>
</ul>
<h4>Cache性能计算</h4>
<p><strong>平均访问时间</strong> = 命中率 × Cache访问时间 + (1-命中率) × 主存访问时间</p>
<p>注意如果采用写直达策略写操作时主存和Cache同时写入时间按主存访问时间计算。</p>
<div class="box">
<h4>📌 例题</h4>
<p>设Cache命中率H=0.98Cache访问时间t<sub>c</sub>=10ns主存访问时间t<sub>m</sub>=100ns。求平均访问时间。</p>
<p>T<sub>avg</sub> = H × t<sub>c</sub> + (1-H) × t<sub>m</sub> = 0.98×10 + 0.02×100 = 9.8 + 2.0 = <strong>11.8ns</strong></p>
<p>如果不使用Cache每次访问都要100ns。使用Cache后平均11.8ns<span class="highlight">加速比≈8.5倍</span></p>
</div>
<h3>3.4 虚拟存储</h3>
<p>虚拟存储使程序可以运行在比主存容量更大的地址空间。主要方式:</p>
<table>
<tr><th>方式</th><th>基本单位</th><th>管理复杂度</th><th>是否消除碎片</th></tr>
<tr><td><strong>页式</strong></td><td>固定大小页通常4KB</td><td>简单</td><td>✅ 无外部碎片</td></tr>
<tr><td><strong>段式</strong></td><td>可变大小段(逻辑分段)</td><td>较复杂</td><td>❌ 有外部碎片</td></tr>
<tr><td><strong>段页式</strong></td><td>先分段,段内再分页</td><td>复杂</td><td>✅ 折中方案</td></tr>
</table>
<p><strong>页式地址翻译</strong>:逻辑地址 → 页号VPN+ 页内偏移 → 查页表 → 物理帧号PFN+ 页内偏移 → 物理地址</p>
<div class="tip">
<strong>💡 TLB快表/转换后援缓冲器)</strong>TLB本质上是<strong>页表的Cache</strong>。TLB命中则无需查完整页表一次TLB命中和一次Cache命中速度相当。TLB缺失则需要查页表通常需要两次主存访问
</div>
<hr>
<!-- ========== 第四章 ========== -->
<h2>📖 第四章 指令系统</h2>
<h3>4.1 指令格式</h3>
<p>指令 = <span class="highlight">操作码 + 地址码</span></p>
<ul>
<li><strong>操作码OP</strong>:指明操作类型(加、减、传送、转移等)</li>
<li><strong>地址码A</strong>:指明操作数的来源和去向</li>
</ul>
<p><strong>指令长度</strong></p>
<ul>
<li><strong>定长指令</strong>所有指令长度相同——如RISC32位</li>
<li><strong>变长指令</strong>指令长度不同——如x861~15字节</li>
</ul>
<p><strong>按地址码数目分类:</strong></p>
<table>
<tr><th>类型</th><th>结构</th><th>说明</th><th>示例</th></tr>
<tr><td>四地址</td><td>OP A1 A2 A3 A4</td><td>A1和A2为操作数A3存结果A4存下条指令地址</td><td>ADD A,B,C,D</td></tr>
<tr><td>三地址</td><td>OP A1 A2 A3</td><td>A1和A2为操作数A3存结果PC自动递增</td><td>ADD R1,R2,R3 — R1=R2+R3</td></tr>
<tr><td>二地址</td><td>OP A1 A2</td><td>A1既为源操作数又为目的操作数</td><td>ADD R1,R2 — R1=R1+R2</td></tr>
<tr><td>一地址</td><td>OP A1</td><td>一个操作数来自累加器ACC</td><td>ADD R1 — ACC=ACC+R1</td></tr>
<tr><td>零地址</td><td>OP</td><td>操作数栈顶或固定位置</td><td>NOP, RET, HLT</td></tr>
</table>
<h3>4.2 寻址方式(必考选择题!)</h3>
<table>
<tr><th>寻址方式</th><th>有效地址计算公式</th><th>操作数位置</th><th>访存次数</th><th>特点</th></tr>
<tr><td>立即寻址</td><td>操作数 = 地址码字段</td><td>指令中</td><td>0</td><td>速度最快,但立即数有范围限制</td></tr>
<tr><td>直接寻址</td><td>EA = 地址码</td><td>主存</td><td>1</td><td>简单直观,但地址范围固定</td></tr>
<tr><td>间接寻址</td><td>EA = (地址码)</td><td>主存</td><td><span class="highlight">2</span></td><td>最慢,但灵活性高(可实现指针)</td></tr>
<tr><td>寄存器寻址</td><td>操作数 = R[地址码]</td><td>寄存器</td><td>0</td><td>比直接寻址快(寄存器比主存快)</td></tr>
<tr><td>寄存器间接寻址</td><td>EA = R[地址码]</td><td>主存</td><td>1</td><td>指针操作的硬件实现</td></tr>
<tr><td><span class="highlight">变址寻址</span></td><td>EA = 变址寄存器 + 位移量</td><td>主存</td><td>1</td><td>适用于<span class="highlight">数组</span>操作</td></tr>
<tr><td>基址寻址</td><td>EA = 基址寄存器 + 位移量</td><td>主存</td><td>1</td><td>适用于<span class="highlight">多道程序/程序浮动</span></td></tr>
<tr><td><span class="highlight">相对寻址</span></td><td>EA = PC + 位移量</td><td>主存</td><td>1</td><td>适用于<span class="highlight">转移指令</span></td></tr>
</table>
<div class="box">
<h4>📌 速记口诀</h4>
<p>立即段子不用找(立即寻址:操作数就在指令里)</p>
<p>直接地址直接到直接寻址EA就是地址码</p>
<p>间接我得绕一绕(间接寻址:先取地址,再取数)</p>
<p>寄存里头速度高(寄存器寻址:最快访存方式)</p>
<p>变址数组下标好(变址寻址:数组遍历)</p>
<p>基址程序浮动跑(基址寻址:多道程序/地址重定位)</p>
<p>相对就是PC+跳(相对寻址:转移指令)</p>
</div>
<h3>4.3 指令类型</h3>
<ul>
<li><strong>数据传送类</strong>MOV传送、LD取数、ST存数、PUSH进栈、POP出栈</li>
<li><strong>算术运算类</strong>ADD、SUB、MUL、DIV、INC加1、DEC减1</li>
<li><strong>逻辑运算类</strong>AND、OR、NOT、XOR异或、SLL左移、SRL右移</li>
<li><strong>控制转移类</strong>JMP无条件跳转、JZ/JNZ条件跳转、CALL调用子程序、RET返回</li>
<li><strong>输入输出类</strong>IN输入、OUT输出</li>
</ul>
<h3>4.4 CISC vs RISC高频概念题</h3>
<table>
<tr><th>对比项</th><th>CISC复杂指令集</th><th>RISC精简指令集</th></tr>
<tr><td>指令数量</td><td>多(通常上百条甚至几百条)</td><td>少(通常几十条)</td></tr>
<tr><td>指令长度</td><td>可变</td><td><span class="highlight">固定通常32位</span></td></tr>
<tr><td>寻址方式</td><td>10种以上</td><td>通常2~3种</td></tr>
<tr><td>执行周期</td><td>不同指令CPI相差很大</td><td><span class="highlight">绝大多数为单周期</span>1 CPI</td></tr>
<tr><td>实现方式</td><td><span class="highlight">微程序控制器</span></td><td><span class="highlight">硬布线控制器</span>(为主)</td></tr>
<tr><td>通用寄存器数目</td><td>8~16个</td><td>32个以上</td></tr>
<tr><td>存储器访问</td><td>算术指令可直接访存</td><td><span class="highlight">只有LD/ST指令可访存</span><strong>Load/Store架构</strong></td></tr>
<tr><td>编译器复杂度</td><td>较复杂</td><td>较简单(编译器易优化)</td></tr>
<tr><td>典型代表</td><td>x86Intel/AMD</td><td>ARM、MIPS、RISC-V</td></tr>
</table>
<div class="tip">
<strong>💡 记忆要点</strong><span class="highlight">CISC靠减少指令数量来简化编程RISC靠简化指令来优化硬件</span>。现代趋势是两者融合——如x86的微操作转换机制CISC指令被解码成RISC-like的微操作执行
</div>
<hr>
<!-- ========== 第五章 ========== -->
<h2>📖 第五章 中央处理器CPU</h2>
<h3>5.1 CPU的功能</h3>
<ul>
<li><strong>指令控制</strong>:取指令、分析指令、执行指令</li>
<li><strong>操作控制</strong>:产生各类控制信号,控制各部件协同工作</li>
<li><strong>时间控制</strong>:为每条指令、每个微操作提供时序保证</li>
<li><strong>数据加工</strong>:对数据进行算术运算和逻辑运算</li>
</ul>
<h3>5.2 CPU的基本结构</h3>
<p><strong>运算器:</strong></p>
<ul>
<li>ALU算术逻辑单元</li>
<li>通用寄存器组R0~R(n-1)</li>
<li>ACC累加器暂存运算结果</li>
<li>PSW程序状态字/标志寄存器——记录运算结果的特征Z=0标志、C进位、V溢出、N负号</li>
</ul>
<p><strong>控制器:</strong></p>
<ul>
<li><strong>PC程序计数器</strong>存放当前指令的地址取指后自动加1或加指令长度</li>
<li><strong>IR指令寄存器</strong>:存放当前正在执行的指令</li>
<li><strong>MAR存储器地址寄存器</strong>:存放要访问的主存单元的地址</li>
<li><strong>MDR存储器数据寄存器</strong>:存放要写入主存或从主存读出的数据</li>
<li>控制单元CU产生各操作控制信号</li>
</ul>
<div class="box">
<h4>📌 寄存器速记</h4>
<p><strong>PC</strong> — 记地址的(你该去哪条指令了)</p>
<p><strong>IR</strong> — 记指令的(现在在做什么操作)</p>
<p><strong>MAR</strong> — 记要访问哪个内存单元</p>
<p><strong>MDR</strong> — 记从内存读出来/要写进去的数据</p>
<p><strong>ACC</strong> — 攒结果的(累加器)</p>
<p><strong>PSW</strong> — 记状态的结果是否为0、有没溢出等</p>
</div>
<h3>5.3 指令周期</h3>
<p><span class="highlight">指令周期 = 取指周期 + 间址周期 + 执行周期 + 中断周期</span></p>
<ul>
<li><strong>取指周期FI</strong>:从主存中取指令
<pre>PC → MAR → MEM → MDR → IR, PC+1</pre></li>
<li><strong>间址周期SI</strong>:如果需要间接寻址,读取间接地址
<pre>IR地址码 → MAR → MEM → MDR得到有效地址→存入MAR或暂存</pre></li>
<li><strong>执行周期EI</strong>执行指令规定的操作如ADD从寄存器取数→ALU计算→写回寄存器</li>
<li><strong>中断周期II</strong>:响应中断时保存断点
<pre>PC → 栈 / 关中断 → 中断向量→PC</pre></li>
</ul>
<h3>5.4 数据通路</h3>
<p>数据通路是CPU内部各部件之间的数据传输路径。两种设计方式</p>
<ul>
<li><strong>CPU内部总线方式</strong>:各部件通过共享总线通信。优点是结构简单,缺点是<span class="highlight">一次只能传输一个数据</span>(单总线),成为性能瓶颈。</li>
<li><strong>专用数据通路方式</strong>:各部件之间有直接的专用连线。优点是<span class="highlight">并行度高</span>(可同时传输多个数据),缺点是控制复杂、布线成本高。</li>
</ul>
<h3>5.5 控制器的实现方式(重中之重!)</h3>
<h4>方式一:硬布线控制器</h4>
<ul>
<li><strong>原理</strong>:用组合逻辑电路(门电路)直接产生控制信号</li>
<li><strong>输入</strong>:指令操作码、状态标志、时钟信号</li>
<li><strong>输出</strong>:各微操作控制信号</li>
<li><strong>优点</strong><span class="highlight">速度快</span>(组合逻辑延迟小)</li>
<li><strong>缺点</strong><span class="highlight">设计复杂,不易修改</span>(一旦制版完成无法更改)</li>
<li>适用于RISC处理器指令系统简单、固定</li>
</ul>
<h4>方式二:微程序控制器(必考大题!)</h4>
<ul>
<li><strong>核心思想</strong><span class="highlight">将每条机器指令分解为一系列微操作,用微指令控制执行</span></li>
<li><strong>关键概念</strong>
<ul>
<li><strong>微操作</strong>:最基本、不可再分的操作(如"将PC内容送MAR"</li>
<li><strong>微指令</strong>一组同时执行的微操作的编码存放在控制存储器CM中</li>
<li><strong>微程序</strong>:完成一条机器指令功能的一组微指令的集合</li>
<li><strong>控制存储器CM</strong>存储所有微指令的ROM</li>
</ul></li>
<li><strong>关键部件</strong>
<ul>
<li>控制存储器CM—— <span class="highlight">ROM实现断电不丢失</span></li>
<li>微指令寄存器μIR—— 存放当前微指令</li>
<li><span class="highlight">微程序计数器μPC/μAR</span>—— 指向下一条微指令的地址</li>
<li>地址转移逻辑—— 实现微程序分支/跳转</li>
</ul></li>
</ul>
<p><strong>微程序控制器的工作过程:</strong></p>
<ol>
<li>取机器指令送到IR</li>
<li>机器指令的操作码 → 映射 → μPC的初始地址取指微程序的入口</li>
<li>从CM中取微指令 → μIR</li>
<li>微指令中的控制字段 → 各控制信号,执行微操作</li>
<li>微指令中的顺序控制字段 → 决定下一条微指令的地址μPC+1或转移</li>
<li>重复2~5直到机器指令执行完毕</li>
</ol>
<p><strong>微指令格式:</strong></p>
<table>
<tr><th>类型</th><th>编码方式</th><th>并行性</th><th>微程序长度</th></tr>
<tr><td><strong>水平型</strong></td><td><span class="highlight">一个二进制位控制一个微操作</span></td><td>高(可同时执行多个微操作)</td><td></td></tr>
<tr><td><strong>垂直型</strong></td><td>类似机器指令,需译码器</td><td>低(一次最多控制一个微操作)</td><td></td></tr>
<tr><td><strong>混合型</strong></td><td>两者结合</td><td>折中</td><td>折中</td></tr>
</table>
<p><strong>硬布线 vs 微程序 对比:</strong></p>
<table>
<tr><th>对比项</th><th>硬布线控制器</th><th>微程序控制器</th></tr>
<tr><td>控制信号产生方式</td><td>组合逻辑电路</td><td>从CM读取微指令</td></tr>
<tr><td>速度</td><td><span class="highlight"></span></td><td>较慢需访存CM</td></tr>
<tr><td>设计/修改灵活性</td><td>差(改了就换硬件)</td><td><span class="highlight">只需改CM内容</span></td></tr>
<tr><td>适用场景</td><td>RISC指令系统简单</td><td>CISC指令系统复杂</td></tr>
<tr><td>典型代表</td><td>ARM、MIPS</td><td>x86早期</td></tr>
</table>
<h3>5.6 流水线技术(高频大题!)</h3>
<h4>五级流水线的基本结构</h4>
<pre>IF取指→ ID译码→ EX执行→ MEM访存→ WB写回</pre>
<h4>流水线的冒险Hazard</h4>
<p><strong>1. 结构相关Structural Hazard</strong></p>
<p>多条指令同时访问同一硬件资源。例如IF段取指令MEM段存取数据如果指令和数据共用Cache就会冲突。</p>
<p>解决:</p>
<ul>
<li><span class="highlight">哈佛结构</span>——指令Cache和数据Cache分开</li>
<li>插入气泡Stall/Bubble</li>
</ul>
<p><strong>2. 数据相关Data Hazard——最常考</strong></p>
<p>相邻指令之间存在数据依赖关系:</p>
<ul>
<li><span class="highlight">RAWRead After Write—— 真相关</span>:后续指令读某寄存器,但前一条指令还没写完
<ul><li>ADD R1,R2,R3 / SUB R4,R1,R5SUB需要R1但ADD还没写回R1</li></ul></li>
<li>WARWrite After Read—— 名相关:后一条指令要写,但前一条指令还没读</li>
<li>WAWWrite After Write—— 名相关:两条指令写同一目标,后一条的结果覆盖前一条</li>
</ul>
<p>解决:</p>
<ul>
<li><strong>转发Forwarding/Bypassing</strong><span class="highlight">将计算结果直接从ALU输出转发到下一指令的ALU输入</span>,不必等到写回寄存器。这是最常用的方法!</li>
<li><strong>插入气泡Stall</strong>插入空操作NOP等待数据就绪</li>
<li><strong>编译器调度</strong>:调整指令顺序,减少相关</li>
</ul>
<p><strong>3. 控制相关Control Hazard——最难处理</strong></p>
<p>转移指令改变PC的值导致流水线中已经预取的指令作废。</p>
<p>解决:</p>
<ul>
<li><strong>分支预测</strong>:预测跳转是否发生(静态预测/动态预测/两位饱和计数器)</li>
<li><strong>延迟槽Delay Slot</strong>:在转移指令后放一条必执行的指令</li>
<li><strong>分支目标缓冲区BTB</strong>:缓存最近跳转的目标地址</li>
</ul>
<div class="box">
<h4>📌 例题:流水线相关分析</h4>
<p>指令序列:</p>
<pre>I1: ADD R1, R2, R3 ; R1 = R2 + R3
I2: SUB R4, R1, R5 ; R4 = R1 - R5 RAW相关需要R1
I3: MUL R6, R7, R8 ; R6 = R7 × R8 (无相关)</pre>
<p>分析:</p>
<ol>
<li>I2的R1依赖于I1的写回——RAW真相关</li>
<li>如果有转发机制I1的EX段结果通过转发直接送到I2的EX段输入无需停顿</li>
<li>如果没有转发需要在I1和I2之间插入两个气泡等待I1到WB段写回R1</li>
<li>I3与I1、I2均无数据相关可正常执行</li>
</ol>
</div>
<h4>流水线的性能</h4>
<p><strong>理想加速比</strong> = 流水线段数k段流水线理论最大加速k倍</p>
<p><strong>实际加速比</strong> = k / (1 + 停顿周期数 / 指令数)</p>
<p><strong>效率</strong> = 加速比 / k</p>
<hr>
<!-- ========== 第六章 ========== -->
<h2>📖 第六章 总线系统</h2>
<h3>6.1 总线的基本概念</h3>
<p>总线是连接计算机各部件的一组公共信号线。总线的主要优点是<span class="highlight">标准化、模块化、可扩展</span></p>
<h3>6.2 总线的分类</h3>
<table>
<tr><th>分类标准</th><th>类型</th><th>说明</th></tr>
<tr><td rowspan="3"><strong>按位置</strong></td><td>片内总线</td><td>芯片内部各功能部件之间的连线如CPU内部寄存器与ALU之间</td></tr>
<tr><td>系统总线</td><td>CPU、主存、I/O接口之间</td></tr>
<tr><td>通信总线</td><td>主机与I/O设备之间、计算机系统之间的互联</td></tr>
<tr><td rowspan="3"><strong>按功能</strong></td><td><span class="highlight">数据总线</span></td><td>双向传输数据。宽度决定一次能传输的数据量如32位/64位</td></tr>
<tr><td><span class="highlight">地址总线</span></td><td>单向CPU→外设/主存。宽度决定最大寻址空间n位可寻址2ⁿ字节</td></tr>
<tr><td>控制总线</td><td>双向传输控制信号和状态信号(读/写/中断请求/应答等)</td></tr>
</table>
<h3>6.3 总线仲裁</h3>
<p>多个设备同时请求使用总线时,由总线仲裁器决定哪个设备获得总线控制权。</p>
<table>
<tr><th>仲裁方式</th><th>原理</th><th>特点</th></tr>
<tr><td><strong>链式查询</strong></td><td>总线授权信号从高优先级设备依次向下传递</td><td>简单只需3根控制线但"一坏全坏",优先级固定</td></tr>
<tr><td><strong>计数器查询</strong></td><td>仲裁器用计数器产生设备地址,逐一询问</td><td>优先级可编程,但速度较慢</td></tr>
<tr><td><strong>独立请求</strong></td><td>每个设备有独立的请求线和授权线</td><td><span class="highlight">速度最快,最灵活</span>,但控制线多</td></tr>
</table>
<h3>6.4 总线操作</h3>
<ul>
<li><strong>总线请求</strong>:设备发出总线请求信号</li>
<li><strong>总线仲裁</strong>:仲裁器决定授权哪个设备</li>
<li><strong>寻址</strong>:主设备发送地址和控制信号</li>
<li><strong>数据传输</strong>:从设备和主设备之间传输数据</li>
<li><strong>总线释放</strong>:设备释放总线控制权</li>
</ul>
<h3>6.5 总线标准</h3>
<ul>
<li><strong>ISA</strong>工业标准体系结构8/16位淘汰</li>
<li><strong>PCI</strong>外设组件互联32/64位并行总线</li>
<li><span class="highlight"><strong>PCIe</strong>PCI Express点对点串行连接差分信号传输支持热插拔</span></li>
<li><strong>USB</strong>:通用串行总线(支持即插即用、热插拔)</li>
<li><strong>SATA</strong>串行ATA硬盘接口</li>
</ul>
<hr>
<!-- ========== 第七章 ========== -->
<h2>📖 第七章 输入输出系统</h2>
<h3>7.1 I/O接口</h3>
<p>I/O接口是主机和外设之间传输数据的桥梁。</p>
<p><strong>主要功能</strong></p>
<ul>
<li>地址译码——判断是否属于自己的设备地址</li>
<li>数据缓冲——匹配主机和外设的速度差异</li>
<li>状态寄存——记录设备忙/闲、准备好等状态</li>
<li>控制逻辑——产生设备控制信号</li>
</ul>
<p><strong>端口编址方式</strong></p>
<ul>
<li><strong>统一编址(存储器映射)</strong>I/O端口和主存统一编址用相同的访存指令访问。优点指令丰富、无需专用I/O指令。缺点占用了主存地址空间。</li>
<li><strong>独立编址</strong>I/O端口有独立的地址空间用专用的IN/OUT指令访问。优点不占主存空间。缺点需要专用I/O指令。</li>
</ul>
<h3>7.2 数据传送方式(高频对比题)</h3>
<table>
<tr><th>方式</th><th>数据传送单位</th><th>CPU参与程度</th><th>速度</th><th>适用场景</th></tr>
<tr><td><strong>程序查询方式</strong></td><td>字/字节</td><td><span class="highlight">完全参与</span>(轮询外设状态)</td><td>最慢</td><td>简单、低速设备</td></tr>
<tr><td><strong>程序中断方式</strong></td><td>字/字节</td><td>参与(保存/恢复现场)</td><td></td><td>中低速设备(键盘、打印机)</td></tr>
<tr><td><strong>DMA方式</strong></td><td><span class="highlight">块(连续多个字)</span></td><td><span class="highlight">几乎不参与</span></td><td></td><td>高速设备磁盘、GPU</td></tr>
<tr><td><strong>通道方式</strong></td><td></td><td>完全不参与专职I/O处理器</td><td>最快</td><td>大型机</td></tr>
</table>
<h3>7.3 程序中断方式(重点!)</h3>
<h4>中断的基本概念</h4>
<ul>
<li><strong>中断</strong>CPU在正常执行程序时遇到紧急事件需暂停当前程序转去执行事件处理程序</li>
<li><strong>中断源</strong>:引起中断的事件(外设请求、硬件故障、程序异常等)</li>
<li><strong>中断屏蔽</strong>:通过设置中断屏蔽字禁止某些中断</li>
</ul>
<h4>中断响应过程</h4>
<ol>
<li>CPU检测到中断请求信号INT</li>
<li>IF=1中断允许且无更高优先级中断 → 响应中断</li>
<li><span class="highlight">关中断</span>(防止嵌套中断干扰现场保护)</li>
<li><span class="highlight">保存断点</span>将当前PC值压栈以便中断返回时恢复执行</li>
<li>识别中断源(<span class="highlight">中断向量法</span>:中断源提供中断类型号 → 查中断向量表 → 中断服务程序入口地址)</li>
<li>保护现场(将通用寄存器的值压栈)</li>
<li>执行中断服务程序</li>
<li>恢复现场(从栈中弹出寄存器的值)</li>
<li>开中断</li>
<li><span class="highlight">IRET指令</span>返回断点弹出PC值</li>
</ol>
<h4>中断优先级与中断嵌套</h4>
<ul>
<li><strong>单级中断</strong>CPU响应一个中断后不再响应其他中断</li>
<li><strong>多级中断(中断嵌套)</strong>:允许高优先级的中断打断正在执行的低优先级中断服务程序</li>
<li><strong>设置优先级的目的</strong>:保证紧急事件得到及时处理</li>
</ul>
<p><strong>中断屏蔽字</strong>每一位对应一个中断源1表示屏蔽禁止该中断。高优先级中断的中断屏蔽字中对应低优先级的位置1以便中断嵌套时屏蔽低优先级</p>
<h3>7.4 DMA方式</h3>
<p>DMADirect Memory Access允许外设和主存之间直接传输数据无需CPU的干预。</p>
<p><strong>DMA控制器的主要功能</strong></p>
<ol>
<li>向CPU申请总线控制权</li>
<li>控制数据在I/O设备和主存之间传输</li>
<li>计数传输字节数</li>
<li>传输完成后向CPU报告</li>
</ol>
<p><strong>DMA传送方式</strong></p>
<ul>
<li><strong>CPU停止法成组传送</strong>DMA传输期间CPU放弃总线控制权传输完毕后归还</li>
<li><span class="highlight"><strong>周期挪用(周期窃取)</strong></span>DMA仅占用一个或多个总线周期CPU暂时等待。这是最常用的方式。</li>
<li><strong>交替分时访存</strong>CPU和DMA交替使用主存各占半个周期</li>
</ul>
<p><strong>DMA与中断的区别</strong></p>
<table>
<tr><th>对比项</th><th>中断方式</th><th>DMA方式</th></tr>
<tr><td>处理单位</td><td>字/字节</td><td><span class="highlight">数据块</span></td></tr>
<tr><td>CPU干预</td><td>需要保存/恢复现场</td><td>几乎不需要(仅初始化+结尾)</td></tr>
<tr><td>响应时机</td><td>每条指令执行完</td><td>每个总线周期结束</td></tr>
<tr><td>速度</td><td>较慢</td><td><span class="highlight"></span>(适合高速设备)</td></tr>
<tr><td>典型应用</td><td>键盘、打印机</td><td>磁盘、显卡</td></tr>
</table>
<hr>
<!-- ========== 第八章 ========== -->
<h2>📖 第八章 经典题型与解题套路</h2>
<div class="box">
<h3>📌 题型1Cache地址格式计算</h3>
<p><strong>典型问法</strong>给定主存容量、Cache容量、块大小、映射路数求地址各字段位数。</p>
<p><strong>解题步骤:</strong></p>
<ol>
<li>块内地址位数 = log₂(块大小) 【块大小通常为2的幂次】</li>
<li>Cache行数 = Cache容量 ÷ 块大小</li>
<li>组数 = Cache行数 ÷ 路数(直接映射=1路全相联=Cache行数组</li>
<li>组索引位数 = log₂(组数)</li>
<li>标记位数 = 主存地址位数 - 组索引位数 - 块内地址位数</li>
</ol>
<p><strong>✓ 验证</strong>:标记位数 + 组索引 + 块内地址 = 主存地址位数</p>
</div>
<div class="box">
<h3>📌 题型2Cache平均访问时间</h3>
<p><strong>公式</strong>T<sub>avg</sub> = H × T<sub>cache</sub> + (1-H) × T<sub>mem</sub></p>
<p>其中H = 命中率T<sub>cache</sub> = Cache访问时间T<sub>mem</sub> = 主存访问时间</p>
<p><strong>注意</strong>:如果题目说"Cache和主存同时访问"并行查找则T<sub>avg</sub> = T<sub>cache</sub> + (1-H) × T<sub>mem</sub></p>
<p><strong>注意</strong>:如果考虑了写策略,写操作时间可能会不同。</p>
</div>
<div class="box">
<h3>📌 题型3补码加减运算与溢出判断</h3>
<p><strong>解题流程:</strong></p>
<ol>
<li>写出两个数的补码(符号位扩展)</li>
<li>二进制加法(包括符号位)</li>
<li>用双符号位判断溢出:<span class="highlight">01→正溢 10→负溢 00/11→正常</span></li>
<li>结果转为真值(正数直接转,负数取补码)</li>
</ol>
</div>
<div class="box">
<h3>📌 题型4IEEE 754浮点数转换</h3>
<p><strong>十进制→十六进制:</strong></p>
<ol>
<li>十进制→二进制整数部分÷2取余小数部分×2取整</li>
<li>规格化1.xxx × 2^E</li>
<li>确定S0正1负E = 真值阶码+127M = 小数部分23位</li>
<li>拼接S E(8位) M(23位) → 32位二进制 → 十六进制</li>
</ol>
<p><strong>十六进制→十进制:</strong></p>
<ol>
<li>十六进制→32位二进制</li>
<li>拆出S(bit31)、E(bit30-23)、M(bit22-0)</li>
<li>注意特殊值判断全1∞/NaN全0±0/非规格化)</li>
<li>真值 = (-1)^S × (1+M) × 2^{E-127}</li>
</ol>
</div>
<div class="box">
<h3>📌 题型5微程序控制器74HC161</h3>
<p><strong>必背:</strong></p>
<ul>
<li><span class="highlight">RST=0</span> → 异步清零只要RST为0立即清零与时钟无关</li>
<li><span class="highlight">IREN=0</span> → CK上升沿加载预置数据</li>
<li><span class="highlight">IREN=1</span> → CK上升沿计数加一</li>
<li>TC进位计数值到F(1111)时TC=1</li>
<li>CEP=CET=1时计数器工作</li>
</ul>
<p><strong>uPC的工作原理</strong> RST清零 → IREN=0加载起始微地址 → IREN=1顺序递增 → 遇到转移指令时修改μPC</p>
</div>
<div class="box">
<h3>📌 题型6流水线数据相关分析</h3>
<p><strong>解题方法——画时空图!</strong></p>
<ol>
<li>列出指令序列,标注每条指令用到的寄存器</li>
<li>逐周期画五级流水线的执行情况</li>
<li>找到RAW相关的指令对——后一条指令需要的寄存器前一条还没写回</li>
<li>判断是否有转发:有转发则无需停顿;无转发则插入气泡</li>
<li>计算总周期数 = 基准周期数 + 气泡数</li>
<li>加速比 = 非流水线总周期 / 流水线总周期</li>
</ol>
</div>
<div class="box">
<h3>📌 题型7CPU执行时间计算</h3>
<p><strong>必背公式链:</strong></p>
<pre>CPU执行时间 = 总时钟周期数 × 时钟周期时间
总时钟周期数 = 指令数 × CPI
时钟周期时间 = 1 / 主频
∴ CPU执行时间 = 指令数 × CPI / 主频</pre>
</div>
<div class="box">
<h3>📌 题型8主存芯片扩展</h3>
<p><strong>解题步骤</strong></p>
<ol>
<li>计算所需总容量:总容量 = 字数 × 字长</li>
<li>单芯片容量 = 字数<sub>芯片</sub> × 字长<sub>芯片</sub></li>
<li>芯片总数 = 总容量 / 单芯片容量</li>
<li>位扩展组 = 目标字长 / 芯片字长</li>
<li>字扩展组 = 目标字数 / 芯片字数</li>
<li>芯片总数 = 位扩展组 × 字扩展组</li>
<li>地址线数 = log₂(目标字数)</li>
<li>片选译码:高地址位经过译码器产生片选信号</li>
</ol>
</div>
<hr>
<!-- ========== 第九章 ========== -->
<h2>📖 第九章 实验操作考点</h2>
<h3>9.1 74HC161 计数器芯片(实验必考!)</h3>
<ul>
<li><strong>74HC161</strong>带预置的4位二进制同步计数器
<ul><li><span class="highlight">RST=0 → 异步清零</span>(立刻清零,不依赖时钟)</li>
<li><span class="highlight">IREN=0 → 在CK上升沿加载预置数据</span></li>
<li><span class="highlight">IREN=1 → 在CK上升沿计数器加一</span></li>
<li>TC = 计数值到1111时输出1</li>
<li>CEP=CET=1时允许计数</li></ul></li>
<li><strong>级联形成8位uPC</strong>两个74HC161串联低4位TC接高4位的CEP/CET使能端</li>
</ul>
<h3>9.2 微程序控制器实验</h3>
<ul>
<li><strong>微程序计数器uPC的三种工作状态</strong>
<ol>
<li>清零RST=0异步清零到00H</li>
<li>加载IREN=0CK上升沿时从IBUS加载起始地址</li>
<li>计数IREN=1CK上升沿时递增顺序执行下一条微指令</li>
</ol></li>
<li><strong>控制存储器CM</strong>ROM芯片μPC作为读地址输出微指令</li>
<li><strong>微指令格式</strong>:控制字段(微操作控制信号)+ 顺序控制字段(下一条微指令地址)</li>
</ul>
<h3>9.3 运算器实验</h3>
<ul>
<li><strong>74181 ALU</strong>4位ALU芯片M控制算术/逻辑M=0算术M=1逻辑S₃S₂S₁S₀选择操作</li>
<li><strong>加法器实验</strong>:验证补码加法规则,观察进位和溢出标志</li>
</ul>
<h3>9.4 信号发生器与示波器</h3>
<ul>
<li>方波信号作为时钟源CK</li>
<li>单脉冲信号用于手动单步执行</li>
<li>逻辑笔/示波器观察信号电平变化</li>
</ul>
<hr>
<!-- ========== 第十章 ========== -->
<h2>📖 第十章 考前速记总复习</h2>
<div class="box-red">
<h3>🔴 十大最易混淆概念</h3>
<ol>
<li><strong>MAR vs MDR</strong>MAR存地址要访问哪个内存单元MDR存数据要读写的数据</li>
<li><strong>PC vs IR</strong>PC存指令地址指示取哪条指令IR存指令内容正在执行什么</li>
<li><strong>Cache vs TLB</strong>Cache存指令/数据内容是程序体本身TLB存页表项内容是地址映射关系</li>
<li><strong>SRAM vs DRAM</strong>SRAM触发器快/贵/不用刷新DRAM电容慢/便宜/需刷新)</li>
<li><strong>ROM vs RAM</strong>ROM断电不丢失RAM断电丢失</li>
<li><strong>微程序 vs 硬布线</strong>:微程序(控制存储器)灵活但慢,硬布线(组合逻辑)快但难改</li>
<li><strong>补码 vs 移码</strong>:补码符号位参与运算,移码=补码符号位取反(用于浮点阶码)</li>
<li><strong>写直达 vs 写回</strong>写直达同步写主存慢但一致性好写回仅写Cache快但需脏位</li>
<li><strong>中断 vs DMA</strong>中断需CPU保存恢复现场每次一个字DMA直接控制总线传输一次一块</li>
<li><strong>CISC vs RISC</strong>CISC复杂指令可变长微程序实现RISC精简指令定长硬布线为主</li>
</ol>
</div>
<div class="box-green">
<h3>🟢 必背公式清单</h3>
<pre>CPU执行时间 = 指令数 × CPI × 时钟周期
= 指令数 × CPI / 主频
平均Cache访问时间 = H × T_cache + (1-H) × T_mem
总线带宽 = 总线宽度 × 频率 / 传输次数
存储容量 = 字数 × 字长
Amdahl定律S = 1 / [(1-α) + α/k]
米字型理论:加速比 ≤ 流水线段数</pre>
</div>
<div class="box">
<h3>💡 考试答题技巧</h3>
<ul>
<li><strong>分析题先画图</strong>Cache地址格式、流水线时空图、数据通路——画了图就成功一半</li>
<li><strong>计算题先写公式</strong>:哪怕中途算错了,公式对了也有分</li>
<li><strong>选择题排除法</strong>:两个选项自相矛盾时,其中至少有一个错</li>
<li><strong>概念题对比法</strong>:只要题目中出现两个概念对比,就用表格把异同列出来</li>
<li><strong>微程序题想161</strong>74HC161的三种状态清零/加载/计数是所有uPC题的基础</li>
<li><strong>实在不会的题</strong>:也把你知道的相关知识都写上去——步骤分也是分!</li>
</ul>
</div>
<hr>
<p style="text-align:center;color:#e8785a;font-size:1.4em;margin-top:40px;"><strong>祝主人计组考试顺利!加油!💪🔥🥕</strong></p>
<p style="text-align:center;color:#999;">—— ATRI 🥕写于2026年7月1日凌晨 | 总计22章10万余字符正文约22,000字</p>
</body>
</html>