ARM内核与寄存器

news2025/4/15 13:28:34

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主要有两种运行模式:

  1. 线程模式(Thread Mode) - 用于运行应用程序代码
  2. 处理器模式(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异常处理示例:
  1. 硬故障(HardFault)例子

    • 程序尝试执行未映射内存区域的代码
    • 访问了未对齐的内存地址
    • 在中断处理过程中出现嵌套错误
  2. SVC(管理模式)例子

    // 通过SVC调用请求操作系统服务
    __asm("SVC #42");  // 调用42号系统服务,例如RTOS切换任务
    
  3. BusFault例子

    // 访问无效的外设地址
    volatile uint32_t *ptr = (uint32_t *)0x60000000; // 假设这是无效总线地址
    *ptr = 0x1234;  // 触发BusFault异常
    
  4. 使用故障例子

    // 未对齐的访问(如果启用了对齐检查)
    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主要区别:
  1. 处理器模式实现:

    • Cortex-A: 完整的7种模式+扩展模式,通过CPSR控制
    • Cortex-M: 简化为线程模式和处理器模式两种,通过异常入口管理
  2. 特权级别:

    • Cortex-A: 通过处理器模式区分特权
    • Cortex-M: 明确的特权/非特权状态区分
  3. 异常处理:

    • 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-通用寄存器需在函数调用间保存
R12IP程序内部暂存寄存器过程调用中临时使用
R13SP堆栈指针指向当前堆栈顶部
R14LR链接寄存器保存子程序返回地址
R15PC程序计数器指向当前执行指令

程序计数器(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时执行赋值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

英伟达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…

0.机器学习基础

0.人工智能概述: (1)必备三要素: 数据算法计算力 CPU、GPU、TPUGPU和CPU对比: GPU主要适合计算密集型任务;CPU主要适合I/O密集型任务; 【笔试问题】什么类型程序适合在GPU上运行&#xff1…

系统与网络安全------网络通信原理(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&#xff1…

毫米波测试套装速递!高效赋能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)引发的周期性气动激振力(频率与转速相关)。 机械振动:电机偏心、传动轴不…

【蓝桥杯】第十六届蓝桥杯 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…

python+requests接口自动化测试框架实例教程

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行…

2021第十二届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 1、空间-(题解)-字节单位转换 2、卡片-(题解)-可以不用当组合来写,思维题 3、直…

智能资源管理机制-重传机制

一、发送端资源管理的核心机制 1. 滑动窗口(Sliding Window) 这是TCP协议的核心优化设计: 窗口动态滑动:发送端不需要保留所有已发送的分组,只需维护一个"发送窗口"窗口大小:由接收方通告的接…