ARM-处理器模式(二)

news2025/2/23 13:04:01

文章目录

  • ARM 处理器模式
    • 工作模式
    • 模式切换
    • 内核寄存器
      • R13_mode
      • R14_mode
      • PC
    • 各个模式对应的内核寄存器
    • 模式切换代码实现
      • 使用 mrs/msr 指令
      • 使用 cps 指令

ARM 处理器模式

ARMv7-a 处理器共有 9 种工作模式

工作模式

在这里插入图片描述

  • User:用户模式,非特权模式,大部分程序运行的时候就处于此模式
  • FIQ:快速中断模式,进入 FIQ 中断异常
  • IRQ:一般中断模式,进入 IRQ 中断异常
  • Supevisor(SVC):超级管理员模式,复位或者一个 Supervisor 指令调用
  • Monitor(MON):监听模式,用户安全扩展模式
  • Abort(ABT):数据访问中止模式,用户虚拟存储及存储保护
  • Hyp(HYP):用于虚拟化扩展
  • Undef(UND):未定义的指令终止模式
  • System(SYS):系统模式,用于运行特权级的操作系统任务

从上表可以看出,系统一复位就处于 SVC 模式

模式切换

ARM 模式切换由 CPSR( Current Program Status Register) 寄存器控制

在这里插入图片描述
需要注意的是,

  • User 模式下,操作 bit[4:0],即不能切换处理器模式
  • User 模式下,不能操作 A,I 和 F 位

M[4:0] 对应的处理器模式如下表
在这里插入图片描述

内核寄存器

一共有 16 个寄存器,R[0-15]
在这里插入图片描述

  • R13 - SP(stack pointer)
  • R14 - LR(link register)
  • R15 - PC(program counter)

R13_mode

  • 在 ARM 指令集中常用作栈指针,这只是一种习惯的用法,并没有任何指令强制性的使用 R13 作为栈指针。用户也可以使用其他的寄存器作为栈指针;
  • 在 Thumb 指令集中,有一些指令强制使用 R13 作为栈指针。

除 User 和 SYS公用 SP 以外,每一种异常模式都有自己的物理 R13,使其指向该异常模式专用的栈地址。

  • 当进入异常模式时,可以将需要使用的寄存器保存在 R13 所指的栈中;
  • 当退出异常模式时,将保存在 R13 所指的栈中的寄存器值弹出。

这样就使异常处理程序不会破坏被其中断程序的运行现场。

R14_mode

寄存器 R14 又成为链接寄存器(link register)

除 User ,SYS 和 HYP 公用 LR 以外,每一种模式都有自己的物理 R14,并在其中存放当前子程序的返回地址。实现子程序的返回可以有如下两种方式

mov pc, lr
bx lr

PC

由于 ARM 采用了流水线机制,取址 -> 译码 -> 执行,所以当正确的读取了 PC 的值时,该值为当前指令地址加 8 个字节。也就是说,对于 ARM 指令集来说,PC 指向当前指令的下两条指令的地址,由于 ARM 指令时字对齐的(这也是为什么加的是 8),PC 的值第 0 为和第 1 位总为 0。

例如在下面的示例中,将 PC 的值放到 R4 寄存器中
在这里插入图片描述

  • 执行 mov r4, pc 指令的地址为 0x80000024
  • 使用 info reg 命令查看 r4 寄存器的值为 0x8000002c

各个模式对应的内核寄存器

在这里插入图片描述
浅色字体的是与 User 模式所共有的寄存器,蓝绿色背景的是各个模式所独有的寄存器

  • 在所有模式中,低寄存器组(R0-R7) 是共享同一组寄存器的
  • 一些高寄存器组在不同模式下有自己独有的寄存器,
    • FIQ 模式下访问 R12 寄存器,它实际访问的是 R12_fiq
    • SVC 模式下访问 SP 寄存器,它实际访问的是 SP_svc
  • 除 sys模式外,SP 寄存器都是独立的,所以各个模式需要切换到对应的模式,然后设置自己的栈指针
  • Hyp 模式下独有一个 ELR_hyp 寄存器。

模式切换代码实现

使用 mrs/msr 指令

  • MRS:将特殊功能寄存器 CPSR/SPSR/CP14/CP15 的值传递到通用寄存器中
  • MSR:将通用寄存器的值传递到 CPSR/SPSR/CP14/CP15 特殊功能寄存器中
  • 需要注意的是,在 User 模式下,虽然所有的位都是可读的,但是只有 F 位才能被修改,所以在 User 模式下不能进行处理器模式切换
.global _start

_start:
    /* 进入 SVC 模式(其实复位之后,系统就处于 SVC 模式,这里也可以不切换,设置 SP 的值) */
    mrs r0, cpsr
    bic r0, r0, #0x1f /* 将  r0 寄存器中的低 5 位清零,也就是 cpsr 的 M0~M4 */
    orr r0, r0, #0x13 /* r0 或上 0x13,表示使用 SVC 模式 */
    msr cpsr, r0      /* 将 r0 的数据写入到 cpsr 中 */

    ldr sp, =0X80200000	/* 设置栈指针 */

