CHAPTER 1
第1章 CPU架构与流水线技术概述
中央处理器(Central Processing Unit, CPU)是计算机系统的“大脑”,也是计算机体系结构的基础组件。当前对于处理器芯片的定义是广义的“片上系统(System On Chip, SOC)”,而非传统意义上的“运算器和控制器”。片上系统除了处理器核(CPU Core)之外,还包含了DDR控制器,PCIe高速总线接口控制器等一系列IP。本书关注的仍然是传统意义上的“执行指令、进行运算和控制”的处理器核的微架构设计,书中内容统一使用CPU指代处理器/处理器核(CPU Core),后续不再赘述。
通常意义上的架构,例如,x86、ARM、RISC-V,其全称是“指令集架构(Instruction Set Architecture, ISA)”。它是计算机系统中最基本的接口,在(硬件)体系结构与软件编译器/操作系统之间定义了一条清晰的界限。软硬件两边都必须能够理解并且严格遵守ISA,同时软硬件两边在对方严格遵守ISA的前提下可以分别进行复杂的开发。ISA将软件与硬件分离,并独立于它上面的所有软件层。CPU架构的目标是设计一个功能性的硬件架构,以在给定技术约束的情况下尽可能高效地实现指令集功能。
一般来说,指令将程序命令从软件传输到硬件,它们是执行整个程序的基本执行步骤,包含操作码(Operation Code)和操作数字段。通常所说的复杂指令集计算机(Complex Instruction Set Computer, CISC)与精简指令集计算机(Reduced Instruction Set Computer, RISC)都属于ISA的范畴。
一个通用的ISA应该包括以下几类指令:
· 数据处理指令:对输入数据进行运算。例如,加减乘除运算指令,比较类指令,移位指令,逻辑类指令,浮点运算指令。
· 数据搬运指令:完成数据在不同寄存器之间的搬运,或者寄存器到存储器、存储器到寄存器之间的搬运。
· 控制流指令:完成程序执行地址的跳转。程序通常是从上到下顺序执行的,但如果要改变程序的执行顺序,跳转到其他地址执行(如高级语言中的函数调用),需要控制流指令完成程序地址的跳转。大多数程序跳转的范围相对较小,通常是以当前程序计数器(Program Counter, PC)加一个偏移量计算得到要跳转的目标地址。还有一种情况是条件跳转,也就是根据寄存器中的值决定是否跳转,或者是根据两个寄存器比较的结果(相等、大于等)决定是否跳转。
当数据处理类指令或数据搬运类指令需要访问操作数时,指令集架构中一般会定义几种不同的寻址模式来获取访问操作数:
· 立即数寻址:所需操作数作为立即数包含在指令中。
· 寄存器直接寻址:所需操作数在寄存器中,指令中包含该寄存器的编号。
· 寄存器间接寻址:指令中包含寄存器的编号,该寄存器中的内容为数据在存储器中的地址。
· 基址偏移寻址:指令中指定一寄存器作为基地址,同时指令中包含一立即数作为偏移量,基地址和偏移量相加得到数据所在存储器的地址。
· 基址变址寻址:指令中指定两寄存器编号,其中一个寄存器作为基地址,另外一个寄存器作为偏移量,基地址和偏移量相加得到数据所在存储器的地址。
· 基址比例变址寻址:指令中指定两寄存器编号,其中一个寄存器作为基地址,另外一个寄存器作为偏移量,偏移量乘以一个系数后与基地址相加,得到数据所在存储器的地址。
以上寻址模式各个CPU厂商的命名可能有所不同,并且可能会在此基础上进行扩充。