【基础知识】CPU 是如何工作的 |CPU 通过总线读取内存的工作方式
一、简单cpu 是如何工作 方式讲解
CPU 的根本任务就是执行指令,对计算机来说最终都是一串由 0 和 1 组成的序列。CPU 从逻辑上可以划分成 3 个模块,分别是控制单元、运算单元和存储单元 。其内部架构如下:
首先吧cpu分成三块
1.控制单元
2.存储单元
【1】控制单元
控制单元是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和 操作控制器OC(Operation Controller) 等组成,对协调整个电脑有序工作极为重要。它根据用户预先编好的程序,依次从存储器中取出各条指令,放在指令寄存器IR中,通过指令译码(分析)确定应该进行什么操作,然后通过操作控制器OC,按确定的时序,向相应的部件发出微操作控制信号。操作控制器OC中主要包括:节拍脉冲发生器、控制矩阵、时钟脉冲发生器、复位电路和启停电路等控制逻辑。
【2】运算单元
运算单元是运算器的核心。可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。相对控制单元而言,运算器接受控制单元的命令而进行动作,即运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的,所以它是执行部件。
【3】存储单元
存储单元包括 CPU 片内缓存和寄存器组,是 CPU 中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据,CPU 访问寄存器所用的时间要比访问内存的时间短。采用寄存器,可以减少 CPU 访问内存的次数,从而提高了 CPU 的工作速度。寄存器组可分为专用寄存器和通用寄存器。专用寄存器的作用是固定的,分别寄存相应的数据;而通用寄存器用途广泛并可由程序员规定其用途。
工作原理
总的来说,CPU 从内存中一条一条地取出指令和相应的数据,按指令操作码的规定,对数据进行运算处理,直到程序执行完毕为止。具体过程可分为以下四步:
【1】取指令
CPU 控制器从内存读取一条指令并放入指令寄存器。指令的格式如下:
操作码:就是汇编语言里的 mov,add,jmp 等符号码;
操作数地址:说明该指令需要的操作数所在的地方,是在内存里还是在CPU的内部寄存器里。
【2】指令译码
指令寄存器中的指令经过译码,决定该指令应进行何种操作(就是指令里的操作码)、操作数在哪里(操作数的地址) 。
【3】 执行指令
执行指令分为两个阶段: 取操作数 和 进行运算 。
取操作数:CPU 通过寻址操作,从内存(数据段)中读取操作数到通用寄存器中,暂存起来。
进行运算:运算单元通过指令中的操作码,对寄存器中的操作数进行 mov,add,jmp 操作。
【4】 指令计数
修改指令计数器,决定下一条指令的地址 。CPU 重复上述三步操作,处于内存代码段的指令被逐个的执行,直到程序执行完毕为止。
CPU 字长
CPU在单位时间内(同一时间)能一次处理的二进制数的位数叫字长。所以,能处理字长为 8 位数据的 CPU 通常就叫 8 位的 CPU。同理,32 位CPU 能在单位时间内处理字长为 32 位的二进制数据 。
常见的 32位 CPU 和 64位 CPU 主要存在以下两个差异:
【1】处理能力不同
64 位 CPU 的一个指令,最大能处理 64 位二进制数据,即一次能处理 8 个字节数据。
【2】寻址空间不同
而 64 位CPU的寻址范围是 64 位的二进制。能表示的地址长度更大,其寻址空间也会更大。
二、稍微细致一点cpu工作方式
CPU 通过总线读取内存的工作方式
以下详细介绍了CPU是如何工作的,CPU和内存如何配合,如何读取和写入数据以及CPU内部如何处理指令的相关说明
1. CPU外观
2. CPU内部总览
1、CPU内部有许多连线,这些连线时刻都在传递信号2、每个CPU都有一根电压以固定频率变化的信号线,它保证了CPU各个部
分的同步工作。这根线叫做时钟信号线
3、现代的CPU的频率都是以GHz来计算的,G表示十亿,Hz表示每秒的次数。
4、所以现代CPU的时钟频率都在几十亿赫兹,这样高的速度使得CPU能够
快速地完成非常复杂的工作.
5、然而,在每个时钟周期内,CPU所做的事情却是非常简单的。
1、你的电脑CPU可能是由Intel或是AMD这样的公司生产的,但是,我们今天
要分析的却是一款叫做Scott的CPU
2、这款CPU并不是真实存在的,它是John Scott在他的《But How Do It -
Know?》 这本书上设计的一款理论上的CPU
3、这本书可以在http://www.buthowdoitknow.com/ 网站上获取
4、这是一本非常不错的书,它在不涉及非常多技术细节的情况下,详细地
讲解了CPU的每个部件,如果你正在找一本介绍计算机如何运行的书,
我会非常推荐这本
3. CPU底部引脚
1、你可以看到CPU的底部有许多突出的管脚,CPU通过这些管脚和外界交换信息。
2、CPU安装在我们所熟知的主板上,主板可以让计算机的所有部件连接在
一起。
4. 观察CPU和内存如何相互配合
1. 概览图
1、所以我们把CPU翻过来并把它插入主板,主板的右侧区域是RAM(也就是内存),内存RAM是Random Access Memory(随机访问存储器)的简称,它用于存储计算机运行时所需要处理的所有数据2、现在让我们通过观察CPU和内存如何相互配合,来稍微了解一下内存的工作原理。
3、现在我们把左侧的区域去掉,把右侧的区域移过来,为内存条腾出空间。
4、内存包含一系列的地址,在每个地址处都存储着一块数据。
5、CPU通常是一个一个按顺序地从内存里取数据,但是如果程序需要CPU打断执行顺序,它也可以做到(随机存取),这也是为什么内存RAM也叫做随机访问存储器的原因,因为数据可以被随机访问,即使正常情况下时按顺序访问的。
6、当计算机首次运行一个程序时,它会首先发送一个内存地址给内存,然后开始载入这段程序。
2. 读取数据
1、当计算机首次运行一个程序时,它会首先发送一个内存地址给内存,然后开始载入这段程序。2、内存地址是一个只包含0和1的二进制数值,0 和 1 代表对应地址线上电平的高低。
3、然而只输入地址内存是并不会工作的,只有等到CPU打开设置(set) 信号线或使能(enable)信号线时才会。
4、如果是使能信号线打开,内存会自动把对应内存地址上的任何数据都传给CPU。
5、如果使能信号线打开,内存会自动把对应内存地址上的任何数据都传送给CPU,这样CPU就可以处理该数据.
6、一旦CPU结束该数据,它就会发送另一个地址给内存,然后打开使能信号线,从内存获取另外一个数据,这个过程会在计算机中一边又一遍地重复。
3. 写入数据
-
1、如果CPU需要保存数据,那它会首先输出一个地址信号,然后输出数据内容,然后打开设置信号线,内存就会用新输入的值重写该地址处的数据。
4. CPU指令集和内存内部数据
-
1、那内存内部的数据又是些什么呢?因为它看起来好像也是一堆0和1,好吧,内存中存储的数据是由很多
部分组成的,其中最重要的一部分叫做指令(Instruction),指令用于CPU完成不同的工作。
- 2、内存还可以存储数据,这些数据可能用于做加法,或者做比较,或者是其他的某种处理数据的方法.还有一种东西,可看起来会比较奇怪,那就是内存中也可以存储地址,也就是在内存某个地址处的存储内容还是一个地址,这些地址可以用来完成很多事情。比如,如果你想把一个数据输出到外部设备上,那么你必须要知道该设备的地址.比如你是想把它输出到打印机上呢,还是想把它输出到显示器上?
内存上同样还可以保存字符,如果你想在屏幕上显示一些字符,你实际上是在内存中存储了一堆的0和1,每个字符都按照一张特定的字符编码表以01组合的形式存储在内存中,字符的编码值可以是任意的,比如某人可以决定,这是一个小写的a,而另外一个是大写的G,以上就是内存中实际存储的内容,现在我们只把内存看做一堆的0和1,然后把内存条再插回主板
- 3、我们再把内存看成一系列地址和数据的组合,把CPU从主板上取出,看看什么叫做CPU指令集.
之前讲过,内存中可以存储指令,而每个CPU都有一套只有自己能够执行的指令集,所以CPU可能有一个叫做LOAD(装
载)的指令,用于将数据从内存装载到CPU,装载指令之后可能有一个ADD(相加)指令,用于将数据相加,相
加指令之后可能会有一个STORE(存储)指令,用于将相加的结果保存到内存中,在多个装载指令之后可能还会有一个COMPARE(比较)指令,用于比较两个数的大小,比较指令的一个非常重要的应用场合是条件跳转指令(JUMP
IF),之前讲到过,CPU通常是一个一个按顺序从内存中取数据的,但是有时候CPU可能要跳转到一个并非连续的地址上去执行一些内存中的指令,条件跳转指令会在跳转之前检查条件是否成立,它使用比较指令的结果来判断条件是否成立,还有一类跳转指令称为无条件跳转指令(JUMP),用于无条件跳转最后还有输入与输出指令(IN/OUT),它们可以用于将数据输出到外部设备,比如显示器,或者将数据从设备上输入,比如键盘,这两个指令通常都会与某个地址一起使用,像我们之前所描述的那样,CPU可以还会包含其他指令,但是这些指令是我们更常见的.至此我们已经知道,内存中包括指令,数据,地址,以及字符,那么
就让我们通过这些指令,来完成一个猜数字的游戏程序.
5. 猜数字时内存和CPU
-
1、首先把一个数字,比如9,装载到CPU中,我们假设这就是正确答案,所以在这之前它就已经被存在内存中了,接下来是一个输入指令,用于输入用户的猜测的数字,输入指令之后是键盘的地址,用于告诉CPU从哪里输入数据,接下来是比较指令,用于比较用户输入的数据和CPU中存储的数据是否相等,比较指令之后是一条条件相等跳转指令,如果刚才的两个数据相等,则会跳转到另一个内存地址处.紧接着条件相等跳转指令的是一个新的内存地址,如果之前的数据相等,则CPU会立刻跳转到该地址执行新的指令,如果两个数据不等,则CPU
会忽略条件相等跳转指令以及其后跟随的地址,然后继续执行,跟在跳转地址之后的是一条输出指令以及显示器的地址,然后是字母G,u,e,s,s,空格,a,g,a,i,n,所以如果用户输入错误,程序将提示用户再猜一次,然后跳转到输入指令处,重新读取用户输入并执行以上过程.顺便说一下,此处使用的输入与输出指令是经过简化的,你可以在书上看到更为详细的说明
5. CPU内部如何处理指令
1、现在我们来简单地看看CPU内部是如何处理指令的, 之前我们见过6502CPU的内部结构,现在把6502的内部布线去掉,来看看Scoot
CPU内部有哪些部件,第一个部件是控制器,它的地位就好比军队中的指挥官,它从内存中以指令的形式接收命令,然后把该指令进行分解,分解成各个部件的子命令,控制器的一个最重要的子部件是算术逻辑单元,或者简称ALU,算术逻辑单元用于完成CPU内部的所有算术运算,比如加法运算,减法运算或者我们之前提到过的比较运算,算术逻辑单元有两个输入,我们以输入A和输入B来表示,假设现在有两个来自装载指令的数字,我们要把它们加起来,那么首先控制器要从内存中加载指令,然后根据指令确定算术逻辑单元要进行何种操作,然后算术逻辑单元执行该操作后输出结果,也有些时候,根据指令的类型,算术结果可以被忽略.比如,如果你要执行的是比较指令,那么算术逻辑单元就不需要输出值,它只需要告诉控制器两个数比较的结果,为此算术逻辑单元使用一种叫标志位的东西(Flags),来帮助控制器在收到下一条指令,比如跳转指令时,CPU该如何进行操作,现在我们只假设我们在执行一个需要输出结果的操作.那么输出结果到底去哪了呢?
2、好吧,从算术逻辑单元出来的8根线将最终连接到一个寄存器,寄存器是一个非常简单的部件,它的作用就是用来暂存数据的,它和内存是一样的,只不过寄存器位于CPU内部,这使得它工作速度非常快,并且在指令运行期间存储临时数据时非常有用.
3、当算术逻辑单元向寄存器输出数据时,数据并不会立刻存入寄存器,而是要等到控制器打开设置信号线时才会,此处的设置信号线和之前内存的是一样的,当设置信号线打开时,寄存器就会保存任何在它的输入信号线上的数据,一旦我们在寄存器中存储了运算结果,那要怎样才可以把数据取出来呢?
当要把数据从寄存器取出时,我们还需要从控制上再连接一根使能信号线,只要打开信号线,寄存器就会把它存储的任何东西都输出,寄存器的输出信号线被连接到称之为CPU总线的地方,总线,就像我们之前在主板上见到过的,就是一组用于连
接计算机各个组件的信号线,在总线上还有连着其他的寄存器,这些寄存器也有自己的使能与设置信号线
4、里面可能存储着之前某个指令所保存的数据,如果控制器要在某个寄存器里保存数据,它就会打开这个寄存器的设置信号线,然后数据就被保存到寄存器中,接下来CPU会关闭这个寄存器的使能信号线并且清空总线,图中顶部的四个寄存器都是用来在CPU运行过程中保存数据的,所以它们的输出信号线都直接连接在总线上,现在我们已经可以通过打开和关闭某些信号线来在寄存器之间转移数据,这就是总线的好处,它可以非常轻易地在组件之间传输数据,总线的缺点是它在同一时间只能传输一个数据
5、由于它的这个缺点,算术逻辑单元使用一个暂存寄存器来保存输入B,当控制器要处理一个和算术逻辑单元相关的指令时,它会先把输入B保存在暂存寄存器中
6、暂存寄存器可以不需要使能信号线,因为它只把数据输出给算术逻辑单元,不会与其他寄存器产生冲突,算术
逻辑单元的另一个输入直接来自于总线,控制器会打开另一个寄存器的使能信号线,于是这个寄存器里的数据就变成了算术逻辑单元的输入A,这个数据会在算术逻辑单元完成运算之前一直存在总线上,现在算术逻辑单元的两个输入已经具备,我们已经准备好让算术逻辑单元执行计算操作了,之前我们看到过,通过从内存装载指令,控制器可以知道让算术逻辑单元执行任何操作,指令本身保存在另一个叫做指令寄存器的寄存器中.顺便说一个,来自总线的输入不会影响到指令寄存器,因为我们已经按照之前的步骤,将指令保存到寄存器中了,这个寄存器和暂存寄存器一样不需要使能信号线,因为它只把数据输出到控制器,基于指令寄存器中的内容,控制器可以指示算术逻辑单元进行何种类型的操作,这里我们假设现在要处理的是一个比较指令,比较指令并不需要关心比较运算输出的结果,我们只想知道两个数比较之后的大小关系,因此我们要用到之前讲到的
标志位(Flags),每个标志位都是一根信号线,它的打开或关闭都是根据某些条件是否满足来决定的,在Scott-CPU内部有四根这样的信号线,我们来看看其中的两根是如何工作的.
7、“A更大” 这个标志位A is Larger 会在输入A大于B时打开,如果A等于B,那么"相等" 这个标志位Equal会打开, 如果两个标志位都是关闭状态,则说明B大于A.
8、但在这个示例中,“相等” 标志位是打开的,所以这意味着两个输入时相等的
9. 当比较指令结束时,我们仍然需要在下一个指令中使用标志位,所以我们把标志位保存到一个只有四位的寄存器中,每个位保存一个标志位信息,一旦这些标志被设置(保存)到寄存器中,比较指令也就结束了,CPU可以从内存中取下一条指令
10. 通常比较指令之后都会跟随一个条件跳转指令(JUMP
IF),这种"比较-条件跳转"指令组合在计算机编程中是非常常见的.任何时候,当计算机程序包含不止一条执行路线时,程序都会包含"比较-条件跳转"指令来决定走哪条路线,现在我们搞定了比较指令,并且已经把比较结果保存到了标志位寄存器中,我们需要告诉内存我们已经准备好接收下一个数据了,在这个例子中,下一个数据是一条指令,所以在CPU内部,另外一个非常重要的寄存器是指令地址寄存器,CPU通过这个寄存器来获取下一条要执行指令的内存地址,当CPU准备好接收下
一条指令时,它会把指令地址寄存器使能并输出到总线上,最终指令地址会传递到内存,但并不直接传递过去,在这中间还有一个寄存器,叫做内存地址寄存器(前面的叫做指令地址寄存器),它的唯一作用就是告诉内存CPU取数据的地址是多少,因为CPU不光是只从内存里面取指令(还有可能是数据),一旦指令地址被设置到内
存地址寄存器中,该地址就会立刻传递到内存,因为内存地址寄存器并没有使能信号.
11. 然后控制器打开内存的使能信号线,内存就会自动把该地址的内容输出到总线,在这个例子中该地址的内容是一条指令,接下来这条指令会保存到指令寄存器中,然后控制器就会去处理它.
12、在这个例子中是一条条件相等跳转指令,用于检测相等标志位是否被设置,它通过把自己的某一位,以及相等标志位,一起输入到一个与门进行逻辑与操作,如果与门的两个输入都是打开的,则与门的输出也是打开的,这个输出最终会触发跳转动作,这个跳转动作最终从内存中取下一个数据,这个数据刚好就是要跳转的地址,并且会把这个地址保存到指令寄存器中
13、当条件相等跳转指令结束时,CPU就会从这个地址开始执行新的指令. 从这个地址开始的指令可能是向屏幕输出"你猜对啦"之类的文字信息,因为我们通过比较指令已经知道用户猜对了.
14、最后CPU还有四根信号线用来控制外围设备,例如显示器,键盘之类的,现在关于Scott-CPU的结构图已经基本完成了
15、数据在CPU内部通过总线进行传输,根据数据的不同用途保存在不同的寄存器中,前面介绍过每个指令在Scott-CPU内部处理时间大概是6个时钟周期,现代CPU可以在每个时钟周期处理多条指令,这意味着你用来看这个视频的计算机CPU很有可能没秒钟都在处理成百上亿条指令,这种现象级的速度是通过不止一个CPU核心,而是多个来实现的,并且还要保证尽可能多地让这些核心都被激活,这使得现代CPU比Scott-CPU要复杂得多得多,但是它们所做的基础工作还是和Scott-CPU差不多的.
16、现在我们缩小原理图,以便于看到所有信号线和芯片管脚的连接,在最右侧的是内存的设置/使能信号线.顶部 是内存地址线,底部是数据线,数据线既连接内存,也连接外部设备,左侧的是输入/输出控制线.
17、现在再缩小示意图,以便于看到整个芯片的其他部分,然后盖上盖子,并把CPU插到主板上,通过使用左侧的接口,我们可以插入显示器和键盘的连线,每个端口都有一个地址,这个地址用于在CPU输入/输出指令中指定设备地址,顺便说一下,在这台计算机中,端口地址是通过数据总线来传输的,因为地址总线只留给内存使用.
18、现在缩小显示,看看主板是如何安装在主机箱中的,主机中还有一个我们最后要关注的组件,这就是硬盘,一旦 关闭电源,所有在计算机中保存的数据都会丢失,这时需要一个可以永久保存数据的方法,为此我们可以使用 硬盘
19、硬盘内部有一个旋转的表面覆盖有磁性存储材料的金属碟片和一个悬浮的金属壁,金属臂可以移动到盘片的不同部位,这样就可以读写相应位置的数据,碟片和金属臂通常移动速度是极快的,但是再快也赶不上CPU处理数据的速度,因为这个原因,CPU在处理硬盘数据时候,通常都要把它们先读取到内存
20、现在把硬盘放回主机箱并显缩小显示,现在我们可以看到刚才运行的程序,并且程序提示用户猜测结果正确。
现在你已经了解到了计算机大概是如何工作的