使用 cps 指令

  • CPS:Change Processor State 这个指令可以切换处理器模式,或者使能/禁止各自的异常
.global _start

.equ Mode_USR,        0x10
.equ Mode_FIQ,        0x11
.equ Mode_IRQ,        0x12
.equ Mode_SVC,        0x13
.equ Mode_MON,        0x16
.equ Mode_ABT,        0x17
.equ Mode_HYP,        0x1A
.equ Mode_UND,        0x1B
.equ Mode_SYS,        0x1F

.equ Stack_size,      0x400
.equ Stack_Start,     0x80200000

.equ Mode_USR_Stack,  Stack_Start + Stack_size
.equ Mode_FIQ_Stack,  Mode_USR_Stack + Stack_size
.equ Mode_IRQ_Stack,  Mode_FIQ_Stack + Stack_size
.equ Mode_SVC_Stack,  Mode_IRQ_Stack + Stack_size
.equ Mode_MON_Stack,  Mode_SVC_Stack + Stack_size
.equ Mode_ABT_Stack,  Mode_MON_Stack + Stack_size
.equ Mode_HYP_Stack,  Mode_ABT_Stack + Stack_size
.equ Mode_UND_Stack,  Mode_HYP_Stack + Stack_size
.equ Mode_SYS_Stack,  Mode_UND_Stack + Stack_size

_start:
    cps     #Mode_FIQ
    ldr     sp, =Mode_FIQ_Stack

    cps     #Mode_IRQ
    ldr     sp, =Mode_IRQ_Stack

    cps     #Mode_SVC
    ldr     sp, =Mode_SVC_Stack

    cps     #Mode_MON
    ldr     sp, =Mode_MON_Stack

    cps     #Mode_ABT
    ldr     sp, =Mode_ABT_Stack

    cps     #Mode_HYP
    ldr     sp, =Mode_HYP_Stack

    cps     #Mode_UND
    ldr     sp, =Mode_UND_Stack

    /* sys mode and user have common sp register */
    @cps     #Mode_SYS
    @ldr     sp, =Mode_SYS_Stack

    /* last enter user mode, and user manipulate cpsr except for F bit */
    cps     #Mode_USR
    ldr     sp, =Mode_USR_Stack

    /* switch fail cpu run in user mode */
    cps     #Mode_SVC

    ldr r0, =0x01
    ldr r1, =0x02
    ldr r2, =0x03
    ldr r3, =0x04
    ldr lr, =0x05

    push {r0-r3, lr}
    /* nop for debug */
    nop
    nop
    nop

    mov r0, #0
    mov r1, #0
    mov r2, #0
    mov r3, #0
    mov lr, #0
    /* nop for debug */
    nop
    nop
    nop

    pop {r0-r3, lr}
    /* nop for debug */
    nop
    nop
    nop

    stmfd sp!, {r0-r3, lr}
    /* nop for debug */
    nop
    nop
    nop

    mov r0, #0
    mov r1, #0
    mov r2, #0
    mov r3, #0
    mov lr, #0
    /* nop for debug */
    nop
    nop
    nop

    ldmfd sp!, {r0-r3, lr}
    /* nop for debug */
    nop
    nop
    nop

loop:
    b loop

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

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

相关文章

如果你想申请国家级高新技术企业

你必须首先满足国家支持的八大高新技术领域: 一、电子信息 二、生物学与新医学 三、航空航天 四、新材料 五、高科技服务业 六、新能源与节能 七。资源与环境 八、先进制造和自动化 如果您满足这八个领域中的一个,您就有资格申请高新技术企业。 …

有了 IP 地址,为什么还要用 MAC 地址?

MAC地址等价于快递包裹上的收件人姓名。 MAC地址更多是用于确认对方信息而存在的。就如同快递跨越几个城市来到你面前,快递员需要和你确认一下收件人是否正确,才会把包裹交给你一样。 IP66在线查IP地址位置:https://www.ip66.net/?utm-sour…

Bean基础配置?实例化方式?生命周期?

文章目录 1 bean基础配置1.1 bean基础配置(id与class) 1 bean基础配置1.1 bean基础配置(id与class)1.2 bean的name属性1.2 bean的name属性步骤1:配置别名步骤2: 根据名称容器中获取bean对象步骤3: 运行程序 1.3 bean作用范围scope配置(单例/非单例)1.3.1 验证IOC容器…

案例8:Java交易商城网站设计与实现开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

如何判断自己是否适合做项目管理?

如何转做项目管理?如何判断自己是否适合做项目管理?我们可以从项目管理的思维、能力、工具、书籍阅读四个方面入手—— 1.项目管理的思维 (1)系统思考 项目管理需要从一个系统的角度来看待问题,将复杂的项目分解为小…

CAD功能库CAD DLL v15 2023最新上线!改进3D格式文件

