ARM AArch32和AArch64通用寄存器、状态寄存器

文章目录

  • ARM AArch32和AArch64通用寄存器、状态寄存器
    • 1. ARM CPU Mode
      • 1.1 ARM32 CPU Mode
      • 1.2 ARM64 CPU Mode
      • 1.3 EL、AArch32 modes 和 execution privilege 映射
    • 2. ARM32 寄存器
      • 2.1 通用寄存器
      • 2.2 状态寄存器
    • 3. ARM64寄存器
      • 3.1 通用寄存器
      • 3.2 状态寄存器

1. ARM CPU Mode

在学习ARM寄存器之前要先理解ARM CPU Mode的演变,因为逻辑寄存器通常会因为CPU Mode的不同有多个物理寄存器备份。本节以ARMv8体系结构为例,因为它包含了32位和64位的体系结构。

目标:

  1. 搞清楚ARM PL/EL的区别和联系

1.1 ARM32 CPU Mode

  • PL(Privilege Level)

    • ARMv8的PL继承自前身版本,分为PL0代表用户态和PL1代表系统态;此外,ARM将PL又划分为7种详细的Mode,其中1种(usr)属于PL0,另外6种属于PL1分别为:

      • usr:用户模式
      • fiq:处理FIQ快速中断模式
      • irq:处理IRQ中断模式
      • svc:Supervisor Mode 监视模式
      • abt:Abort Mode 所有同内存保护相关的异常均在这种模式下执行
      • und:处理无效指令的异常
      • sys:系统模式
    • 在ARMv7-A种引入了security扩展和虚拟化扩展

      • security扩展:支持可信赖的执行环境(trust execution environment, TEE)而引入。security扩展将ARM运行环境分成Secure World和Non-Secure(或Normal) World。

        为了实现这两个World的切换,在原PL基础上增加了Monitor Mode。Mon应属于Secure World的PL1

      • 虚拟化扩展:可以在一个物理硬件平台虚拟出多个虚拟化硬件平台供不同的用户使用。ARM为了支持虚拟化扩展,新增了一个PL等级PL2,并新增了Hypervisor Mode,Hyp仅存在于Non-Secure World

    • ARM32 CPU Mode

  • 在ARM32种,mode有着十分重要的作用。PL只是一个虚拟出来的概念,在体系结构中并没有明确的结果表明为何种PL级别,而是通过不同的mode来标识级别。

1.2 ARM64 CPU Mode

  • EL(Exception Level)

    • ARMv8体系结构中,统一使用EL来进行权限描述,不仅包括AArch64,还包括32位体系结构AArch32。而对于纯64位体系结构,只有EL;对于32位体系结构因为要被64位兼容,则继续保留了mode、PL和EL。

      • 如果实现的是64位体系结构,则只用EL描述,不存在mode概念
      • 32位体系结构不能跑64位程序,一个AArch64产生的Exception不可能由AArch32来处理
    • EL和PL的基础上变化,主要体现在:

      • PL0对应EL0
      • PL2对应EL2
      • 除了Secure下的Monitor外的PL1对应EL1
      • 将Secure的Monitor单独抽取谁来,对应EL3
    • 由于EL2的Hypervisor是虚拟扩展引入的,只存在于Non-Secure,所以得出EL模型如下:

    • EL只会在以下情况之一发生的时候才会发生Level Change

      • 发生异常
      • 从一个异常返回
      • 处理器重启
      • 从Debug状态返回
      • 在Debug中,执行了DCPSx指令
      • 在Debug中,执行了DRPS指令

ARM将PL和EL这两个架构统称为PE

1.3 EL、AArch32 modes 和 execution privilege 映射

Exception Level有四个等级:EL0, EL1, EL2, EL3

AArch32 modes有:User, Monitor, System, Supervisor, Abort, Undefined, IRQ和FIQ

  • 在Secure状态:

    • Monitor只在EL3执行,并且只有在EL3运行AArch32指令集时才能获得
    • System, Supervisor, Abort, Undefined, IRQ, FIQ在:
      • 当EL3运行AArch64时在EL1执行
      • 当EL3运行AArch32时在EL3运行

    总结来说:

    • 当EL3在运行AArch64时:

      • 不支持Monitor
      • 当EL1运行AArch32,那么System, Supervisor, Abort, Undefined, IRQ和FIQ运行在Secure的EL1
    • 当EL3在运行AArch32时:
      • Monitor运行在Secure的EL3
      • System, Supervisor, Abort, Undefined, IRQ和FIQ运行在Secure的EL3
      • 不支持Secure下的EL1
  • 在Non-secure状态:

    • PL1 modes:System, Supervisor, Abort, Undefined, IRQ和FIQ总是运行在EL1
    • User mode总是运行在EL0
    • Hyp mode总是运行在Non-secure的EL2

