CPU的组成结构及其原理(一)

中央处理器(Central Processing Unit, CPU)

CPU的基本架构和工作原理其实百科上讲得已经相当清楚了,不过我觉得有些事情呢还是给个例子出来比较方便学习。
本文会先从内存地址,计算机的一般架构之类的基础知识出发,然后逐步为读者“拼装”出一个超级简单的8-bit CPU。。。就像下图这样(大图点开)

这就是本文的目标:拼装这样一个结构的CPU

-----------------------------------------------------------------------------------------------------------------------

上面那个大图里有几个梯形的符号
它们叫做数据选择器(Multiplexer),也叫多路选择器或多路开关
已经知道这个东西是干啥的童鞋直接跳过此楼吧。。

这图是一个2选1选择器,A,B,S为输入,Z为输出,它们可取的值当然都只有0和1
怎么工作的呢?
以该图为例:
当S=1的时候,输出值Z = 输入值B
当S=0的时候,输出值Z = 输入值A
比如说A=1,B=0,S=0的时候输出是多少?S=0就是说:选择A的值输出,也就是说输出值Z=A=1
就这么简单

同样地,我们也可以有4选1选择器

只不过控制输入S变成了两位(00,01,10,11,分别对应一二三四),道理还是一样的

如果你对这个东东怎么做成的感兴趣的话。。。下面就是4选1选择器的其中一种电路 = =

哦,还有。。本文使用的逻辑门符号均是ANSI/IEEE Std 91-1984中的Distinctive shape,不是用方框符号。。。= =

你只要知道数据选择器是干啥的就好,不用惦记上边那电路。。

------------------------------------------------------------------------------------------------------------

1. 计算机架构(Computer Architecture)

CPU、内部存储器(Internal Storage Device)和输入/输出设备(Input/Output Device, I/O)是电子计算机三大核心部件。内部储存器可以是硬盘,内存,缓存等;输入设备可以是鼠标,键盘;输出设备可以有屏幕,音箱等等。。

当你打开电脑硬盘上安装的某个程序时,你的操作系统会把硬盘上的相应内容放入内存中。至于怎么放,在内存的什么地方放那可是一门大学问,光这个就够一般人喝一壶的。。相关知识可以在大学的操作系统课程里学到

比如说你放个音乐。要放音乐,先用鼠标点开一个mp3文件,于是你就使用了一个输入设备。这个输入设备会把一个中断请求(Interrupt Request)送到CPU那边,结合来自操作系统的信息后CPU就知道:哦,你用鼠标点开那个mp3文件了!于是:
1. CPU执行操作系统里关于文件关联的代码,于是你的电脑就知道要用WMP打开文件了
2. 你的操作系统开始把WMP这个程序里含有的指令和mp3文件的内容从硬盘上拉进内存里(还是CPU的工作)
3. 然后你的CPU开始一条一条地(双核的话那你就当成两条两条地好了)执行内存里的WMP程序指令(也就是如何解码mp3),并且把解码后的PCM比特流传到声卡上,再由声卡把数字信号转换成模拟信号送到音箱/耳机(输出设备)里。So now you have music!

又比如说你要编辑一个txt文件。还是先得用鼠标点开文件,又用了一次输入设备。于是:
1. CPU执行操作系统里关于文件关联的代码,于是你的电脑就知道要用notepad打开文件了
2. 你的操作系统把notepad的程序指令和文件内容拉进内存
3. 然后你的CPU又开始执行Notepad程序的指令了
4. 每当你敲一次键盘(还是输入设备!!),都会向CPU发送一个中断请求好让CPU知道你敲了某个键。比如说你敲个Y,那么CPU就会把Y这个字符写进内存里。然后你要保存的时候操作系统就会把内存里改过的东东倒进硬盘里!~

。。。好吧我承认实际过程跟这儿说的不大一样并且复杂得多,有些细节会在后面详细讲,but that's the basic idea.

这大约就是CPU,输入/输出设备和内存之间的互动方式了。

---------------------------------------------------------------------------------------------------

2.内存(Memory)

内存就是暂时存储程序以及数据的地方,比如当我们在使用WPS处理文稿时,当你在键盘上敲入字符时,它就被存入内存中,当你选择存盘时,内存中的数据才会被存入硬盘。一断电内存上的东东就没了

内存里的数据是根据内存地址(Memory Address)来组织的。每个地址都是独特的,每个地址一般来说对应着一个字节(byte)=8 bit,我们管这叫Byte addressable memory.

在32 bit的系统上,内存地址的长度就是32 bit。那么一个32 bit长度的二进制数最大可以表示的数是多少呢?很简单,2^32 = 4294967296。也就是说,32 bit的内存地址最大可以对应4294967296字节的内存!

这个数字换算一下就可以得出它相当于4GB。现在你知道为什么32位系统不支持4GB以上的内存了吗?

