最近在看《嵌入式 C 语言自我修养-从芯片、编译器到操作系统》,这本书的作者写东西很有意思,用诙谐的语言讲清楚了很多嵌入式领域的基础知识。

今天主要看了看第二章的知识,讲了计算机体系结构和 CPU 工作原理,这里做一点简单的记录。

最开始的部分讲了芯片的制造过程,从硅片制作、光刻到芯片封装讲的很清楚。相比《半导体材料》讲的还算比较基础,这里不再赘述。

本文主要关注 CPU 的原理,以及 CPU 性能优化方式、CPU 多核交互以及 CPU 指令控制的内容。

CPU 特征

CPU 的原型是图灵机,即数据流顺序传导、控制电路控制 ALU 对数据进行处理运算,再将结果反馈至顺序流继续传导。CPU 的特征包括:

  1. 程序代码
  2. 程序计数器 PC
  3. CPU 有限指令集
  4. 相当于程序或计算机的状态输出

CPU 的架构分为哈佛架构和冯·诺依曼架构,前者与后者最大的区别在于前者将数据、控制指令分开存储,后者将数据、控制指令放在一起存储。哈佛结构处理信息的速度更快,但电路结构也就更复杂。

CPU 结构

CPU 中一般包含:RAM、寄存器、控制单元、程序计数器 PC、ALU、地址总线(分为地址总线和数据总线)。RAM 负责存储数据和指令,一条条指令通过地址总线发至寄存器,数据则发至 ALU。寄存器收到地址总线传递的指令后,(由译码电路处理指令后)交由控制单元处理,控制单元与 ALU 进行标志位和操作位的交互。ALU 将计算结果发至输出寄存器,后通过数据总线传回 ROM。

这里再讲讲易失性存储器和非易失性存储器的区别:易失性存储器随机访问数据(通过字线+位线选择数据,一一对应),这种方式访问数据的速度很快,但断电数据就会消失;非易失性存储器顺序访问数据(顺序查找的方式选择数据),这种方式访问数据的速度较慢,但成本较低且断电数据不失去。

易失性存储器又被称之为内存,一般用作计算机的内部存储器。非易失性存储器一般用作外部存储器。

由于 CPU 处理数据的速度远远快于数据从内存读出的速度,故 CPU 和内存之间引入了一种缓存来减少“速度墙”的影响。这种位于 CPU 和内存之间的缓存被称为 Cache。当 CPU 要从内存中读取某一数据时,会将内存中该片数据附近的一片数据都提取到缓存中保存。当下次读取某数据时,会先在 Cache 中寻找,若有则称为缓存命中;若没有,则 CPU 就重新转向内存读取数据,并重新缓存从该地址开始的一片数据到 Cache 中。

在实际 CPU 中,往往有多级 Cache 来便于对数据做更好的缓存。在多核 CPU 中,可能出现多核共用高层 Cache 的方式。

CPU 效率提升

此外,还可以使用流水线的方式提升 CPU 的效率,即取指单元、译码单元、执行单元分别工作,构成流水线。但流水线也存在问题,常见的三个问题为:结构冒险(同一时钟周期时发生硬件冲突)、数据冒险(当前指令需要用到前面指令的运算数据)、控制冒险(需根据之前指令的执行结果决定下一步的行为)。为了解决以上问题,可以使用分支预测或者乱序执行。