得出下图所示(copy自ARM手册)

2. ARM32 寄存器

目标:

  1. 学习ARM32通用寄存器及其不同CPU Mode下的映射关系
  2. 学习ARM32基本状态寄存器

2.1 通用寄存器

  • ARM32有16个32位通用寄存器,其中:

    • R0~R7

      • 不分组寄存器,可以在所有mode下工作,是真正意义物理上被通用的寄存器
    • R8~R14
      • 分组寄存器,用于处理当前特定的处理器mode,每种模式都有专用的分组寄存器用于快速异常处理
      • R13通常为Stack Pointer Register
      • R14通常为Link Register
    • R15
      • 用作程序计数器PC
  • ARM32 通用寄存器与物理寄存器映射表如下(copy自ARM手册)

    • 从上表得知,通用寄存器一共有34个物理寄存器

      • R0~R7共8个寄存器用于任意Mode
      • R8~R12有两组共10个寄存器:一组用于FIQ,一组用于其他Mode
      • R13共有8个物理寄存器,usr和sys共用一个,其他7个mode分别用一个
      • R14共有7个物理寄存器,usr和sys共用一个,hyp使用的寄存器是特殊寄存器ELR_hyp(不属于通用寄存器),其他6个mode分别用一个
      • R15只有一个物理寄存器
    • USR和SYS Mode共享相同的通用寄存器

2.2 状态寄存器

  • 从上面的映射表可以看出:

    • ARM32共有1个CPSR(Current Program Status Register)

      • 所有的CPU mode下都共享一个CPSR
    • 7个备用的SPSR(Saved Program Status Register)
      • usr和sys没有备份的SPSR之外,其他CPU mode都有一个自己的SPSR

3. ARM64寄存器

3.1 通用寄存器

  • ARM64通用寄存器不再像ARM32那样根据CPU mode设置相应的物理备份,而是所有EL下共享一堆通用寄存器,如下图:

  • ARM64共有31个64位通用寄存器,PC寄存器属于特殊寄存器,需要使用特殊指令进行访问

    • X0~X7

      • 参数寄存器,用作临时寄存器或可以保存的调用者保存的寄存器变量函数内的中间值
    • X8
      • 保存子程序的返回地址,尽量不要使用
    • X9~X15
      • 调用者保存的临时寄存器
      • 如果调用者使用这些寄存器,需要提前把这些寄存器的值保存在自己的堆栈中,使用结束后恢复
    • X16~X17
      • 子程序内部调用临时寄存器
    • X18
      • 平台寄存器,尽量不要使用
    • X19~X28
      • 被调用者保存的临时寄存器
      • 被调用者使用这些寄存器,也需要提前把寄存器的值保存在自己的堆栈中,使用后恢复
    • X29
      • 帧指针寄存器(FP)
    • X30
      • 连接寄存器(LR)
  • 栈指针寄存器

    • 每个实现的EL都会有专用的栈指针寄存器

      • SP_EL0
      • SP_EL1
      • 如果EL2实现了,SP_EL2
      • 如果EL3实现了,SP_EL3
  • ARM64通用寄存器可以分别当作64位和32位的寄存器使用

    • 31 64-bit 寄存器,X0-X30.
    • 31 32-bit 寄存器,W0-W30.

3.2 状态寄存器

  • ARM64使用PSTATE(Process State)来替换ARM32中的CPSR

  • ARM64一共有3个SPSR,分别为SPSR_EL1,SPSR_EL2,SPSR_EL3

