前一部分我们大致介绍了CPU的制造工艺],这里主要简单介绍其结构和工作流程。
一、简介
我们知道,CPU是"焊"在主板上的,如果你把CPU翻转过来,可以发现其下面有很多针脚,而不同的针脚数可能对应不同的接口类型,CPU通过这些针脚和主板相连,通过它们发出和接受信息,就是控制我们通常所说的总线。主板连接了计算机上的其它部件,这样通过这种方式,就将它们连接成了一个整体。
二、工作流程
大体上,CPU的结构可以分为控制单元、逻辑运算单元和存储单元。而更详细一点,控制单元又是由指令寄存器、指令译码器、操作控制器等构成,它们会根据定义好的程序按顺序从存储器中获取指令,放在指令寄存器中,通过译码翻译成计算机能够执行的操作,然后通过操作控制器发出控制信号以完成指令的执行,当然为了保证程序能够连续的执行下去,CPU必须能够确定执行完一条指令后的下一条指令的地址,这时候就引入了指令计数器(也就是程序计数器)。可以简化为以下图示(网图,图中的存储单元也就是寄存器组):
这里简单描述以上流程:
我们的程序其实就是一些指令的序列存储在内存中,在程序开始执行的时候,需要通过地址总线将它的起始地址送入指令计数器,另外由于内存和CPU之间存在操作速度上的差别,还引入了地址寄存器来保存地址信息,直到内存的读写操作完成;之后根据指令地址通过总线从内存中获取对应的指令,然后存入指令寄存器中(指令分为操作码和操作数地址两个字段,由二进制数据组成,操作码指明了需要做的操作,而操作数地址指明了被操作数存储的地方)。
操作码 | 操作数地址 |
然后指令寄存器的相应位被送入指令译码器做相应的译码操作,这个时候指令计数的任务已经完成了,其实就可以更新了(可能是简单的加一个单位,比如顺序执行,也可能是通过地址进行转移,比如goto)。
经过译码操作后,一条指令需要做什么和操作数在哪里我们已经清楚了,所以接下来就是根据操作数地址通过总线在内存中读取需要操作的数据,放入存储单元以方便后面的处理,然后运算器根据操作码和存储单元中的操作数执行具体的操作(比如做加法),指令执行的结果会写入存储单元,之后再从存储单元通过总线写入内存保存起来,到这里一条指令就算执行完毕了。
所以整个阶段我们分为两步:
1、 取指令:内存中的指令地址->地址寄存器->向内存发起读命令,通过地址总线存入指令寄存器->译码器译码->指令计数器更新,不断循环此过程以完成程序的执行;
2、 执行指令:内存中的操作数地址->获取数据到存储单元->运算器根据操作码和操作数执行具体操作->结果存入存储单元->最后存回内存;
根据直观的感受,在CPU旁边就是我们的RAM(也就是内存),它存有CPU要处理的数据,并且断电会丢失,但存取速度很快。RAM里包含一些地址,而每个地址又对应了一些数据,通常情况下,数据是顺序访问的,但是CPU也可以根据指令不按顺序读取数据,所以RAM任何地址的数据其实都可以随意访问,这就是我们称之为"随机存取存储器"的原因。内存中数据其实都是一系列0和1的组合,而地址是用线路的通路和短路来表示0和1的,在同一个地址上写数据会导致数据被覆盖,而这些0和1的不同组合具体代表什么意思则是人为规定的。
三、CPU指令集
上面我们说到,一个指令包含有操作码和操作数地址,这个操作码决定了让CPU做什么事儿,但是我们很自然就能想到,一个CPU,不可能你让它做什么,它就能做什么,就像一只鸡,非要让它下个鸭蛋,这是行不通的。每个CPU都有自己的指令系统,这个指令系统描述了这个CPU能够执行哪些指令,其实也就是一些用二进制描述的一些机器代码。
指令系统中的指令有很多分类,比如数据传送、算术运算、输入输出等,而每一类指令又包含很多不同的具体指令,指令系统也是非常复杂的。由于没有任何"官方规定"要求所有CPU都必须实现且仅能实现某一些指令,所以不同公司生产的CPU,通常情况下都是不兼容的,也就是因为各自的指令系统多多少少都会有差异,而一般出自同一公司的同系列CPU都具有向下兼容性。
从另一方面来看,CPU的指令集是和其硬件架构直接挂钩的,是CPU对外提供的基础功能,每个指令都可以从一些方面上认为是其硬件架构设计的一种描述,它们是不可分割的。比如我们用两个线圈和铁芯组成一个简单的变压器,这个是一种硬件架构,可以对外提供一个指令:变换交流电压。
四、总结
这里主要介绍了CPU的一些基础结构和执行指令的一些工作流程,回想前面介绍的CPU工艺,CPU运作的基础其实有一片复杂的数字电路图,一个简单的1+1是怎么反应到我们的电子元件中的呢?这离不开我们的数字电路,后面我们会主要介绍这部分内容。