计算机组成

在讲内存数据和CPU计算之前, 先简单讲讲计算机的组成, 先看图:

控制器又称为控制单元(Control Unit,简称CU),是计算机的指挥中心,只有在它的控制下,整个CPU才能够有条不紊地工作、自动执行程序。CU包括指令寄存器、指令计数器,其中指令寄存器存放当前正在执行的指令,指令计数器总是指向下一条要执行指令的地址。CU的工作流程为:从内存中取指令、翻译指令、分析指令。然后根据指令的含义,向有关部件发送控制命令,控制相关部件,执行指令所包含的操作。具体的指令执行过程如下:CU通过指令计数器,获取下一条将要执行指令的地址,通过该地址获取具体的指令,存放在指令寄存器,然后对该指令解码,如果是一个add(加法指令),会通过将寄存器中的值加载到运算器,其中寄存器中的值是从cache或者主存中获取的,经过运算器的运算产生进位、溢出等信号反馈给控制器,产生的结果也存放在寄存器中。

运算器是一个负责算术运算和逻辑运算的模块,主要包含算术逻辑单元(Arithmetic Logic Unit,简称ALU)和浮点运算单元(Floating Point Unit,简称FPU)。ALU的主要功能:在控制信号的作用下,完成加、减、乘、除等算术运算,以及与、或、非、异或等逻辑运算以及移位、补位等运算。通常ALU由两个输入端和一个输出端(两个值输入,一个结果输出)。FPU主要负责浮点运算和高精度整数运算。运算器是用与、或、非逻辑门电路搭建起来的。

寄存器的主要功能是存储数据、地址及指令,并且能够高速、自动地完成数据的存储。寄存器是有记忆功能的器件,而且采用两种稳定状态0或1来记录数据信息,所以CPU中的程序和数据,都要转换为二进制才可以存储和操作。寄存器也是由与、或、非逻辑门电路组成的,下面就展示1bit的存储,32个bit存储电路就是32个重复的1bit电路。

内存映射单元(Memory Map Unit,简称MMU),指的是将虚拟地址转化成物理地址的模块。MMU包含了两个模块:页表查找表(Table Lookup Buffer,简称TLB)和页表遍历单元(Table Walk Unit,简称TWU)。TLB是一个高速缓存,用于缓存页表转换的结果,从而减少页表查询的时间。一个完整的页表翻译和查找的过程叫做页表查询,页表查询是通过硬件模块TWU自动完成的,但是页表的维护需要软件来完成,且存放在主存中,因此页表查询是一个耗时的过程。当TLB未命中时,MMU才会通过TWU查询页表,从而得到翻译后的物理地址,这个虚拟地址及物理地址的映射,也会存储在TLB中。

由于CPU与内存之间存在很大的速度差(两者相差上百倍),同时又因为程序的加载,有时间及空间局部性的特点,也就是说程序的一个内存位置被访问了,附近的位置很快也会被访问到。那么我们可以把内存中的部分代码,提前加载到访问更快的Cache里面。既然Cache的主要作用是CPU与主存的缓冲层,那么Cache的速度应该接近于CPU,基本上是与CPU同频运作。

内存数据

内存中放着很多很多非常小的“算盘”,一个小算盘里面有8个珠子,珠子有电了就拨上去表示1,没电了就拨下来表示0,一个珠子叫1bit,一个8个珠子的算盘叫1Byte 那么计算机用电怎样才能像算盘那样,记录珠子是在上面还是还是在下面呢? 答案就是: 电容 ( 一个珠子就是一个电容)

电容

内存

那么,思考一下超过255的数怎么办?负数怎么办?有小数点的浮点数怎么办?

内存地址

内存中的算盘是按顺序摆放的,我们把顺序编上序号,这个序号就是“内存地址”,通过序号就能找到这个算盘,所以内存地址就是个“数”—用来找算盘的数…

进制转换

前面讲过,计算机是用电来计算的机器,电只有2种状态:有电或没电, 所以二进制是计算机最原始的计算和记录数据的形式, 而我们人类用的是十进制,二进制转十进制刚才讲过了, 那为什么会有8进制和16进制呢? 这和前面说过的KB、MB以及GB类似, 用8进制或16进制就是为了把一个算盘上的数值更加方便地表示出来。 看看下面的例子:

16进制数:0123456789ABCDEF 16进制用的非常多,例如查看内存,网络通信以及和硬件相关的编程等场合

计算机中的运算

在计算机中各种运算都是CPU来完成的,而CPU在算术运算上只能做加法和移位和取反运算,在逻辑上只有与、或、非、异或。 下面详细讲这些运算:

CPU运算的原理 — 三极管

前面一直强调过的:计算机就是用电来进行计算的机器,存储用电容是否有电压来表示是否有数据(1,0)那么用于计算的CPU呢? 计算是一个过程, 过程是动态的, 这个动态的过程使用是否有电流来实现这就是电路, 初中的电学应该没讲电容、二极管和三级管, 高中一定会学, 其实计算机就是由这些简单的电路构成的, 因此有人说计算机的发明实在是太巧妙了,巧妙到不像是人类能够发明出来的, 更像是外星文明传过来的…

那么CPU是怎么计算的? 我们从最基本的也是最重要的一个元器件—三极管讲起:

下面就是三极管的电路图,有两个电极和一根控制线。

三极管的工作方式也非常简单:

如果控制线有电流输入,两个电极导通,否则断开

例如NPN, 电流从上面电极来,如果控制线有电下面的电极有电流,如果控制线没有电流,则下面的电极也没有电流。只有控制线有电流通过,下面的电极才能有电流

三极管有NPN型和PNP型, 具体是哪个型号是由其物理结构决定的(电流只能是P到N), 在电路符号上看箭头, 电流流向发射极的是NPN, 电流流向基极的是PNP

三极管组成的电路:非门(NOT Gate)

通过前面了解三极管的工作方式:通过电流控制电流, 灵活运用三极管的组合以及电极的意义(哪个极当什么用), 就能像“门”一样控制电流的进出,因此,这部分电路叫XX门: 非门, 与门, 或门, 异或门…

下面讲讲非门(Not Gate): 非门

设计思路: 把控制线当作输入,把上面的电极当作输出, 把下面电极接地。

非门一个输入一个输出

“非”的意思是反着来: 给我0我给你1,给我1我给你0

下面示例, 红色是有电流

非门的简单表现方式: