一.计算机的指令集

指令集的定义

指令集(Instruction Set)是计算机处理器能够识别和执行的操作命令的集合,是硬件与软件之间的接口。它定义了处理器支持的基本操作,如算术运算、逻辑运算、数据移动和控制流程等。

指令集的分类

CISC(复杂指令集计算机)

CISC指令集包含大量复杂指令,单条指令可完成多步操作。典型代表是x86架构(如Intel、AMD处理器)。特点包括:

  • 指令长度可变,功能丰富。
  • 硬件复杂度高,倾向于通过指令减少程序代码量。
  • 适用于通用计算场景。
RISC(精简指令集计算机)

RISC指令集简化指令设计,每条指令执行单一操作,强调通过组合简单指令实现复杂功能。典型代表是ARM、MIPS和RISC-V架构。特点包括:

  • 指令长度固定,执行效率高。
  • 硬件设计简单,依赖编译器优化。
  • 适用于嵌入式系统和高能效场景。

指令集的组成

  1. 算术/逻辑指令:如加法(ADD)、减法(SUB)、逻辑与(AND)。
  2. 数据移动指令:如加载(LOAD)、存储(STORE)。
  3. 控制指令:如跳转(JUMP)、调用(CALL)。
  4. 浮点运算指令:处理浮点数运算(如FADD)。
  5. SIMD指令:单指令多数据流(如SSE、AVX)。

指令格式

典型指令包含以下字段:

  • 操作码(Opcode):指定操作类型(如ADD)。
  • 操作数(Operand):指定数据来源(寄存器或内存地址)。
  • 寻址模式:决定操作数的获取方式(如立即数、间接寻址)。

二.Cortex-A7 内核中的寄存器体系

(1)通用寄存器 (General-Purpose Registers, GPRs)
R0–R12
一共 13 个通用寄存器,用来存储数据、中间结果、函数参数等。
在 ARM 的过程调用标准 (AAPCS) 里,
R0–R3 常用作函数参数和返回值寄存器
R4–R11 常用作被调用者保存寄存器(callee-saved)
R12 (IP) 常作为临时寄存器或内部过程调用寄存器
 
(2)栈指针 (Stack Pointer, SP)
R13
指向当前栈顶,用于存放局部变量、保存现场(函数调用时寄存器的备份)等。
在不同的 CPU 模式下可能有不同的 SP 副本(例如 Supervisor 模式、IRQ 模式有自己独立的 SP)。
 
(3)链接寄存器 (Link Register, LR)
R14
在执行 BL(Branch with Link)指令时,CPU 会把返回地址保存到 LR 里。
函数调用结束时,通常通过 MOV PC, LR 或 BX LR 返回调用点。
 
(4)程序计数器 (Program Counter, PC)
R15
保存当前指令的地址,ARM 采用流水线,因此读取 PC 的值时通常比实际执行位置超前几条指令(32bit +4)。
 
(5)程序状态寄存器 (Program Status Registers)
Cortex-A7 属于 ARMv7-A,支持以下状态寄存器:
CPSR(Current Program Status Register)当前程序状态寄存器
保存标志位(条件标志 N/Z/C/V)、中断屏蔽位、处理器模式(如 User、FIQ、IRQ、Supervisor 等)。
SPSR(Saved Program Status Register)保存的程序状态寄存器
在异常发生时,CPSR 会被保存到相应模式下的 SPSR,便于异常处理完毕后恢复。
 
(6)浮点与 SIMD 寄存器
Cortex-A7 支持 VFPv4 + NEON:
32 个 64 位 NEON/VFP 寄存器(D0–D31)
可被当作 64 位寄存器 D0–D31 使用
或者拆分为 32 位寄存器 S0–S31 使用
支持单精度和双精度浮点计算,加速多媒体、信号处理、矩阵运算等。
 
(7)MMU (Memory Management Unit, 内存管理单元)
MMU 的主要功能是:
①虚拟地址 → 物理地址转换
Cortex-A7 采用虚拟内存机制,应用程序看到的是虚拟地址(VA),MMU 负责将其映射到实际物理内存地址(PA)。这样多个应用可以运行在各自的独立虚拟空间里,互不干扰。
②页表机制 (Page Table)
ARMv7-A 的 MMU 使用多级页表(一级、二级),支持 4KB/64KB/1MB/16MB 等不同大小的页/段映射。页表中不仅保存地址映射,还包括访问权限、缓存策略等。
③内存保护
防止用户程序访问内核空间
防止越界访问或恶意代码覆盖关键内存
④内存区域属性配置
是否可缓存(Cacheable / Non-Cacheable)
是否可缓冲(Bufferable)
内存访问顺序(Strongly-Ordered, Device, Normal memory)
总结:MMU = 地址转换器 + 安全保护器 + 内存属性控制器。
 
(8)Cache (高速缓存)
Cortex-A7 通常配置:
L1 Cache
指令 Cache (I-Cache):8KB–32KB
数据 Cache (D-Cache):8KB–32KB
可选 L2 Cache(最多 1MB,外接 L2 控制器)
Cache 的作用:
①减少访存延迟
CPU 速度远快于 DRAM,Cache 作为中间层存储热点数据。
②Cache 一致性
Cortex-A7 支持多核一致性(SMP,Symmetric Multi-Processing),各核 Cache 通过 snoop 协议保持数据同步。
③Cache 策略
写直达 (Write-through)
写回 (Write-back)
根据页表配置,某些内存区域可设为不可缓存(如 I/O 映射寄存器)。
总结:Cache = 提速器,把常用数据放在离 CPU 最近的地方。
 
(9)内存访问权限 (Memory Access Permissions)
Cortex-A7 的内存访问权限由 MMU + 状态寄存器 (CPSR) 一起控制:
①特权级 (Privilege Levels)
用户模式 (User):只能访问用户空间
系统/管理模式 (Supervisor/System):可以访问所有空间
还有 IRQ、FIQ、Abort、Undefined 等异常模式,各自有独立栈
②访问权限位 (AP bits, Access Permission bits)
在页表项中设置,决定了谁能访问该内存:
仅特权模式可读写
用户模式可读、不可写
全部可读写
不可访问
域 (Domain)(在早期 ARM 架构里较常用)
将内存划分为 16 个域,每个域有不同的访问控制策略。
执行权限 (XN bit, eXecute-Never)
可以禁止某些内存区域执行代码(防止堆栈溢出攻击、缓冲区注入攻击)。
总结:访问权限保证了系统安全性。
 
(10)ALU(算术逻辑单元, Arithmetic Logic Unit)
①ALU 的定义
ALU 是 CPU 内部最基础的运算部件,负责执行算术运算和逻辑运算。可以理解为:寄存器里拿到数据 → ALU 做计算 → 把结果写回寄存器。
②ALU 的主要功能
算术运算:加、减、乘、除
逻辑运算:与(AND)、或(OR)、异或(XOR)、非(NOT)
移位/旋转:把二进制数左移、右移
比较:判断两个数是否相等、大于、小于
③ALU 与状态寄存器 (CPSR)
运算完成后,ALU 会更新一些标志位:
Z(Zero):结果是不是 0
N(Negative):结果是否为负
C(Carry):是否有进位/借位
V(Overflow):是否溢出
这些标志位会被条件跳转等指令使用。
总结:ALU 就是 CPU 的运算器,负责所有加减逻辑和比较操作,是程序运行的核心计算部件。
 
总结:
Cortex-A7 内核的寄存器体系由 16 个核心寄存器 (R0–R15) + 程序状态寄存(CPSR/SPSR) + NEON/VFP 寄存器 + 系统控制寄存器 组成。
其中 R0–R12 是通用寄存器,R13 (SP)、R14 (LR)、R15 (PC) 有特殊用途,CPSR/SPSR 控制 CPU 状态。

三.工作模式

(1)ARM9的工作模式
ARM9属于ARMv4T/ARMv5TE架构,支持7种工作模式(ARM传统模式)。
 
- User(usr):普通用户模式,运行应用程序,权限最低。
- FIQ(fiq):快速中断模式,用于处理高速数据传输或通道处理,提供额外的寄存器以加速处理。
- IRQ(irq):普通中断模式,用于处理中断请求。
- Supervisor(svc):管理模式,操作系统内核常用,响应软件中断(SWI)。
- Abort(abt):存储器异常模式,处理预取或数据访问异常。
- Undefined(und):未定义指令模式,处理非法或未实现的指令。
- System(sys)(ARMv4T之后新增):特权模式,和User模式的寄存器相同,但拥有特权,常用于OS运行内核代码。
ARM9工作模式总结:
- 用户态:User
- 特权态:FIQ、IRQ、SVC、ABT、UND、SYS


(2)ARM Cortex - A(ARMv7 - A/ARMv8 - A)的工作模式
ARMv7 - A延续ARM9的模式,支持9种模式:
- User(usr)
- FIQ(fiq)
- IRQ(irq)
- Supervisor(svc)
- Abort(abt)
- Undefined(und)
- System(sys)

-Cortex - A
- Monitor(mon)(新增):用于TrustZone安全扩展,在Normal World与Secure World之间切换。

四.ARM与Cortex-A寄存器组织

1.ARM9等(37个(32bit))

2.Cortex-A(40个(32bit))

五.ARM内核异常处理流程
 
(1)ARM异常的基本概念
 
- 异常(Exception):指指令执行过程中发生的特殊事件,例如中断、系统调用、内存访问错误、未定义指令等。
- 当异常发生时,CPU会自动切换模式、保存现场、跳转到异常向量入口,进而将事件交给异常处理程序处理。
 
(2)ARM发生异常时内核自动完成的工作(以AArch32/ARMv7-A为例)
 
1. 模式切换(Mode Switch):处理器从当前模式切换到与异常对应的异常模式,如IRQ异常对应切换到irq模式,FIQ异常对应切换到fiq模式,SVC异常对应切换到svc模式等。
2. 保存返回地址(LR = Link Register):将当前的下一条指令地址(PC + 偏移)保存到该异常模式下的LR(R14)中,作为异常返回时的依据。不同异常类型对应的偏移量不同:
- IRQ/FIQ、SWI/未定义指令、Prefetch Abort:LR = PC + 4
- Data Abort:LR = PC + 8
3. 保存程序状态寄存器(SPSR):把CPSR(Current Program Status Register,当前程序状态寄存器)的内容,包括条件码、中断使能标志、处理器模式等,保存到当前异常模式的SPSR(Saved Program Status Register,保存的程序状态寄存器)中。
4. 设置新的CPSR:将处理器模式切换到对应的异常模式,同时可能设置中断屏蔽位(如进入IRQ/FIQ模式时,自动屏蔽后续同类中断)。
5. 跳转到异常向量地址(Vector Table):根据异常类型,从异常向量表中取出对应的入口地址并跳转执行,异常向量表对应地址及异常类型如下:
- 0x00:Reset(复位)
- 0x04:Undefined Instruction(未定义指令)
- 0x08:Software Interrupt (SWI/SVC)(软件中断)
- 0x0C:Prefetch Abort(预取指中止)
- 0x10:Data Abort(数据中止)
- 0x14:Reserved(保留)
- 0x18:IRQ(普通中断)
- 0x1C:FIQ(快速中断)
 
(3)异常处理程序的工作
 
硬件仅完成最小化的工作,剩余工作由异常处理程序(Exception Handler)执行:
 
