一、计算机 CPU 分类
计算机 CPU 主要分为两大类:复杂指令集(CISC)和精简指令集(RISC)。
1. CISC(Complex Instruction Set Computer)------复杂指令集
代表架构:x86(如 Intel、AMD 处理器)。
特点:指令功能多、芯片复杂、成本高、体积大、功耗大。
2. RISC(Reduced Instruction Set Computer)------精简指令集
代表架构:8051、MIPS、ARM 等。
特点:指令功能少、芯片简单、成本低、体积小、功耗低。
ARM 公司设计 RISC 精简指令集架构 CPU(分版本),授权给半导体公司生产。例如:STM32F103 由意法半导体(ST)生产,CPU 由 ARM 公司设计。
二、ARM 内核版本
1. ARM 经典内核
ARM7、ARM9、ARM11 等。
2. Cortex 系列
- Cortex-A(Application):应用领域
Cortex-A5(摩托罗拉智能机)、Cortex-A7(IMX6ULL、STM32MP157)、Cortex-A8(Samsung Galaxy Note)、Cortex-A9(Samsung Exynos 4412)、Cortex-A725(玄戒 o1)等
- Cortex-R(Real-Time):实时性领域,如汽车电子。
- Cortex-M(MCU):单片机控制领域
如 Cortex-M3(STM32F103)、Cortex-M4(STM32F407、STM32MP157)
以 Cortex-A7 为例,它是 32 位处理器。对于ARM裸机开发,需要用汇编语言进行编写。
三、ARM 寄存器
1. 通用寄存器
内核共有 16 个通用寄存器(R0~R12、SP、LR、PC),用于存放数据。
- PC(R15):Program Counter 程序计数器,本质是一个指针,指向当前程序正在执行指令的下一条指令。
- LR(R14):Link Register 链接寄存器,保存函数的返回地址。
- SP(R13):Stack Pointer 栈指针寄存器,管理栈区空间。

2. 状态寄存器
- CPSR:Current Program Status Register 当前程序状态寄存器,记录程序运行到某一步时的相关状态(溢出、借位、进位等)。
- SPSR:Save Program Status Register 保存/备份程序状态寄存器,保存异常发生时 CPSR 寄存器中的值。
四、CPU 核心部件
1. ALU
ALU(Arithmetic Logic Unit)算术逻辑单元,完成算术运算。
2. MMU
MMU(Memory Management Unit)内存管理单元,将程序中的虚拟地址转换为物理地址。裸机开发时关闭 MMU,Linux 驱动开发时打开 MMU。
3. CACHE
CACHE 高速缓存,CPU 直接从 CACHE 中访问数据,提高 CPU 访问数据的效率。
- D-CACHE:Data Cache 数据缓存(关闭 d cache)。
- I-CACHE:Instruction Cache 指令缓存(打开 i cache)。
五、ARM 体系架构
1. 总线结构
- 单总线:内核和外设之间通过一组线连接通信。
- 双总线(多总线):速度快的外设通过 AHB 总线(Advanced High Bus 先进高速总线,如 USB、网卡、RAM)连接内核;速度慢的外设通过 APB 总线(Advanced Peripheral Bus 先进外设总线,如 GPIO、UART、TIMER)连接内核。
2. 冯·诺依曼架构与哈佛架构
- 冯·诺依曼架构:数据和指令共享同一块存储空间。
- 哈佛架构:数据和指令拥有独立的存储空间(计算机)。
3. 交叉编译
交叉编译:在一个平台编写编译程序,在另一个平台运行程序。例如在 Ubuntu 上编写代码,使用 arm-none-linux-gcc 编译,生成 ARM 平台可运行的程序。
六、ARM处理器工作模式

经典 ARMv4/v5 架构,Cortex‑A 额外有 Monitor 安全模式;仅 User 是非特权,其余都是特权模式
| 模式 | 触发场景 | 核心要点 |
|---|---|---|
| User(usr) | 普通应用任务 | 唯一非特权,不能直接操作硬件 |
| FIQ(fiq) | 高优先级快速中断 | 独立寄存器最多,响应最快,优先级高于 IRQ |
| IRQ(irq) | 普通外设中断 | 串口、定时器等常规中断 |
| Supervisor(svc) | 上电复位 / 软中断 SWI | OS 内核入口,复位默认进入该模式 |
| Abort(abt) | 内存存取异常 | 处理内存访问错误 |
| Undef(und) | 遇到无法解码的指令 | 仿真不支持的指令 |
| System(sys) | 软件手动切换 | 特权模式,寄存器组和 User 完全相同 |
模式切换:异常自动切换;特权代码修改 CPSR 的 M 位可手动切换
Banked(备份)寄存器:不同模式拥有独立 R8~R14,减少中断现场保存开销,FIQ 的备份寄存器最多
异常优先级:复位 > 未定义指令 > 软中断 > 预取中止 > 数据中止 > FIQ > IRQ
Monitor 模式(Cortex‑A 特有):TrustZone 安全扩展,用于安全世界与普通世界切换,特权模式
七、ARM异常处理

