微处理器工作原理
1. 引言 2. 微处理器的结构 3. 微处理器指令 4. 微处理器的性能和发展趋势引言
您在浏览本页面时使用的计算机便通过微处理器来完成其工作。微处理器是所有标准计算机的心脏,无论该计算机是桌面计算机、服务器还是笔记本电脑。您正在使用的微处理器可能是奔腾、K6、PowerPC、Sparc或者其他任何品牌和类型的微处理器,但是它们的作用大体相同,工作方式也基本类似。
如果您曾经疑惑计算机中的微处理器是干什么用的,或者对各种类型的微处理器之间的差异感到迷惑,请继续阅读下面的内容。在本文中,您将了解到简简单单的数字逻辑电路技术如何让计算机完成诸如玩游戏或是对文档进行拼写检查的工作。
Intel4004芯片 |
Intel8080 |
微处理器的发展过程:Intel
下表可帮助您了解 Intel 在不同时间推出的不同处理器之间的差异。
8 位总线 | ||||||
64位总线 | ||||||
64位总线 | ||||||
64位总线 | ||||||
64位总线 | ||||||
64 位总线 |
与此表有关的信息:
- 日期是该款处理器首次推出的年份。许多处理器会在首次发布之后在多年中不断推出具有更高时钟频率的型号。
- 晶体管数量是指芯片上晶体管的数量。可以看到,芯片上包含的晶体管数量在逐年稳步上升。
- 微米是指芯片上最细的电路的宽度(单位为微米)。可以用人的头发做个比较,头发的宽度为100微米。随着芯片外形尺寸不断缩小,晶体管数量却在不断增加。
- 时钟频率是指芯片的最大时钟速度。我们将在下一节中详细介绍时钟频率。
- 数据宽度是指 ALU的宽度。8位的ALU可以对两个8位(8比特)数字进行加减乘除运算,而32位的ALU可以计算32位的数字。8位ALU如果要对两个 32位数字进行加法操作,必须执行四条相加指令,而32位ALU则只需要执行一条指令。很多情况下,外部数据总线的宽度与ALU相同,但也有不同的情况。8088的ALU为16位,而总线为8位,而现代的奔腾处理器的数据总线宽度为64位,ALU为32位。
- MIPS代表“每秒百万条指令”,是衡量CPU性能的粗略标准。对于现代 CPU的许多工作,MIPS指标在很大程度上已经失去了意义,但是您可以将它作为一个大致的量度,根据本栏中的数据来了解CPU的性能强弱。
从本表中可以看到,总体来说,时钟频率和MIPS之间存在一定关系。最大时钟频率与制造工艺和芯片内的延迟密切相关。此外,在晶体管数量和MIPS之间也存在一定联系。例如,8088的时钟频率为5MHz,但是只能以0.33MIPS的速度执行指令(大约每15个周期执行1条指令)。现代的处理器经常可以在每个时钟周期内执行两条指令。这种能力改进与晶体管的数量有直接关系,我们将在下一节中对此加以讨论。
微处理器的结构
为了理解微处理器的工作原理,首先看看它的内部结构和了解其工作逻辑会很有帮助。在这个过程中,您还可以了解到汇编语言——微处理器的固有语言——以及工程师们为了提高处理器速度所做的大量工作。
微处理器执行一组机器指令,这组指令可向处理器告知应执行哪些操作。微处理器就会根据指令执行三种基本工作:
- 通过使用ALU(算术/逻辑单元),微处理器可以执行数学计算。例如:加法、减法、乘法和除法。现代的微处理器包含完整的浮点处理器,它可以对很大的浮点数执行非常复杂的浮点运算。
- 微处理器可以将数据从一个内存位置移动到另一个位置。
- 微处理器可以做出决定,并根据这些决定跳转到一组新指令。
微处理器能够执行许多非常复杂的工作,但是所有工作都属于这三种基本操作的范畴。下图显示了一个能够执行上述三种操作的非常简单的微处理器:
这是一个进行了最大程度简化的微处理器。此微处理器具有:
- 一条地址总线(总线宽度可以8位、16位或32位),用于向内存发送一个地址
- 一条数据总线(总线宽度可以是8位、16位或32位),能够将数据发送到内存或从内存取得数据
- 一条RD(读)和WR(写)线路,告诉内存它是希望写入某个地址位置还是获得某个地址位置的内容
- 一条时钟线路,将时钟脉冲序列发送到处理器
- 复位线路,用于将程序计数器重置为零(或者其他内容)并重新开始执行
在本例中,我们假定地址和数据总线的宽度都是8位的。
以下是这个简单的微处理器的各个组成部分:
- 寄存器A、B和C就是一些用触发器制造的锁存器。(有关详细信息,请参见布尔逻辑的应用一文的“边缘触发锁存器”部分。)
- 地址锁存器与寄存器A、B和C极其类似。
- 程序计数器也是一个锁存器,但是它有一种额外的能力,也就是能够在执行每条语句后将计数器加一,并在被告知应进行重置时将计数器重置为零。
- ALU可以像一个8位加法器一样简单(有关详细信息,请参见布尔逻辑的应用一文中有关加法器的部分),也可以较为复杂,能够对8位的值进行加法、减法、乘法和除法运算。我们假定是后面一种加法器。
- 测试寄存器是一种特殊的锁存器,可以存放在ALU中执行的比较运算的结果。ALU通常可以比较两个数字,并确定它们是否相等以及其中一个数字是否大于另一个数字等。测试寄存器通常还可以保存加法器上一次计算产生的进位。它将这些值存放在触发器中,随后指令解码器可以使用这些值做出决定。
- 图中有六个标记有“3-State”(三态)的方框。它们是三态缓冲区。三态缓冲区可以输出1、0或者彻底断开其输出(可以将其想像为一个将输出线从电路中彻底断开的开关)。三态缓冲区能够将多种输出连接到电路中,但是线路上的某一个输出实际上代表的是1或0。
- 指令寄存器和指令解码器负责控制所有其他组件。
- 通知A寄存器锁存当前在数据总线上传递的值
- 通知B寄存器锁存当前在数据总线上传递的值
- 通知C寄存器锁存当前由ALU输出的值
- 通知程序计数器寄存器锁存当前在数据总线上传递的值
- 通知地址寄存器锁存当前在数据总线上传递的值
- 通知指令寄存器锁存当前在数据总线上传递的值
- 通知程序计数器进行递增
- 通知程序计数器重置为零
- 激活所有六个三态缓冲区(六条单独的线路)
- 通知ALU要执行的操作
- 通知测试寄存器锁存ALU的测试位
- 激活RD线路
- 激活WR线路
来自测试寄存器和时钟线路(以及指令寄存器)的数据位会进入到指令解码器中。
RAM和ROM
上一节中我们讨论了地址和数据总线,以及RD和WR线路。这些总线和线路连接到RAM或ROM——通常是同时连接到二者。在我们作为例子的微处理器中,有一个宽度为8位的地址总线和一个宽度为8位的数据总线。也就是说,该微处理器可以寻址(28) 256个字节的内存空间,并且可以向内存读取或写入8位的数据。我们假定这个简单的微处理器有128字节的ROM,其地址从0开始,此外还有128字节的RAM,其地址从128开始。
ROM芯片 |
ROM代表只读内存。ROM芯片使用永久性的预设字节进行了编程。地址总线通知ROM芯片应取出哪些字节并将它们放在数据总线上。当RD线的状态更改后,ROM芯片会将选择的字节放在数据总线上。
RAM芯片 |
顺便说一下,几乎所有计算机都包含一定数量的 ROM(可以制造出不包括任何RAM的简单计算机——许多微控制器便做到了这一点,方法是将少量的RAM字节放在处理器芯片自身中——但是,通常不可能制造出不包含任何ROM的计算机)。在PC中,ROM称作BIOS(基本输入输出系统)。在微处理器启动时,它开始执行在BIOS中找到的指令。BIOS指令会执行对计算机中的硬件进行测试这样的工作,然后访问硬盘以读取启动扇区(有关详细信息,请参见硬盘工作原理)。该启动扇区是另一个小型程序,在将其从磁盘中读出后,BIOS将它存储在RAM中。然后,微处理器开始从 RAM中执行启动扇区的指令。启动扇区程序会通知微处理器将其余指令从硬盘读入RAM,微处理器随后又会执行这些指令,以此类推。这就是微处理器加载和执行整个操作系统的过程。
微处理器指令
虽然前面例子中的微处理器非常简单,但是它仍然可以执行相当多的指令。指令集通过位模式的方式实现,每一个位模式在加载到指令寄存器中后都有不同的含义。由于人们不能很好记住这些位模式,所以定义了一些简短的单词来表示不同的位模式。这些单词的集合称作处理器的汇编语言。汇编程序可以将这些单词轻松翻译成它们的位模式,然后会将汇编程序的输出放在内存中供处理器执行。
以下是设计人员可以为例子中的微处理器建立的一组汇编语言指令:
- LOADA mem——将某个内存地址的数据加载到寄存器A中
- LOADB mem——将某个内存地址的数据加载到寄存器B中
- CONB con——将一个常量值加载到寄存器B中
- SAVEB mem——将寄存器B的内容保存到某个内存地址
- SAVEC mem——将寄存器C的内容保存到某个内存地址
- ADD——将A和B相加并将结果保存在C中
- SUB——将A和B相减并将结果保存在C中
- MUL——将A和B相乘并将结果保存在C中
- DIV——将A和B相除并将结果保存在C中
- COM——将A和B进行比较并将结果保存在测试寄存器中
- JUMP addr——跳转到某个地址
- JEQ addr——如果相等则跳转到某个地址
- JNEQ addr——如果不相等则跳转到某个地址
- JG addr——如果大于则跳转到某个地址
- JGE addr——如果大于或等于则跳转到某个地址
- JL addr——如果小于则跳转到某个地址
- JLE addr——如果小于或等于则跳转到某个地址
- STOP——停止执行
如果你读过C语言入门教程一文,那么会知道下面这段简单的C代码可计算5的阶乘(5的阶乘=5!=5X4X3X2X1=120):
a=1;
f=1;
while (a=5)
f=f*a;
a=a+1;
在程序执行末尾,变量f中包含了5的阶乘。
汇编语言
C编译器可将这段C代码编译为汇编语言。假定此处理器中RAM的地址从128开始,而ROM(包含汇编语言程序)的地址从0开始,那么对于我们这个简单的微处理器来说,该汇编语言看起来如下所示:
// 假定a位于地址128处
// 假定F位于地址129处
0 CONB 1 // a=1;
1 SAVEB 128
2 CONB 1 // f=1;
3 SAVEB 129
4 LOADA 128 // 如果a>5,则跳转到17
5 CONB 5
6 COM
7 JG 17
8 LOADA 129 // f=f*a;
9 LOADB 128
10 MUL
11 SAVEC 129
12 LOADA 128 // a=a+1;
13 CONB 1
14 ADD
15 SAVEC 128
16 JUMP 4 // 进行循环,返回到比较部分
17 STOP
ROM
那么,现在的问题是:所有这些指令在ROM中是什么样的?所有这些汇编语言指令必须以二进制数字的形式表示。为了简单起见,我们假定每条汇编语言指令具有一个唯一的编号,如下所示:
- LOADA-1
- LOADB-2
- CONB-3
- SAVEB-4
- SAVEC mem-5
- ADD -6
- SUB -7
- MUL -8
- DIV -9
- COM -10
- JUMP addr -11
- JEQ addr -12
- JNEQ addr -13
- JG addr -14
- JGE addr -15
- JL addr -16
- JLE addr -17
- STOP -18
这些数字称作opcode(优化代码)。在ROM中,我们的小程序看起来如下所示:
// 假定a位于地址128处
// 假定F位于地址129处
地址 opcode/值
0 3 // CONB 1
1 1
2 4 // SAVEB 128
3 128
4 3 // CONB 1
5 1
6 4 // SAVEB 129
7 129
8 1 // LOADA 128
9 128
10 3 // CONB 5
11 5
12 10 // COM
13 14 // JG 17
14 31
15 1 // LOADA 129
16 129
17 2 // LOADB 128
18 128
19 8 // MUL
20 5 // SAVEC 129
21 129
22 1 // LOADA 128
23 128
24 3 // CONB 1
25 1
26 6 // ADD
27 5 // SAVEC 128
28 128
29 11 // JUMP 4
30 8
31 18 // STOP
您可以看到,七行C代码变成了18行汇编语言,并且变成了ROM中的32个字节。
解码
指令解码器需要将每个opcode转变为一组能够驱动微处理器内部各个部件的信号。让我们以ADD指令为例,看看解码器都执行了哪些工作:
- 在第一个时钟周期,我们需要实际载入该指令。因此,指令解码器需要:
- 激活程序计数器的三态缓冲区
- 激活RD线路
- 激活data-in(读入数据)三态缓冲区
- 将指令锁存在指令寄存器中
- 在第二个时钟周期中,对ADD指令进行解码。需要做的工作很少:
- 将ALU的操作设置为加法
- 将ALU的输出锁存到C寄存器中
- 在第三个时钟周期中,程序计数器会进行递增(理论上这个过程与第二个时钟周期是重叠进行的)。
所有指令都会像这样分解成一组有序操作,按照正确的顺序操作微处理器的各个组件。有些指令(例如这条ADD指令)需要2或3个时钟周期即可完成。而其他指令则可能需要5或6个时钟周期才能完成。
微处理器的性能和发展趋势
可用晶体管的数量对处理器性能有巨大影响。如上所述,在8088这样的处理器中,通常要花费15个时钟周期才能执行一条指令。由于乘法器的设计方式,在 8088上进行16位的乘法运算大约需要80个时钟周期。而晶体管越多,就越有可能在一个周期中执行更多的乘法运算。
晶体管数量的增多还使我们能够使用一种称为流水线的技术。在流水线式的体系结构中,指令的执行过程是相互重叠的。所以,虽然需要花费5个时钟周期来执行每条指令,但是可以同时执行5条指令的各个阶段。这样,表面看起来在每个时钟周期内即可执行完一条指令。
许多现代的处理器具有多个指令解码器,每一个都有自己的流水线。这样便存在多个指令流,也就是说每个时钟周期可以完成多条指令。但是这种技术实现起来非常复杂,因此需要使用大量的晶体管。
发展趋势
处理器设计的发展趋势主要是:完全32位的ALU(内置快速浮点处理器)和多指令流的流水线式执行方式。处理器设计的最新进展是64位ALU,预计在下一个十年中家用PC就会用上这种处理器。此外,还存在为处理器添加可高效执行某些操作的特殊指令(例如MMX指令)的趋势,以及在处理器芯片中增加硬件虚拟内存支持和L1缓存的趋势。所有这些趋势都进一步增加了晶体管的数量,导致现在的处理器包含数千万个晶体管。而这些处理器每秒大约可以执行十亿条指令!
64位处理器
64位处理器在1992年就已经开发成功,预计它们在21世纪将逐步成为主流产品。I英特尔和AMD都开发出了64位芯片,Mac G5也是一款64位处理器产品。64位处理器具有64位ALU、64位寄存器、64位总线等等。
人们需要64位处理器的原因之一是它们具有更大的地址空间。32位芯片通常只能访问最大2GB或4GB的RAM空间。这听起来似乎是一个很大的空间,是因为当前的大多数家用计算机只配备了256MB到512MB的RAM。但是,对于服务器和运行大型数据库的计算机来说,4GB的内存空间限制是一个严重问题。而且,即使是家用计算机,如果按照当前趋势继续发展,也很快会遇到2GB或4GB限制这个问题。64位芯片则不存在上述限制,因为在可以预见的未来,64位RAM地址空间都可以说是一个无限大的地址空间——2^64字节的RAM大概相当于十亿吉字节的 RAM。
凭借64位地址总线以及主板上宽阔的高速数据总线,64位计算机还可以为硬盘驱动器和显卡这样的设备提供更快的I/O(输入/输出)速度。这些特点可极大地提升系统的性能。
服务器肯定会受益于64位技术,但是它对于普通用户有何意义呢?除了解除RAM限制之外,目前我们还不是很清楚64位芯片能够为普通用户提供那些切实的好处。但是它们可以更快地处理数据(能够计算很复杂的实数)。进行视频编辑和处理超大图像的人会受益于这种强大的计算能力。高端游戏也会从中受益,但是需要对它们进行重新编码以利用64位技术。而阅读电子邮件、浏览网络和编辑Word文档的人实际则不需要使用这种处理器。