- 保存现场:将通用寄存器R0–R12压入栈中。
- 执行处理逻辑:根据异常的具体类型,执行对应的处理操作。
- 恢复现场:从栈中出栈,恢复之前保存的寄存器数据。
- 恢复程序执行:通过指令(如SUBS PC, LR, #偏移 或 MOVS PC, LR)从LR/SPSR中恢复程序执行,回到异常发生前的状态。


 
总结:ARM内核在异常产生时自动完成的工作
 
1. 切换到对应的异常模式。
2. 保存返回地址到该异常模式下的LR(LR_异常模式)。
3. 将CPSR保存到该异常模式下的SPSR(SPSR_异常模式)。
4. 修改CPSR,包括切换模式、屏蔽中断等。
5. 跳转到异常向量表中对应的入口地址。

六.异常向量表
 
(1)定义
 
异常向量表:是一张位于固定内存地址的小型跳转表(通常占用几十字节),用于保存各类异常处理程序入口的地址。
当ARM处理器发生异常时,硬件会自动跳转到向量表中对应的入口地址,从而启动异常处理流程。
 
(2)表项内容
 
- 每个表项对应一种异常,存放的并非“完整处理代码”,而是一条跳转指令(通常为 LDR PC, [PC, #offset] 或 B handler ),目的是跳转到真正的异常处理程序入口。
- 典型ARMv7-A(AArch32)异常向量表布局:

偏移地址 异常类型 描述 备注
0x00 Reset 上电或复位 最高优先级异常
0x04 Undefined Instruction 未定义指令异常 执行非法指令时触发
0x08 SWI (SVC) 软件中断(系统调用) 主动触发的特权调用
0x0C Prefetch Abort 取指异常 指令预取失败时触发
0x10 Data Abort 数据访问异常 内存访问违规时触发
0x14 Reserved 保留 通常用于自定义扩展
0x18 IRQ 普通中断 外设中断请求
0x1C FIQ 快速中断 低延迟中断(抢占IRQ)

(3)异常向量表的作用
 
1. 映射异常与处理程序:精准关联不同类型的异常(如中断、复位、数据异常等)与对应的异常处理程序,确保异常发生时能找到正确的处理入口。
2. 实现快速响应:作为异常处理的固定快速入口,无需硬件复杂查找,直接跳转至表项地址,大幅减少异常响应的硬件开销。
3. 保证响应统一性:通过固定的内存入口地址(如ARMv7-A的0x00-0x1C),使所有异常都遵循“硬件跳向量表→软件分发处理”的统一流程,提升系统稳定性和可维护性。


总结
 
- 异常向量表 = “异常类型 → 异常处理入口”的映射表。
- 包含Reset、IRQ、FIQ、SVC、Abort等核心异常入口。
- 大小通常为:8个表项 × 4字节 = 32字节。

七.程序状态寄存器 (CPSR) 位域

标志位
  • N (位 31):算术运算结果为负时置 1。
  • Z (位 30):算术运算结果为零时置 1。
  • C (位 29):算术运算产生进位或借位时置 1。
  • V (位 28):算术运算结果溢出时置 1。
扩展功能位
  • Q (位 27):饱和运算标志,仅 ARMv5TE-J 及以上架构支持。
  • J (位 26):Jazelle 状态位,用于 Java 字节码执行。
  • DNM (位 25):保留位,禁止修改。
SIMD 与条件执行
  • GE[3:0] (位 24–21):SIMD 指令的“大于等于”比较结果标志。
  • IT[7:2] (位 20–16):Thumb 指令条件执行状态(IF-THEN 块)。
系统控制位
  • E (位 15):端序控制(0=小端,1=大端)。
  • A (位 14):禁止非精确数据异常(imprecise data abort)。
  • I (位 13):IRQ 中断禁止(1=禁止)。
  • F (位 12):FIQ 中断禁止(1=禁止)。
  • T (位 11):指令集状态(0=ARM,1=Thumb/ThumbEE)。
处理器模式位 (M[4:0])
  • 10000:User 模式
  • 10001:FIQ 模式
  • 10010:IRQ 模式
  • 10011:SVC (Supervisor) 模式
  • 10110:Monitor 模式(TrustZone)
  • 10111:Abort 模式
  • 11011:Undefined 模式
  • 11111:System 模式

处理器模式编码表

M[4:0] 模式名称
10000 User
10001 FIQ
10010 IRQ
10011 SVC (Supervisor)
10110 Monitor
10111 Abort
11011 Undefined
11111 System
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