ARM裸机开发Day01|Cortex‑A7核心概念整理
前言
最近在学习 ARM Cortex‑A7 裸机开发,第一天接触大量架构名词:寄存器、异常向量表、MMU、Cache、NOR/NAND Flash。
1. ARM 处理器工作模式有几种?
Cortex‑A7 (ARMv7‑A 架构) 一共9 种工作模式:
-
USR 用户模式:非特权模式,普通应用程序运行模式,不能直接访问硬件资源
-
SVC 管理模式:特权模式,复位、系统调用进入,操作系统内核常用
-
FIQ 快速中断模式:高速中断处理,拥有独立备份寄存器,中断响应更快
-
IRQ 普通中断模式:处理普通外设中断
-
ABT 中止模式:内存访问出错(预取 / 数据访问异常)进入
-
UND 未定义指令模式:执行非法、未识别指令进入
-
SYS 系统模式:特权模式,和用户模式共用寄存器,运行操作系统特权任务
-
MON 监控模式:安全扩展 TrustZone 使用
-
HYP 超级监视模式:虚拟化扩展,用于虚拟机
只有 USR 是非特权模式,其余 8 种全部为特权模式,可以访问全部硬件资源。模式切换可以通过异常、软件指令完成,用户模式不能直接切换特权模式。
2. Cortex‑A7 内核有多少个寄存器?
Cortex‑A7 内核总共有 37 个 32 位寄存器:
-
31 个通用寄存器(含分组 banked 寄存器,不同模式下部分寄存器是独有的)
-
6 个状态寄存器:1 个 CPSR,5 个 SPSR(每种异常模式对应一份 SPSR,用户 / 系统模式没有 SPSR)
不同工作模式下,R8‑R14 会发生寄存器分组(banked),进入对应模式访问的是该模式独有的物理寄存器。
3. Cortex‑A7 内核有多少个通用寄存器?PC、LR、SP 通用寄存器作用?
-
基础通用寄存器 R0‑R15,共16 个逻辑通用寄存器,不同模式下物理寄存器会发生切换。
|
寄存器 |
别名 |
功能说明 |
|
R0‑R12 |
通用数据寄存器 |
用来临时存放运算数据,R0‑R3 经常用于函数传参 |
|
R13 |
SP (Stack Pointer) 栈指针 |
管理栈空间;栈遵循先进后出,后进先出;出栈:从 SP 指向位置取数据,SP++,SP 永远指向栈顶位置 |
|
R14 |
LR (Link Register) 链接寄存器 |
保存函数返回地址;发生异常时保存异常返回地址 |
|
R15 |
PC (Program Counter) 程序计数器 |
程序指针,指向当前正在执行指令的下一条指令地址,修改 PC 就实现程序跳转 |
栈:ARM 栈用来保存函数局部变量、寄存器现场,SP 寄存器全程维护栈顶位置。
4. CPSR 寄存器和 SPSR 寄存器作用?
-
CPSR(Current Program Status Register 当前程序状态寄存器) 全程有效,保存 CPU 当前运行状态:
-
N/Z/C/V:运算条件标志位(负数、零、进位、溢出)
-
M [4:0]:处理器模式位,决定 CPU 处于 9 种模式的哪一种
-
I/F:中断屏蔽位,开关 IRQ、FIQ 中断
-
T/J:指令集状态位,ARM/Thumb 模式切换。
-
SPSR(Saved Program Status Register 备份程序状态寄存器)
用户模式、系统模式没有 SPSR。 当发生异常的时候,硬件自动把进入异常之前那一刻的
CPSR完整复制保存到该异常模式的 SPSR 中;异常返回时,再把 SPSR 写回 CPSR,恢复原来处理器状态。简单说:SPSR 是 CPSR 的异常快照备份。
5. 什么是 MMU?
MMU(Memory Management Unit,内存管理单元) 作用:完成虚拟地址 ↔ 物理地址转换,依靠页表完成映射;同时做内存访问权限检查、内存保护。
-
裸机开发:关闭 MMU,程序直接操作物理地址
-
Linux 操作系统 / 驱动开发:必须打开 MMU,每个进程拥有独立 4GB 虚拟地址空间。
判断芯片能不能跑完整 Linux 系统,一个关键点就是芯片内核是否带有 MMU 单元。
6. 什么是 CACHE?
Cache:高速缓存,CPU 内核和 DDR 内存之间的高速小容量存储器,速度远快于 DDR 内存。 分为:
-
I‑Cache:指令缓存,缓存常用指令
-
D‑Cache:数据缓存,缓存读写数据。
DDR 内存速度慢,CPU 频繁访问内存效率低;把经常访问指令、数据放到 Cache,CPU 直接读取 Cache,减少访问 DDR 次数,大幅提升程序运行速度。裸机开发一般打开 I‑Cache,关闭 D‑Cache。
7. 冯・诺依曼架构和哈佛架构的区别?
-
冯・诺依曼架构:指令、数据共用同一块存储空间、同一套总线。程序指令和数据放在同一个内存。Cortex‑A7 属于冯诺依曼架构(内部拥有 Cache 实现哈佛特性)。
-
哈佛架构:指令存储器、数据存储器相互独立,分开存储、分开总线;取指令和读写数据可以并行操作,常见于 Cortex‑M 单片机内核。
8. 异常处理流程?
异常包含复位、IRQ 中断、FIQ 中断、未定义指令、预取中止、数据中止等。
硬件自动完成步骤(CPU 硬件自动执行)
-
将发生异常前的
CPSR保存到对应异常模式的SPSR; -
将异常返回地址保存到异常模式的
LR链接寄存器; -
修改 CPSR 模式位,切换 CPU 进入对应异常特权模式;同时屏蔽 IRQ/FIQ 中断;
-
强制 PC 跳转到异常向量表对应的偏移地址,向量表里存放跳转指令,跳转到异常服务函数。
软件异常处理程序要做的事
-
保存现场:把 R0‑R12 等通用寄存器压入该模式的栈(SP 指向栈);
-
执行异常服务业务逻辑;
-
恢复寄存器现场;
-
异常返回,把 SPSR 恢复回 CPSR,LR 调整后赋值给 PC 回到被打断的代码继续运行。
异常向量表本质是数组,数组存放跳转到异常服务函数的指令。中断向量表存放中断服务函数入口地址。
9. IMX6ULL 芯片所搭载的内核版本?
NXP i.MX6ULL 芯片搭载 单核 ARM Cortex‑A7 内核,最高主频可达 900Mhz,带 MMU,支持 Linux 系统运行。
10. Cortex‑A7 使用的汇编指令集版本?
Cortex‑A7 属于 ARMv7‑A 指令集架构版本,支持 ARM32 指令集 + Thumb‑2 压缩指令集。
注意区分:内核名字 Cortex‑A7,指令集版本 ARMv7‑A;Cortex‑A53 是 ARMv8‑A。
11. nor flash 和 nand flash 区别?
|
对比项 |
NOR Flash |
NAND Flash |
|
寻址方式 |
字节寻址,每个字节都可以独立访问,带有地址、数据总线 |
块设备,以页 (512B/2KB) 读写,以块擦除 |
|
XIP 原地执行 |
✅支持,可以直接在 Flash 上面运行程序代码 |
❌不支持,代码需要拷贝到内存运行 |
|
读速度 |
随机读取速度快 |
顺序读写快,随机读慢 |
|
擦写速度 |
擦写慢 |
擦除、写入速度快 |
|
容量 & 成本 |
容量小,单位容量成本高 |
容量大,成本低,适合大容量存储 |
|
坏块 |
几乎没有坏块 |
天生存在坏块,需要 ECC 校验、坏块管理 |
|
典型用途 |
存放 Bootloader、固件启动代码 |
存放系统镜像、大量用户数据(eMMC、U 盘) |
-
NOR Flash:适合跑启动代码;NAND Flash 适合存大量数据
-
易失存储器:断电数据丢失,例如 DDR 内存;Flash 是非易失,断电数据保留。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)