通俗的说一说指令集是什么?CPU是如何工作的?
本文转载自https://baijiahao.baidu.com/s?id=1599862816733469968&wfr=spider&for=pc
前言:
挺久之前写过一篇文章《通俗的说一说:一堆沙子是如何变成芯片的》,有网友回复要求讲一讲CPU是如何工作的。
老实说,虽然在很多年前学过数字电路,也学过一点汇编语言,可是早已经交还给老师了,更不要说当年就没怎么学好。
一直拖了很久,看过一些资料之后,才再次提起这一事,本人试图用最通俗的语句来描述一下什么是指令集和CPU的工作原理。说得不对,也请大家包涵指正。
要说清楚CPU如何工作,我们先得了解一下程序是如何运行的,因为CPU是由程序驱动并完成程序的指令,从而得到运算结果的。
在最早的计算机上,编程人员将计算要求转换成1010这样的二进制程序,再将1010在纸带上用孔来表示,打孔的纸带输入到计算机之后,计算机就能计算了。
这纸带上的二进制程序就是机器语言,这些孔就是告诉计算机,该读数据、进行加减乘除、或者“与或”逻辑运算,而纸带上直接的输入是“孔”和“非孔”,也就“断电”和“通电”,反应在晶体管上的状态就是“闭”与“开”,如果晶体管是一个灯泡,那它表现出来就是一闪一灭。
然而,机器语言太过于专业难懂,科学家们用了一种高级的语言来代替它,这就是汇编语言。汇编语言更接近人类的语言,用编译器可以将汇编语言转为机器可以识别的机器语言。
这编译器就相当于一个翻译机,它根据设定好的规则,将汇编语言一条条转化为二进制语言。
这个时候,问题就来了!编译器所用的规则,是由设计计算机(现在归结为CPU)的人规定的,那么用汇编语言的工程师,就必须按照他所给的规则来编,要不然,编译器转化出来的二进制语言就是乱七八糟的,在电脑上反应出来的就是蓝屏了,因为CPU根本不管你输入的101010是对是错,它就按给的来执行,这时出来的结果就不知道是什么东西了。
好了,设计CPU的人给出的编写规则就可以说是指令,这一系列的规则就是指令集(合)。
而设计CPU的厂商有多家,这样就产生了不同的指令集,比如intel阵营的8086指令集,ARM阵营的RISC指令集。不同阵营,其对应的汇编语言也是不一样的。
虽然汇编语言比较接近人类语言,但是毕竟还是过于难懂,这也是为什么古代有那么多秘籍,能练成绝世武功的人少之又少,那是因为,并不一定所有得到秘籍的人都能看得懂。
为了解决跨平台运行程序的问题,科学家又发展出了各种各样的高级语言,比如C、C++、VB、PHP、JAVA等等,用这些语言编写的程序要么在相应系统正确的运行环境中直接运行,要么经过编译,打包出对应的程序就可以了。比如用JAVA或PHP写了一个APP,通过打包工具,可以直接打包成安卓APP,也可以打包成苹果APP,这就解决了汇编语言不兼容的问题。
用下面的图表示一下这三类语言的区别与关系:
用户的需求就如探子得到的情报,大帅必须对敌人来犯进行处理。这时大帅就写了一个“射箭”的程序。旗手将“射箭”转化成了旗语的汇编语言。最后箭队的队长就将旗语转化成了“拉弓”、“放箭”这样的二进制机器语言。箭兵得到命令,按指令进行操作。
image如何打一场战争
好了,这个箭队就是最终执行任务的CPU。
更专业些的描述是下面的图形
image那么CPU的工作原理,就是将输入的信息转化成10101数字信号,这些信号通过可以应用傅立叶变换的CPU模块转换成高电平与低电平,(《最高等的美:数学史上十大最美的公式》),这些模拟电信号按指定通过不同的模块,CPU模块上的微小晶体管就会产生“闭”与“开”的动作,最终得到计算结果。
image与傅立叶变换相关的正弦波
可进行读、写、转换等操作的模块是下图中的control(控制器),存放数据的是cache、DRAM,真正进行计算的是ALU单元。
image左CPU右GPU的微架构
相信看到这里的朋友应该大致对CPU和指令集有些概念了,现在再去百度,应该很容易理解那些专业的内容了。