CAD DLL是一个为开发者打造的新版本CAD库,可在支持动态链接库技术的语言中添加CAD功能到应用程序中。 很高兴与大家分享,CAD Dll迎来了久违的更新,更新至v15,3D改进,还改进了 DWG 和 DXF 格式的导入,除此之…

商场地图怎么画最简单?商场导视图怎么做?

商场购物中心超大的经营规模能为广大顾客提供购物选择的同时,也面临着许多问题:购物体验差,顾客到店率低。以及数据缺失,无法为商家做营销决策提供依据等等,那么,如何快速提升商场店铺运营效果,…

指定日本|在读博士生获CSC资助赴日本全球环境战略研究所联合培养

R同学的学术背景较弱,虽参与过导师的项目,但自己没有相关文章发表。拟申请CSC联培项目,研究方向为农业经济可持续发展,指定日本并希望合作导师的研究与此相关联。最终我们用日本全球环境战略研究所(IGES)的…

关于多维图形在2D平面投影的个人理解

网上有很多关于多维空间的描述,这里分享一下我的个人理解 假设在二维空间中有两个图形,三角形、四边形,画面如下 以如下规律在三维空间展开 对于三角形,在三维空间中添加一点,和其连接,使得每个面都为三角…

盘点国产BI软件中,那些电商数据分析功能

老牌国产BI软件基本都是适用于所有行业,会为各行各业的提供智能数据可视化分析功能板块,那么,老牌国产BI软件之一的奥威BI软件又为电商数据分析提供了哪些功能板块,效果怎样? 1、提供标准化跨境电商分析方案 这套跨境…

高通Android 11 audio:音频服务创建以及播放的流程

1、音频服务初始化流程 当前版本:高通 Android 11 大致的创建流程如下: 经过上面的流程系统音频服务已经启动处于待命状态,如果有应用需要播放则会通过服务最终选择合适的硬件将声音播出,接下来按照上面的流程进行进一步的细分。 1.1 开机启动音频服务 音频服务在frame…

110. 平衡二叉树

110. 平衡二叉树 C代码:DFS int dfs (struct TreeNode* root) {if (NULL root) {return 0;}int leftDepth dfs(root->left);int rightDepth dfs(root->right);if (fabs(leftDepth - rightDepth) > 1 || leftDepth -1 || rightDepth -1) {return -1;}…

云端炼丹,算力白嫖,基于云端GPU(Colab)使用So-vits库制作AI特朗普演唱《国际歌》

人工智能AI技术早已深入到人们生活的每一个角落,君不见AI孙燕姿的歌声此起彼伏,不绝于耳,但并不是每个人都拥有一块N卡,没有GPU的日子总是不好过的,但是没关系,山人有妙计,本次我们基于Google的…

程序设计进阶模拟考试选择判断

选择 1 若有以下说明和语句 int c[4][5],(p)[5]; pC; 能够正确引用c数组元素的是 A、 p 1 B、(p3) C、*(p1)3 D、 *(p[0]2) . 题意分析 1.声明了一个二维数组 c,其中有四个一维数组,每个一维数组包含五个整数。 2.在C语言中,(*p)[5] 表示一个…

加速信创生态建设布局,亿美软通实现与达梦数据、东方通兼容互认

近日,亿美软通自主研发的“亿美软通融合通信平台(EUMP)”分别与达梦数据库管理系统和东方通软件完成兼容性认证测试,并签署产品兼容互认证明。经多方测试表明,亿美软通融合通信平台与达梦数据库管理系统V8、东方通分布式数据缓存中…

GD32F303ZET6(STM32),使用外部中断,接连进入中断的问题

使用引脚 PC9,开启外部中断EXTI9_5_IRQHandler。 if(EXTI_GetITStatus(EXTI_Line9) ! RESET){//反转中断 mmmm; EXTI_ClearITPendingBit(EXTI_Line9); } 每次进外部中断,mmmm这个值有时显示正常,每点动按钮&…

使用Eclipse 进行远程 Debug 调试

Eclipse远程调试 Java自身支持调试功能,并提供了一个简单的调试工具--JDB,类似于功能强大的GDB,JDB也是一个字符界面的调试环境,并支持设置断点,支持线程线级的调试。 由于部署环境的差异性&am…

详解《基于 javascript 的流程图编辑框架LogicFlow》

1、LogicFlow 是什么 LogicFlow 是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow 支持前端研发自定义开发各种逻辑编排场景,如流程图、ER 图、BPMN 流程等。在工作审批配置、机器人逻辑编…

opencv 图像识别

opencv的目标是使计算机可以快速准确地从数字图像中提取和分析特征。它使用了许多新的算法和技术,例如改进的模板匹配、基于统计的特征分析以及深度学习等。opencv支持多种平台,包括 Windows、 MacOS、 Linux和 Android,开发者可以使用 OpenC…

Collection线程不安全的举例

目录 一、前言二、单线程环境下三、多线程环境四、解决方案方案一:Vector方案二:Collections.synchronized()方案三:采用JUC里面的方法 五、HashSet线程不安全六、HashMap线程不安全 一、前言 1、当我们执行下面语句的时候,底层进…