Basics
5/23/26About 4 min
Basics
冯诺依曼结构
- 采用存储程序工作方式
- 计算机由运算器、控制器、存储器、输入和输出设备5个基本部件组成
- 存储器不仅存放数据,也存放指令,形式上数据和指令没有区别,但计算机能应区分它们;控制器应能自动执行指令;运算器应能进行算术运算、逻辑运算;操作人员可通过输入、输出设备使用计算机。
- 计算机内部以二进制形式表示指令和数据;每条指令由操作码和地址码两部分组成,操作码指出操作类型,地址码指出操作数的地址;由一串指令组成程序
存储程序工作方式
- 任何要计算机完成的工作都要先被编写成程序;
- 将程序和原始数据送入主存并启动执行;
- 一旦程序被启动,计算机应能在不需要操作人员干预下,自动完成逐条取出指令和执行指令的任务(自动执行)
执行过程
- 根据PC取指令
- 指令译码与PC增量
- 取操作数
- 执行
- 结果写回主存或寄存器
重复此过程,使程序自动一条条执行
基本结构
主存储器:存放指令和数据
ALU:进行算术逻辑运算
CU:逐条取出指令并进行译码
GPRs:临时存放数据或运算结果
标志寄存器:记录ALU产生的标志信息
IR:临时保存从主存取来的指令
PC:保存下一条指令地址
CPU:控制部件、运算部件和各类寄存器互联组成的电路
总线:连接不同部件进行信息传输的介质
MAR:存放送到地址线的主存地址
MDR:存放发送到或从数据线取来的信息
| Acronym | 英文全称 | 中文名 |
|---|---|---|
| CPU | Central Processing Unit | 中央处理器 |
| PC | Program Counter | 程序计数器 |
| MAR | Memory Address Register | 存储器地址寄存器 |
| ALU | Arithmetic Logic Unit | 算术逻辑单元 |
| IR | Instruction Register | 指令寄存器 |
| MDR | Memory Data Register | 存储器数据寄存器 |
| CU | Control Unit | 控制器/控制部件 |
| GPRs | General-Purpose Registers | 通用寄存器组 |
ISA
指令集体系结构 Instruction Set Architecture:软件和硬件间的界面。定义了计算机可以执行的所有指令的集合。
规定内容包括:
- 数据类型及格式
- 指令格式
- 寻址方式
- 可访问地址空间大小
- 可访问通用寄存器的个数、位数和编号
- 控制寄存器的定义
- IO空间的编址方式
- 中断结构
- 机器工作状态的定义和切换
- 输入输出结构和数据传送方式
- 存储保护方式
- ...
更快的程序
编译器利用CPU的特性进行优化:
| 优化 | 特性 | 原理 |
|---|---|---|
| 循环展开,消除分支 | 指令流水线,流水线预测 | 避免转移,消除流水线预测失败 |
| 按顺序访问内存单元 | cache按块读取 | 增加缓存命中率,避免频繁从主存换入换出 |
| 将变量与寄存器绑定 | 存储器层次结构,极速内部访问 | 减少访问内存单元 |
| 使用更快的机器指令 | 不同指令执行速度不同 | 如乘法用移位和加减的组合替代,用xor清零,用lea实现计算 |
| 使用SIMD指令 | 向量寄存器,并行计算单元 | 一条指令同时操作多个操作数 |
| 使用串操作指令 | 硬件级微码循环 | 代替对串中的数据一个一个循环操作 |
| 多线程编程 | 多核CPU |
编译器减少指令进行优化:
- 死代码消除:消除不可达代码和无用代码(如给未读取的变量赋值)
- 常量折叠:将常量表达式或为修改的变量替换为常量
- 函数内联:将函数调用转换成直接使用函数体的形式
更鲁棒的程序
- 缓冲区溢出攻击的防范:堆栈金丝雀,在局部变量和返回地址间插入随机的“哨兵值”
- 数组越界的防范:分配局部变量时,变量间留出空间作为隔离带,用特殊的魔数填充如
0xCCCCCCCC),返回前调用栈变量检查函数,若数据被改变,则判定出现局部数组越界 - 读取未初始化变量的值的防范:变量空间预填充为魔数(栈:0xCC, 堆:0xCD,为无效地址),若此内容被当作内存指针,必然引发段错误
- 栈的平衡性检查:进行函数调用时,先将ESP暂存到安全的寄存器中,返回后将ESP与调用前的值对比,若位置不一致说明栈被破坏
- 随意跳转的防范:编译合法的跳转目标时,在第一行插入特殊指令
endbr64,CPU 执行间接跳转后检查下一条指令必须是endbr64