ARM AArch32和AArch64通用寄存器、状态寄存器相关推荐

  1. ARM通用寄存器及状态寄存器详解

    关注.星标公众号,直达精彩内容 素材来源:https://blog.csdn.net/qq_34430371/article/details/125820927 整理:技术让梦想更伟大 | 李肖遥 笔 ...

  2. ARM状态寄存器-PSR

    ARM程序状态寄存器Program State Register CPSR SPSR 结构解析 ARM程序状态寄存器Program State Register 在ARM模式中, 有16个数据寄存器和 ...

  3. 2021-07-08操作系统知识:程序计数器(pc)、指令寄存器(IR)、通用寄存器(GR)、状态寄存器(SR)、程序状态字PSW

    操作系统知识:程序计数器(pc).指令寄存器(IR).通用寄存器(GR).状态寄存器(SR).程序状态字PSW 快乐的一只小喵喵 2019-10-28 16:43:01 14046 收藏 96 分类专 ...

  4. 操作系统知识:程序计数器(pc)、指令寄存器(IR)、通用寄存器(GR)、状态寄存器(SR)、程序状态字PSW

    程序计数器(PC,Program counter),用于存放指令的地址.为了保证程序(在操作系统中理解为进程)能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址.当执行一条指令时,首先需 ...

  5. 简单解释程序计数器、指令寄存器、通用寄存器、状态寄存器、程序状态字

    程序计数器(PC,Program counter),用于存放指令的地址.为了保证程序(在操作系统中理解为进程)能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址.当执行一条指令时,首先需 ...

  6. iOS底层(三)-状态寄存器

    003-状态寄存器    CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理器,个数和结构都可能不同).这种寄存器在ARM中,被称为状态寄存器就是CPSR(current program sta ...

  7. aarch64的TCR寄存器介绍

    文章目录 一.TCR寄存器 (1).T1SZ.T0SZ (2).ORGN1.IRGN1.ORGN0.IRGN0 (3).SH1.SH0 (4).TG0/TG1 - Granule size (5).I ...

  8. ARM处理器中CP15协处理器的寄存器1376698090

    本章和第5章的内容都与ARM处理器中CP15协处理器的寄存器有密切关系,所以我们这里先介绍一下CP15寄存器以及访问CP15寄存器的汇编指令. 4.1.1  访问CP15寄存器的指令 访问CP15寄存 ...

  9. ARM Cortex-M3与Cortex-M4中断相关寄存器

    NVIC寄存器列表 中断使能寄存器 设置中断挂起和清除中断挂起 中断活跃状态寄存器 中断优先级寄存器 软件触发中断寄存器 中断控制器类型寄存器 SCB寄存器 中断控制和状态寄存器(ICSR).向量表偏 ...

最新文章

  1. 系统定制封装 step1
  2. Redis热点Key发现及常见解决方案
  3. 解散了地图接口讨论群
  4. 容器 vector :为何要有reserve
  5. GNU make manual 翻译( 一百八十一)
  6. build FLTK 1.1.7 with gcc 2.95.3 on Fedora7
  7. 原生JS上传图片接收服务器端图片并且显示图片(主要描述blob类型)
  8. Beyond的歌里最多是唏嘘吗? - Python分词+词频
  9. 个人永久性免费-Excel催化剂功能第26波-正确的Excel密码管理之道
  10. mysql线程挣用问题_MySQL 并发线程的理解
  11. 后台拿webshell的方法总结
  12. eclipse 主题设置
  13. 计算机毕业设计springboot+vue基本微信小程序的考试系统
  14. java io 系列(转载skywang12345)
  15. css表格表头对角线,用div+css模拟类excel表格对角线(斜线)
  16. 【viper】go 配置管理神器viper使用详解
  17. lda指令是什么意思_PLC基本知识 -- 5.1 运算指令 (顺便学英文)
  18. 40.微信小程序(API--基础、路由、缓存、媒体)
  19. 基于SSM实现的物流管理系统【附源码】(毕设)
  20. 计算机控制技术课程总结

热门文章

  1. MTK平台关于Metadata当中Size的配置
  2. css文字右边加横线,CSS伪类before,after制作左右横线中间文字效果
  3. win10照片查看器_非常好用的19个Win10小技巧,学会之后事半功倍
  4. 全网最详细金融APP测试功能点-测试用例,详细整理(全)
  5. IOS FMDB 使用
  6. WLAN没有有效的IP配置,无Internet安全(开放)
  7. Zephyr 简介:用于 React Native 的 Tailwind CSS
  8. 如何使用Photoshop(PS)将图片的底色变为透明
  9. 【网络编程】Linux tcpdump命令详解---编辑中
  10. Java简单投票系统