一、在软硬件接口中、CPU帮我们做了什么事?
硬件角度
CPU就是一个超大规模集成电路、通过电路实现加法、乘法及各种各样的处理逻辑
软件角度
CPU就是执行各种计算机指令(机器语言: Machine Language)的逻辑机器
不同CPU有不同的指令集、所以 电脑上的程序简单的复制下装载到手机上是不能正常运行的、而复制到另外一台计算器上就可以正常运行
存储程序型计算机
程序是由成千上万条指令组成的、但是CPU里不能一直放着所有指令、平时是存储在存储器的、这种指令存储在存储器的计算机叫存储程序型计算机
二、从编译到汇编、代码怎么变成机器码?
高级语言 -> 编译 -> 得到汇编代码
汇编代码 -> 汇编 -> 机器码(计算机可识别的指令)
三、解析指令和机器码
常见指令:
算术指令
加减乘除等、在CPU层面、都会变成一条算术指令
数据传输指令
给变量赋值、在内存里读写数据等、用的都是数据传输类指令
逻辑类指令
逻辑上的与或非、都是这类指令
条件分支指令
if/else 等都是分支类指令
无条件跳转指令
函数调用
四、CPU是如何执行指令的?
拿Intel CPU来说、里边包含几百亿个晶体管、实际上指令执行起来非常复杂、对软件程序员来说、只需要知道指令是顺序执行就可以了
CPU其实是一堆寄存器组成的、而寄存器就是CPU内部由多个触发器(Flip-Flop)或者锁存器(Latches) 组成的简单电路
N个寄存器或者锁存器可以组成一个N位(bit) 的寄存器、能够保持N位的数据、eg. 我们使用64位Intel的服务器、寄存器就是64位的
CPU中不同功能的寄存器会有很多、有三种比较特殊的:
PC寄存器
Program Counter Register
, 也叫地址寄存器
Instruction Address Register
用来存放下一条
需要执行的计算机指令的内存地址
指令寄存器
Instruction Register
用来存放当前
正在执行的指令
条件码寄存器
Status Register
用里边的标记位Flag
, 存放CPU进行算术或者逻辑运算的结果
除了这些特殊的寄存器、CPU还有更多用来存储数据和内存地址的寄存器. 这样的寄存器每类通常有很多、会根据它们的存放内容取名字、eg. 整数寄存器
, 浮点数寄存器
, 向量寄存器
和地址寄存器
等,有些既可以存放数据、也可以存放地址, 我们称为 通用寄存器
实际上、程序运行的时候、CPU会根据PC寄存器里边的地址、从内存把需要执行的指令读取到寄存器里边执行、然后根据指令长度自增、读取下一条指令, 可以看到指令在内存中是连续保存的、也会顺序加载
而有些特殊指令、eg. J指令
, 也就是跳转指令
会修改PC
寄存器里边的地址值、这样下一条要执行的指令就不是才能够内存顺序加载的了、因此才能使用 if...else
/ while
/ for
等语句
五、周期概念
指令周期
Fetch
->Decode
-> Execute
(获取指令 -> 指令译码 -> 执行指令 ) 的循环称为一个指令周期(Instruction Cycle
)
CPU周期
Machine Cycle
CPU的内部操作很快、但是内存访问速度很慢、每一条指令都需要从内存里加载而来、把从内存中读取一条指令的最短时间称为一个CPU周期
一个指令周期
包含多个 cpu周期
,
一个cpu周期
包含多个 时钟周期
六、建立数据通路
数据通路就是我们的处理器单元、通常由两类元件组成:
1.操作元件(组合逻辑元件) 其实就是ALU、在特定输入下、根据组合电路的逻辑生成特定输出
2.存储元件: 状态元件 eg. 计算过程中用到的寄存器、无论是通用寄存器还是状态寄存器、都是存储元件
通过数据总线将操作元件和存储元件连接、就可以完成数据的存储和传输、就是所谓的建立数据通路
七、CPU所需要的硬件电路
1 2 3 4
| 1. ALU: 无状态的、根据输入得到输出结果的电路 2. 寄存器:能够进行状态读写的电路元件. 常见的有 锁存器(Latch), D触发器(Data/Delay Flip-flop) 电路 3. 自动实现pc寄存器自增的电路 4. 译码电路: 实现对指令进行decode、对拿到的地址去获取对应的数据或者指令等
|
组合逻辑电路
给定输入、得到固定输出. 无法完成复杂工作
时序逻辑电路
解决了自动运行
和存储
问题
时钟信号: 通过一个电磁电路实现、不断切换信号
反馈电路: 把当前电路的输出信号作为输入信号、再返回到当前电路