(1)异常发生时,CPU 硬件自动完成 4 件事
- CPSR → SPSR_<mode>:把当前程序状态寄存器,保存到当前异常模式对应的备份状态寄存器,用来恢复现场。
- 更新 CPSR
切换到 ARM 指令状态
切换 CPU 进入对应的异常模式
置位中断屏蔽位,关闭对应中断
- 保存返回地址到 LR_<mode>:异常模式下的链接寄存器,记录异常处理完要回到哪里。
- PC = 异常向量表对应偏移地址:跳转到向量表,执行异常服务程序。
(2)异常返回时(软件代码做)
从
SPSR_<mode>恢复回CPSR从
LR_<mode>恢复回PC

异常向量表,本质是存放各个异常入口的固定地址表。当 CPU 检测到异常发生,硬件会自动跳转到向量表里对应的偏移地址,去执行异常处理代码。
向量表一共 8 个位置,地址偏移从 0x00 开始,每次加 4 字节:
- 0x00 Reset 复位:上电或者系统复位时触发,是所有异常里优先级最高的。复位后 CPU 进入 SVC 管理模式。
- 0x04 Undefined Instruction 未定义指令:CPU 读到无法识别、不能解码的指令时触发,进入 Undef 模式。常用来软件仿真硬件不支持的指令。
- 0x08 Software Interrupt 软中断:由软件指令主动触发,用户程序用来发起系统调用,切换到 SVC 内核模式。
- 0x0C Prefetch Abort 预取中止:CPU 去内存读取指令的时候,内存访问失败,触发预取异常,进入 Abort 模式。
- 0x10 Data Abort 数据中止:CPU 读写数据内存时访问出错,触发数据异常,进入 Abort 模式。
- 0x14 Reserved 保留位:没有对应的异常,属于预留位置。
- 0x18 IRQ 普通中断:大部分外设产生的常规中断,进入 IRQ 模式,优先级低于 FIQ。
- 0x1C FIQ 快速中断:高速紧急事件的中断,进入 FIQ 模式,优先级高于 IRQ。
八、知识点补充
1. 三级流水线结构
CPU 执行指令采用三级流水线结构:
PC 取指令 → 译码器翻译指令 → CPU 执行指令。
2. 函数调用与栈
(1)栈的特点
栈遵循先进后出(后进先出)的原则。
(2)入栈与出栈
入栈时:SP--,将数据存入到 SP 指向的新位置;出栈时:从 SP 指向的位置取出数据,SP++。
(3)函数调用过程
以 main 调用 add、add 调用 fn 为例:
- SP 指向 0x1000000C,将 main 函数返回地址入栈;PC 跳转到 0x20000000 执行 add 函数。
- SP 指向 0x20000008,将 add 函数返回地址入栈;PC 跳转到 0x30000000 执行 fn 函数。
- LR 保存 add 函数返回地址(0x20000008),PC=LR 跳回 add 函数。
- LR 保存 main 函数返回地址(0x1000000C),PC=LR 跳回 main 函数。
3. 存储体系
(1)RAM 与 ROM
RAM 是易失性存储器,ROM 是非易失性存储器。
(2)SRAM
SRAM 静态随机存储器,如 S3C2440 软件仿真 4KB RAM、IMX6ULL 内部 128KB RAM。
(3)EEPROM
EEPROM 电可擦除可编程只读存储器,如 AT24C02,容量 2048bit(256 字节)。
(4)NOR Flash 与 NAND Flash
- NOR Flash:任何一个字节都可以被寻址,带有地址总线和数据总线。
- NAND Flash:块设备数据,以 512 字节为一块进行读写。
(5)EMMC
EMMC 嵌入式多媒体存储卡,如 8GB 容量。
4. 程序的汇编与链接
(1)预处理
处理头文件、宏、条件编译,删除注释,展开宏,生成预处理后的 C 文本文件
gcc -E main.c -o main.i
(2)编译
把预处理后的.i文件,翻译成汇编代码(.s,汇编语言文本),做语法检查、优化
gcc -S main.i -o main.s
(3)汇编
将汇编.s文件翻译成机器码目标文件(.o,二进制目标文件,不可直接运行,缺少符号地址)
gcc -c main.s -o main.o
(4)链接
把多个.o目标文件 + 系统库(libc)合并,解析符号、重定位地址,生成可执行程序a.out
gcc main.o -o a.out
5. 内存大小端存储
- 内存大端:高地址存放低数据位,低地址存放高数据位。
- 内存小端:高地址存放高数据位,低地址存放低数据位。
ARM 处理器默认采用小端存储。
6. 中断向量表与异常向量表
- 中断向量表:本质是一个数组,数组中存放的是中断服务函数的入口地址。
- 异常向量表:本质是一个数组,数组中存放的是跳转到异常服务函数的指令。
7. 移位运算
(1)逻辑右移(LSR)
最高位补 0,不考虑数值的符号位(无符号数)。
例如:1011 0010 逻辑右移 1 位得到 0101 1001。
(2)算术右移(ASR)
最高位补符号位,考虑数值的符号位(有符号数)。
例如:1011 0010 算术右移 1 位得到 1101 1001。
(3)循环右移(ROR)
循环将每次移出的最低位补到最高位。
例如:1011 0010 循环右移 1 位得到 0101 1001,再循环右移 1 位得到 1010 1100。
8. 常见芯片内核对应关系
| 芯片 | 内核版本 | 汇编指令集版本 |
|---|---|---|
| IMX6ULL | Cortex-A7 | ARMv7 |
| S3C2440 | ARM920T | ARMv4 |
| Exynos 4412 | Cortex-A8 | ARMv8 |