------------------------------------------------------------------------------------------------------

3. 指令编码(Instruction Encoding)

终于要说点正经的了。。前面说过CPU会执行内存/缓存中的程序指令,可是这些指令是以什么样的形式储存在内存里的呢?要知道所谓的指令其实就是一长串的0和1而已。那CPU如何从这些0和1里知道指令是什么呢?这就是指令编码的内容了。

先说说CPU。您说,CPU能干啥?其实很简单,无非就是加减乘除,读写内存,逻辑运算什么的。若是复杂些的CPU可能指令集要大些,不过基本的指令大概就这些。CPU内部也有自己的储存单元,叫做寄存器(Register),也是暂时用来放数据的地方,速度特别快,容量特别小。
就拿我经常用的NIOS II来说,它内部有32个寄存器,它可以执行的指令包括(不好意思我要用汇编语言了=_=):

add rA,rB,rC #把寄存器rB,rC里的数加起来,结果放入寄存器rC
addi rB, rA, IMM16 #把rA里的数跟一个16位的数相加,结果放入rB
beq rB,rA,LABEL #若rA=rB,则跳到LABEL指定的内存地址开始执行指令,否则继续按照内存地址顺序执行指令
stwio rB, b_o(rA) #从内存地址rA+b_o处读取一个字节,数据放入rB
ldwio rB, b_o(rA) #从内存地址rA+b_o处开始写入一个字节,写入的数据在rB里


等等

总结起来,CPU可以有以下几个功能:
1.进行寄存器之间的运算和比较
2.由寄存器内指定的地址读写内存
3.分支指令,类似于C语言里的if语句。比如跳到某个寄存器里指定的内存地址开始读取并执行指令

当然,更复杂的指令集是有可能的,不过这里就不说了

---------------------------------------------------------------------------------------------

我知道读者可能好几楼没见着个图有点烦躁了,不过请有些耐心,等开始拼装CPU的时候图片绝对多。。。

Anyway,继续说指令编码
大致来说,上面的指令可以分为三大类:I-type,R-type,J-type
P.S.这种分类适用于MIPS架构的处理器,其他我就不知道了

1. I-type
以32 bit为例。一条I-type指令包括四个元素:
两个寄存器编号,一个16位数字和一个操作码

31-27位代表指令里寄存器rA的编号
26-22位代表寄存器rB的编号
21-6位是一个16位的二进制数
5-0位是操作码

例子:
NIOS II汇编指令 addi r6,r7,310表示把寄存器r7里的数加上310,结果放入寄存器r6。如果我们规定addi运算对应的六位操作码是000011,那么请问整条指令的编码是?
解答:
寄存器r6的编号是6,即00110
寄存器r7的编号是7,即00111
数字310对应的二进制数是0000000100110110
addi的操作码是000011
所以整条指令的编码就是00110 00111 0000000100110110 000011
-----------------------r6-----r7--------310---------addi------
共32位!
这就是I-type指令在内存里存在的形式!!~

----------------------------------------------------------------------------

2. R-type

还是以32 bit为例。一条R-type指令通常包括四个元素:
三个寄存器编号,一个操作码

31-27位是寄存器rA的编号
26-22位是寄存器rB的编号
21-17位是寄存器rC(一般来说这个是目标寄存器)的编号
16-6位是OPX,是操作码
5-0位。。你当它没用吧,写上000000就好 = =

例子:
汇编指令 add r10,r9,r8是典型的R-type指令。它表示把寄存器r9,r8里的数加起来,然后把结果写入寄存器r10(目标寄存器)。若规定add运算的操作码为00000011111,请问整条指令的编码是?
解答:
寄存器r10的编号是10,即01010
寄存器r9的编号是9,即01001
寄存器r8的编号是8,即01000
add运算操作码是00000011111
OP = 000000
所以整条指令的二进制编码是01001 01000 01010 00000011111 000000
---------------------------r9-----r8---r10------add-------OP
共32位!

-----------------------------------------------------------------------------------------

3. J-Type

一条32bit的J-Type指令包含两个元素:
一个26位的数字(通常是内存地址)和一个6位的操作码

31-6位是数字
5-0位是操作码

例子:
汇编指令 call ROUTINE_3是典型的J-Type指令,它表示该指令执行完毕后CPU将从ROUTINE_3开始的内存地址读取并执行其他指令。若ROUTINE_3开头指令的内存地址是0x00002b3c,call的操作码是000000,请问整条指令的二进制编码是?
解答:
16进制数0x00002b3c = 0000 0000 0000 0000 0010 1011 0011 1101
call操作码是000000
所以整个指令的编码是00000000000000000010101100111101 000000
------------------------------ROUTINE_3--------------call--
还是32位!


阅读更多
个人分类: 计算机基础知识
上一篇程序是如何执行的(三)函数调用
下一篇CPU的组成结构及其原理(二)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