首页 > 投稿 > 正文

电脑cpu的工作运算原理过程(cpu处理器是如何工作的)

最佳答案

许多方才入坑的小白或许对此完全没有观念,或者模模糊糊了解个大概,咱们写下的一行行代码,电脑CPU处理器到底是怎么在执行工作的呢?

电脑cpu的工作运算原理过程(cpu处理器是如何工作的)

咱们以x86架构的CPU为研究对象,从一个例子出发,来尝试解答这种问题。

1、高级语言

为了方便编程,伟大的电脑先驱们发明了一个又一个的编程语言,使得咱们应该用人类最简单了解的语法规则去叮嘱电脑结束咱们想要的功能。

例如,一个C语言程序员写下了一行代码:

int sum = a + b;

一句容易的不能再容易的C语言语句。

但即就是如此容易,聪明绝顶的电脑却还是看不懂:此乃是弄啥捏?

这个时候候就需要一个翻译,负责把人类编写的高级语言“翻译”成电脑能看得懂的东西,这种翻译便是编译器。

2、编译链接

综上所述的高级语言语句经过编译器编译链接后,生成了一个目标运行平台为x86架构的可执行程序exe/elf,操作反编译工具IDA进行分析,应该看到这行代码编译后的样子是这样的:

电脑cpu的工作运算原理过程(cpu处理器是如何工作的)

mov eax, a : 将变量a的值存入eax寄存器中

add eax, b : 把变量b的值和eax寄存器的值相加,并将结果保存在eax寄存器中

mov sum, eax : 将计算结果从eax寄存器写入sum变量

看到了吗,就像把大象关进冰箱需要分三步,电脑结束程序员的一条加法语句,也分了三步:取出被加数、加上加数、写入结果。

3、机器指令

综上所述的汇编指令只是为了人类了解方便的助记符,电脑一样也不了解这玩意,那几条指令在内存中实际上是这样的一串资料:

十六进制:

8B 45 EC 03 45 E0 89 45 F8

十六进制是为了书写方便,电脑真正能看到的只有二进制的比特流:

10001011 01000101 11101100 00000011 01000101 11100000 10001001 01000101 11111000

紧接着,电脑要做的事情便是识别这些二进制流都是什么意思,转换成一条条的指令来执行。

在开始执行之前,先来探询一下指令格式。

4、指令格式

x86架构CPU指令集中的指令格式如下:

电脑cpu的工作运算原理过程(cpu处理器是如何工作的)

主要有六个部分:

[非必需] 指令前缀:咱们时常用到的原子操作指令前面有一个lock前缀,就属于指令前缀。

[必需] 操作码:指令最核心的部分,标识这条指令是什么功能。

[非必需] ModR/M:内存/寄存器操作数字节

[非必需] SIB:索引寻址讲述字节

[非必需] Displacement:常数偏移字节/半字/字

[非必需] Immediate:马上数字节/半字/字

需要重视的是,并不是每一条指令都包含综上所述的全部部分,非常多指令只包含里面一部分字段。

根据操作码的长度不一样,指令分为单字节操作码指令、双字节操作码指令、三字节操作码指令。

5、执行指令

电脑中真正负责指令执行的核心部件是中央处理器CPU,在CPU中有一个指令寄存器IP,全称是Instruction Pointer,在32位下,它叫EIP,在64位下它叫RIP。

接下来开始执行:

指令寄存器EIP指向了第一条指令,开始读取第一个字节:10001011,也便是0x8B。

开始指令译码,翻译出此乃是一条什么指令。

接下来是x86架构的CPU指令操作码表:

电脑cpu的工作运算原理过程(cpu处理器是如何工作的)

CPU中的指令译码模块拿到手一看,呀,不是指令前缀,是个单字节操作码的mov指令,要往eax寄存器内部塞资料,资料从哪来呢?

再往后一看,0x45,再来译码:

电脑cpu的工作运算原理过程(cpu处理器是如何工作的)

好家伙,原来是根据ebp寄存器的值+一个8位的偏移来读取资料。

再往后读取一个字节,便是偏移值:EC。

现在第一条指令就译码出来了:将ebp+0xEC地点处的4个字节的资料取出来,放到eax寄存器中。,这便是这一条指令要干的事情。

同一时间CPU还得出了另一个信息:这一条指令长度是3个字节,下一条指令的起始地址是在3个字节之后,随后,指令寄存器EIP向后拨动,指向下一条指令的地址:$+3。

指令译码结束之后,开始来正式执行它。

执行完一条未来,又去往指令寄存器EIP指向的地方,随后再一次指令译码、执行,持续重复这种过程,依次执行每一条指令。

这原来便是CPU工作最基础的原理。

拓展

综上所述讲述的过程是CPU在硬件电路层面结束的,但这样的设计思想在软件领域也一样适用。

各位若是去研究Java虚拟机JVM和Python的说明器源代码时,也会发现有相似之处:JVM和说明器通过概念一套自己的“指令集”,之后它们的编译器操作这套指令集将Java和Python代码编译成对应的程序。

运行的时候也类似,虚拟机或者说明器持续识别每一条指令,译码、执行,和CPU执行指令的过程颇有几分相似。

电脑cpu的工作运算原理过程(cpu处理器是如何工作的)

C/C++语言编译的程序,结尾是直接编译成了CPU的指令,因此跨平台实力差,若是换到ARM架构平台,原来的程序将无法执行,需要从头编译成新的平台的程序。

而Java、Python这类语言,是自己在软件层面的指令集,由于其自身已经开发了对于不一样CPU平台的虚拟机、说明器,因此这些语言编写的程序移植性好,真正做到一次编写,到处运行。

总结

咱们操作高级语言C、C++编写的程序代码,经过编译器的编译链接,最后变成CPU应该了解的机器指令,随后CPU在执行时通过持续的译码、执行,最后实现高级语言所讲述的功能。

现在你了解你用编程语言写下的程序是怎么跑起来的了吗?

猜您喜欢