ARM内核与寄存器
ARM内核与寄存器详解
目录
- ARM架构概述
- ARM处理器模式
- Cortex-M3内核的处理器模式
- Cortex-A系列处理器模式
- ARM寄存器集
- 通用寄存器
- 程序计数器(PC)
- 链接寄存器(LR)
- 堆栈指针(SP)
- 状态寄存器(CPSR/SPSR)
- 协处理器寄存器
- NEON和VFP寄存器
- 寄存器使用规范
- 常见ARM指令与寄存器操作
ARM架构概述
ARM(Advanced RISC Microprocessor)是一种RISC(精简指令集计算机)处理器架构,最初由Acorn计算机公司设计,现在由ARM公司开发和授权。由于其低功耗和高性能特性,ARM处理器广泛应用于移动设备、嵌入式系统和物联网设备。
ARM架构已经发展了多个版本,从ARMv1到最新的ARMv9,不同版本引入了不同的功能和改进。主要的架构系列包括:
- Cortex-A系列:应用处理器,用于高性能系统
- Cortex-R系列:实时处理器,用于需要快速响应的系统
- Cortex-M系列:微控制器,用于低功耗嵌入式设备
ARM处理器模式
ARM处理器有多种操作模式,每种模式有不同的寄存器可见性和权限级别:
| 模式 | 描述 | 进入方式 |
|---|---|---|
| 用户模式 | 普通程序执行 | 程序正常运行 |
| 系统模式 | 特权操作系统任务 | 软件切换 |
| 管理模式 | 系统保护模式 | 软件中断 |
| 中止模式 | 处理内存访问违例 | 数据或指令预取中止 |
| 未定义模式 | 处理未定义指令 | 遇到未定义指令 |
| 快速中断模式 | 高优先级中断处理 | FIQ中断 |
| 中断模式 | 中断处理 | IRQ中断 |
Cortex-M3内核的处理器模式
注意:Cortex-M3内核采用了简化的处理器模式系统,与传统ARM架构不同。Cortex-M3主要有两种运行模式:
- 线程模式(Thread Mode) - 用于运行应用程序代码
- 处理器模式(Handler Mode) - 用于处理所有异常
Cortex-M3还引入了特权级别的概念:
- 特权访问 - 可访问所有系统资源
- 非特权访问 - 受限制的资源访问
以下是Cortex-M3中不同情况的模式对应关系:
| 传统ARM模式 | Cortex-M3对应情况 | 实际例子 |
|---|---|---|
| 用户模式 | 线程模式(非特权) | 运行普通应用程序代码,如循环计算任务 |
| 系统模式 | 线程模式(特权) | 操作系统执行特权操作,如初始化外设、配置MPU |
| 管理模式 | 通过SVC异常进入Handler模式 | 应用程序调用SVC指令请求操作系统服务,如SVC #0切换任务 |
| 中止模式 | MemManage异常进入Handler模式 | 程序访问MPU禁止的内存区域;设置了只读区域但尝试写入 |
| 未定义模式 | UsageFault异常进入Handler模式 | 执行了未支持的浮点指令;除零操作;未对齐的内存访问 |
| 快速中断模式 | 没有直接对应,所有中断进入Handler模式 | EXTI外部中断;高优先级的ADC转换完成中断 |
| 中断模式 | 没有直接对应,所有中断进入Handler模式 | UART接收完成中断;SysTick系统定时器中断 |
Cortex-M3异常处理示例:
-
硬故障(HardFault)例子:
- 程序尝试执行未映射内存区域的代码
- 访问了未对齐的内存地址
- 在中断处理过程中出现嵌套错误
-
SVC(管理模式)例子:
// 通过SVC调用请求操作系统服务 __asm("SVC #42"); // 调用42号系统服务,例如RTOS切换任务 -
BusFault例子:
// 访问无效的外设地址 volatile uint32_t *ptr = (uint32_t *)0x60000000; // 假设这是无效总线地址 *ptr = 0x1234; // 触发BusFault异常 -
使用故障例子:
// 未对齐的访问(如果启用了对齐检查) volatile uint32_t *ptr = (uint32_t *)0x20000001; // 非4字节对齐地址 *ptr = 0x1234; // 触发UsageFault异常
Cortex-A系列处理器模式
Cortex-A系列处理器保留了传统ARM架构的7种处理器模式,并增加了安全扩展和虚拟化扩展模式。以下是Cortex-A核在不同情况下的模式例子:
| 模式 | Cortex-A对应情况 | 实际例子 |
|---|---|---|
| 用户模式 | 低特权应用程序 | 手机上运行的普通APP;Linux用户空间程序 |
| 系统模式 | 高特权操作系统代码 | 操作系统内核执行特权任务;驱动程序操作硬件 |
| 管理模式 | 系统调用处理 | 应用程序通过SWI/SVC请求系统服务;Android的Binder调用 |
| 中止模式 | 内存访问违例处理 | 程序访问受MMU保护的内存区域;Linux中的段错误(SIGSEGV) |
| 未定义模式 | 处理未识别指令 | 程序执行平台不支持的指令;尝试执行NEON指令但硬件不支持 |
| 快速中断模式 | 高优先级外设中断 | DMA传输完成;高速存储器控制器中断;显示刷新中断 |
| 中断模式 | 普通外设中断处理 | 触摸屏输入;按键中断;传感器数据就绪中断 |
| 监视模式 | TrustZone安全世界 | 安全认证;指纹处理;支付系统隔离 |
| 虚拟机模式 | 虚拟化支持(ARMv7-A) | 虚拟机管理程序;Docker容器环境切换 |
Cortex-A与Cortex-M主要区别:
-
处理器模式实现:
- Cortex-A: 完整的7种模式+扩展模式,通过CPSR控制
- Cortex-M: 简化为线程模式和处理器模式两种,通过异常入口管理
-
特权级别:
- Cortex-A: 通过处理器模式区分特权
- Cortex-M: 明确的特权/非特权状态区分
-
异常处理:
- Cortex-A: 使用向量表+模式切换
- Cortex-M: 统一的异常机制,自动保存/恢复上下文
Cortex-A异常处理示例:
// Cortex-A中的异常向量表设置
// 通常在汇编启动文件中定义
void vectors(void) __attribute__((section("vectors")));
void vectors(void) {asm("b reset_handler"); // 复位处理asm("b undefined_handler"); // 未定义指令asm("b svc_handler"); // 软件中断(SVC)asm("b prefetch_handler"); // 取指中止asm("b data_handler"); // 数据中止asm("b unused_handler"); // 未使用asm("b irq_handler"); // 中断asm("b fiq_handler"); // 快速中断
}// SVC示例 - Linux系统调用
int main() {int result;// 调用write系统调用(4号)asm("mov r0, #1"); // 文件描述符1(stdout)asm("ldr r1, =message"); // 消息缓冲区asm("mov r2, #13"); // 消息长度asm("mov r7, #4"); // write系统调用号asm("swi #0"); // 执行系统调用asm("mov %0, r0" : "=r" (result));return 0;
}
ARM寄存器集
通用寄存器
ARM架构提供16个32位通用寄存器(R0-R15),其中R13-R15有特殊用途:
| 寄存器 | 别名 | 描述 | 使用约定 |
|---|---|---|---|
| R0 | - | 通用寄存器 | 第一个函数参数,函数返回值 |
| R1-R3 | - | 通用寄存器 | 函数参数 |
| R4-R11 | - | 通用寄存器 | 需在函数调用间保存 |
| R12 | IP | 程序内部暂存寄存器 | 过程调用中临时使用 |
| R13 | SP | 堆栈指针 | 指向当前堆栈顶部 |
| R14 | LR | 链接寄存器 | 保存子程序返回地址 |
| R15 | PC | 程序计数器 | 指向当前执行指令 |
程序计数器(PC)
PC寄存器(R15)保存当前执行指令的地址。在ARM状态下,PC指向当前指令地址+8;在Thumb状态下,PC指向当前指令地址+4。
使用方法:
- 读取PC获得当前指令附近的地址
- 向PC写入值实现跳转
MOV R0, PC @ 获取当前PC值
MOV PC, LR @ 从子程序返回
链接寄存器(LR)
LR寄存器(R14)用于存储子程序返回地址。当执行BL(分支并链接)指令时,返回地址被自动保存到LR中。
使用方法:
- 调用子程序前保存LR(如果子程序内还会调用其他函数)
- 子程序返回时将LR的值复制到PC
PUSH {LR} @ 保存返回地址
BL subroutine @ 调用子程序
POP {PC} @ 恢复返回地址并返回
堆栈指针(SP)
SP寄存器(R13)指向当前堆栈顶部。ARM通常采用满递减(Full Descending)堆栈,即SP指向最后一个已入栈的数据项。
使用方法:
- PUSH操作前先减少SP,再存储
- POP操作先加载,再增加SP
PUSH {R0-R3} @ 将R0-R3压入堆栈
POP {R0-R3} @ 从堆栈弹出到R0-R3
状态寄存器(CPSR/SPSR)
当前程序状态寄存器(CPSR)和保存的程序状态寄存器(SPSR)包含处理器状态信息。
CPSR字段:
- 条件标志(N,Z,C,V):用于条件执行
- 控制位:处理器模式、中断禁用标志、指令集状态等
条件标志:
- N(负数):结果为负
- Z(零):结果为零
- C(进位):产生进位
- V(溢出):有符号溢出
CMP R0, R1 @ 比较R0和R1,设置条件标志
ADDPL R0, R0, #1 @ 如果结果非负(N=0)则执行加法
协处理器寄存器
ARM架构支持协处理器扩展,包括CP15系统控制协处理器。CP15寄存器控制缓存、MMU、系统控制和配置。
访问方法:
MRC p15, 0, R0, c1, c0, 0 @ 读取CP15 c1寄存器到R0
MCR p15, 0, R0, c1, c0, 0 @ 写入R0到CP15 c1寄存器
NEON和VFP寄存器
现代ARM架构包含NEON和VFP(向量浮点)扩展,提供额外的寄存器用于SIMD和浮点运算:
- 32个64位寄存器(D0-D31)
- 也可视为16个128位寄存器(Q0-Q15)
VMOV.F32 S0, #1.0 @ 加载浮点常量到S0
VADD.F32 S0, S0, S1 @ 浮点加法
VLDM R0, {D0-D3} @ 加载多个64位寄存器
寄存器使用规范
ARM架构定义了AAPCS(ARM架构过程调用标准)规范:
- R0-R3:参数传递和结果返回,调用者保存
- R4-R11:局部变量,被调用者保存
- R12(IP):内部过程调用暂存,调用者保存
- R13(SP):堆栈指针,被调用者保存
- R14(LR):链接寄存器,被调用者保存
- R15(PC):程序计数器
参数传递机制
当函数参数超过4个时,ARM采用以下策略:
- 前4个参数通过R0-R3寄存器传递
- 额外的参数通过栈传递,从右到左入栈
- 参数在栈上按照4字节对齐
- 被调用者负责从栈上获取额外参数
示例:调用有6个参数的函数func(a, b, c, d, e, f)
MOV R0, #1 @ 第一个参数 a
MOV R1, #2 @ 第二个参数 b
MOV R2, #3 @ 第三个参数 c
MOV R3, #4 @ 第四个参数 d
PUSH {R5, R6} @ 将第五和第六个参数入栈 (f先入栈,e后入栈)
MOV R5, #6 @ 第六个参数 f (先入栈)
MOV R6, #5 @ 第五个参数 e (后入栈)
PUSH {R5, R6}
BL func @ 调用函数
ADD SP, SP, #8 @ 调用完成后恢复栈(清理参数)
对于返回值:
- 32位或更小的返回值保存在R0中
- 64位返回值使用R0和R1
- 更大的结构体通过引用返回,调用者提供内存地址作为隐式第一个参数
常见ARM指令与寄存器操作
数据处理指令:
MOV R0, R1 @ R0 = R1
ADD R0, R1, R2 @ R0 = R1 + R2
SUB R0, R1, #1 @ R0 = R1 - 1
AND R0, R1, #0xFF @ R0 = R1 & 0xFF
内存访问指令:
LDR R0, [R1] @ 从R1指向的地址加载到R0
STR R0, [R1, #4] @ 存储R0到R1+4指向的地址
LDMIA R1!, {R0-R4} @ 多寄存器加载,递增后更新R1
STMDB R13!, {R0-R3} @ 多寄存器存储,递减前更新R13
分支指令:
B label @ 无条件分支
BL function @ 分支并链接(调用子程序)
BX LR @ 分支并切换状态(常用于返回)
CMP R0, #0 @ 比较R0与0
BEQ zero_label @ 相等时分支
条件执行:
ADDEQ R0, R0, R1 @ 当Z=1时执行加法
MOVNE R0, #0 @ 当Z=0时执行赋值
相关文章:
ARM内核与寄存器
ARM内核与寄存器详解 目录 ARM架构概述ARM处理器模式 Cortex-M3内核的处理器模式Cortex-A系列处理器模式 ARM寄存器集 通用寄存器程序计数器(PC)链接寄存器(LR)堆栈指针(SP)状态寄存器(CPSR/SPSR) 协处理器寄存器NEON和VFP寄存器寄存器使用规范常见ARM指令与寄存器操作 ARM架…...
Hibernate:让对象与数据库无缝对话的全自动ORM框架
一、为什么需要全自动ORM? 在手动编写SQL的时代,开发者需要在Java代码和数据库表之间来回切换: // Java对象 public class User {private Long id;private String name;// getters and setters }// SQL语句 SELECT * FROM user WHERE id ?…...
TDengine 语言连接器(C/C++)
简介 C/C 开发人员可以使用 TDengine 的客户端驱动,即 C/C 连接器(以下都用 TDengine 客户端驱动表示),开发自己的应用来连接 TDengine 集群完成数据存储、查询以及其他功能。TDengine 客户端驱动的 API 类似于 MySQL 的 C API。…...
英伟达Llama-3.1-Nemotron-Ultra-253B-v1语言模型论文快读:FFN Fusion
FFN Fusion: Rethinking Sequential Computation in Large Language Models 代表模型:Llama-3.1-Nemotron-Ultra-253B-v1 1. 摘要 本文介绍了一种名为 FFN Fusion 的架构优化技术,旨在通过识别和利用自然并行化机会来减少大型语言模型(LLM…...
云曦月末断网考核复现
Web 先看一个BUUCTF中的文件一个上传题 [BUUCTF] 2020新生赛 Upload 打开后是一个文件上传页面 随便上传一个txt一句话木马后出现js弹窗,提示只能上传图片格式文件 说明有前端验证。我的做法是把一句话改为.jpg格式, 然后上传 访问发现虽然上传成功了…...
Flutter常用组件实践
Flutter常用组件实践 1、MaterialApp 和 Center(组件居中)2、Scaffold3、Container(容器)4、BoxDecoration(装饰器)5、Column(纵向布局)及Icon(图标)6、Column/Row(横向/横向布局)+CloseButton/BackButton/IconButton(简单按钮)7、Expanded和Flexible8、Stack和Po…...
MySQL MVCC 机制详解
MySQL MVCC 机制详解 1. MVCC 基本概念 MVCC 是一种并发控制的方法,主要用于数据库管理系统,允许多个事务同时读取数据库中的同一个数据项,而不需要加锁,从而提高了数据库的并发性能。 ┌──────────────────…...
【面试】封装、继承、多态的具象示例 模板编程的理解与应用场景 链表适用的场景
文章目录 C面试:封装、继承、多态的具象示例1. 封装 (Encapsulation)2. 继承 (Inheritance)3. 多态 (Polymorphism)综合示例:封装、继承、多态 C模板编程的理解与应用场景我对模板编程的理解C中最常用的模板编程场景1. STL (标准模板库)2. 通用容器实现3…...
0.机器学习基础
0.人工智能概述: (1)必备三要素: 数据算法计算力 CPU、GPU、TPUGPU和CPU对比: GPU主要适合计算密集型任务;CPU主要适合I/O密集型任务; 【笔试问题】什么类型程序适合在GPU上运行࿱…...
系统与网络安全------网络通信原理(4)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 网络层解析 IP 网络层概述 位于OSI模型第三层作用 定义网络设备的逻辑地址,俗称网络层地址(如IP地址) 在不同的网段之间选择最佳数据转发路径 协议 IP协议 IP数据包…...
Java基础 4.12
1.方法的重载(OverLoad) 基本介绍 Java中允许同一个类,多个同名方法的存在,但要求形参列表不一致! 如 System.out.println(); out是PrintStream类型 重载的好处 减轻了起名的麻烦减轻了记名的麻烦 2.重载的快速入…...
XILINX DDR3专题---(1)IP核时钟框架介绍
1.什么是Reference Clock,这个时钟一定是200MHz吗? 2.为什么APP_DATA是128bit,怎么算出来的? 3.APP :MEM的比值一定是1:4吗? 4.NO BUFFER是什么意思? 5.什么情况下Reference Clock的时钟源可…...
clickhouse注入手法总结
clickhouse 遇到一题clickhouse注入相关的,没有见过,于是来学习clickhouse的使用,并总结相关注入手法。 环境搭建 直接在docker运行 docker pull clickhouse/clickhouse-server docker run -d --name some-clickhouse-server --ulimit n…...
React 组件样式
在这里插入图片描述 分为行内和css文件控制 行内 通过CSS中类名文件控制...
利用 pyecharts 实现地图的数据可视化——第七次人口普查数据的2d、3d展示(关键词:2d 、3d 、map、 geo、涟漪点)
参考文档:链接: link_pyecharts 官方文档 1、map() 传入省份全称,date_pair 是列表套列表 [ [ ],[ ] … ] 2、geo() 传入省份简称,date_pair 是列表套元组 [ ( ),( ) … ] 1、准备数据 population_data:简称经纬度 population_da…...
解决 Elasticsearch 分页查询性能瓶颈——从10分钟到秒级的优化实践
大家好,我是铭毅天下,一名专注于 Elasticsearch (以下简称ES)技术栈的技术爱好者。 今天我们来聊聊球友提出的一个实际问题: ES分页查询性能很差,使用from/size方式检索居然需要10分钟! 这是一个…...
记录IBM服务器检测到备份GPT损坏警告排查解决过程
服务器设备:IBM x3550 M4 Server IMM默认IP地址:192.168.70.125 用户名:USERID 密码:PASSW0RD(注意是零0) 操作系统:Windows Hyper-V Server 2016 IMM Web System Status Warning࿱…...
毫米波测试套装速递!高效赋能5G/6G、新材料及智能超表面(RIS)研发
德思特(Tesight)作为全球领先的测试测量解决方案提供商,始终致力于为前沿技术研发提供高精度、高效率的测试工具。 针对毫米波技术在高频通信、智能超表面(RIS)、新材料等领域的快速应用需求,我们推出毫米…...
Linux中卸载宝塔面板
输入命令 wget http://download.bt.cn/install/bt-uninstall.sh 执行脚本命令 sh bt-uninstall.sh 根据自己的情况选择1还是2 卸载完成校验 bt 这样我们的宝塔面板就卸载完了...
无人机的振动与噪声控制技术!
一、振动控制技术要点 1. 振动源分析 气动振动:旋翼桨叶涡脱落(如叶尖涡干涉)、动态失速(Dynamic Stall)引发的周期性气动激振力(频率与转速相关)。 机械振动:电机偏心、传动轴不…...
Linux(CentOS10) gcc编译
本例子摘自《鸟哥的linux私房菜-基础学习第四版》 21.3 用make进行宏编译 书中的代码在本机器(版本见下)编译出错,改正代码后发布此文章: #kernel version: rootlocalhost:~/testmake# uname -a Linux localhost 6.12.0-65.el10.x86_64 #1…...
【蓝桥杯】第十六届蓝桥杯 JAVA B组记录
试题 A: 逃离高塔 很简单,签到题,但是需要注意精度,用int会有溢出风险 答案:202 package lanqiao.t1;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWrit…...
OSPF的接口网络类型【复习篇】
OSPF在不同网络环境下默认的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的网络类型网络类型OSPF接口的网络类型(工作方式)计时器BMA(以太网)broadcast ,需要DR/BDR的选举hello:10s…...
微信小程序运行机制详解
微信小程序运行机制详解 微信小程序是介于 Web 和原生 App 之间的一种应用形态,具有无需安装、用完即走、体验流畅的特点。本文将从架构层面、运行环境、通信机制等方面深入剖析微信小程序的运行机制。 一、小程序运行架构概览 微信小程序采用双线程模型ÿ…...
python+requests接口自动化测试框架实例教程
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行…...
2021第十二届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 1、空间-(题解)-字节单位转换 2、卡片-(题解)-可以不用当组合来写,思维题 3、直…...
spark课后总结
Spark运行架构 : 运行架构 Spark 采用master - slave(主从)结构。Driver 相当于master,负责管理集群中的作业任务调度;Executor 相当于slave,负责实际执行任务 核心组件 Driver:是Spark驱动…...
智能资源管理机制-重传机制
一、发送端资源管理的核心机制 1. 滑动窗口(Sliding Window) 这是TCP协议的核心优化设计: 窗口动态滑动:发送端不需要保留所有已发送的分组,只需维护一个"发送窗口"窗口大小:由接收方通告的接…...
设计模式 --- 原型模式
原型模式是创建型模式的一种,是在一个原型的基础上,建立一致的复制对象的方式。这个原型通常是我们在应用程序生命周期中需要创建多次的一个典型对象。为了避免初始化新对象潜在的性能开销,我们可以使用原型模式来建立一个非常类似于复印机的…...
基于SiamFC的红外目标跟踪
基于SiamFC的红外目标跟踪 1,背景与原理2,SiamFC跟踪方法概述2.1 核心思想2.2 算法优势3,基于SiamFC的红外跟踪代码详解3.1 网络定义与交叉相关模块3.2 SiamFC 跟踪器实现3.3 主程序:利用 OpenCV 实现视频跟踪4,总结与展望在红外监控、无人机防御以及低光照场景中,红外图…...
