当前位置: 首页 > news >正文

[ARM][架构] 02.AArch32 程序状态

目录

参考资料

1.程序状态 - PSTATE

2.用户模式的 PSTATE 信息

2.1.状态标志

2.2.溢出/饱和标志

2.3.大于等于标志

2.4.指令集状态

2.5.IT 块状态

2.6.端序控制

2.7.指令执行时间控制

3.用户模式访问 PSTATE - APSR 寄存器

4.系统模式的 PSTATE 信息

4.1.状态标志

4.2.溢出/饱和标志

4.3.大于等于标志

4.4.PE 状态控制

4.5.异步异常(中断)标志

4.6.PE 模式

4.7.权限控制(ARMv8.1 可用)

4.8.指令执行时间控制

4.9.Speculation 控制

5.系统模式访问 PSTATE - CPSR 寄存器


参考资料

// ARMv9 架构手册:ARM Architecture Reference Manual for A-profile Architecture// https://www.cnblogs.com/frankfankk/p/15738453.html

1.程序状态 - PSTATE

ARM AArch32 架构中的程序状态 Process State(PSTATE),用于指示当前指令执行的状态

指令执行时会产生进位、溢出、运算结果为负数(对于二进制编码,使用最高位指示正负)等情况,例如,系统架构为 32-bit,即该架构中的地址寄存器、数据寄存器等为 32-bit 长度,如果两个数据寄存器进行加法运算,但计算结果大于 32-bit,则此时会产生溢出,CPU 无法直接通过这两个数据寄存器中的值得知是否产生溢出,因此,CPU 会设置程序状态 PSTATE 的溢出标志位 V(Overflow Condition flag),以表明刚才执行的指令产生了溢出情况,需要进行处理

2.用户模式的 PSTATE 信息

// 手册位置
// 手册:ARM Architecture Reference Manual for A-profile Architecture
// 章节:E1 The AArch32 Application Level Programmers’ Model

ARM 在用户模式下(异常等级 EL0),提供的 PSTATE 信息如下:

2.1.状态标志

  • N:Negative Condition flag,负数标志,如果需要将指令计算结果视为二进制有符号整数,则该位为:

    • 1:表示结果为负数;

    • 0:表示结果为正数或者 0;

    • 注意:当计算结果需要用更高的位来保存时就会产生进位,例如,计算 8 + 9 = 17,二进制表示为 1 0 0 0 + 1 0 0 1 = 1 0 0 0 1,这便是进位的一种情况;

  • Z:Zero Condition flag,计算结果为 0,常用于表示比较的结果为相等:

    • 1:表示结果为 0;

    • 0:其他;

  • C:Carry Condition flag,进位标志:

    • 1:指令计算产生了进位,例如,无符号整数加法运算溢出也是一种进位;

  • V:Overflow Condition flag,溢出标志:

    • 1:指令计算产生溢出,例如,有符号整数的加法运算导致溢出;

    • 0:其他;

条件指令基于这些状态标志,结合指令中的信息确定是否执行下一条指令,或者执行哪一条指令,即基于上一条指令的执行结果,确定下一条需要执行的指令

2.2.溢出/饱和标志

  • Q:Overflow or Saturation flag,溢出/饱和标志,某些指令(通常为 DSP 相关的指令)会设置该位:

    • 1:表示指令执行的结果产生溢出或饱和;

    • 0:其他情况下不会发生改变;

2.3.大于等于标志

  • GE[3:0]:Greater than or equal flags,大于等于标志,并行加法/减法指令会使用该标志位,用于指示单字节或半字节运算的结果;

2.4.指令集状态

  • J、T:Instruction set state,指令集状态(正在执行哪个指令集),其中:

    • J 在 ARMv8 之前的架构中用于指示 CPU 是否为 Jazelle 状态(正在执行的指令集为 Jazelle,Jazelle 技术使 CPU 可以直接运行 Java 字节码);

    • T 用于指示 CPU 当前使用的是 Thumb 指令集还是 ARM 指令集;

    • J、T 两位组合使用,指示当前 CPU 所使用的指令集;

注意:在 ARMv8 之前的架构中,{J,Z} = {1,0} 表示指令集为 Jazelle,{J,Z} = {1,1} 表示指令集为 T32EE,从 ARMv8 架构开始,不再支持这两个指令集(指令集未实现),AArch32 中仍然需要 Trivial Jazelle 指令集扩展

2.5.IT 块状态

  • IT[7:0]:IT block state,T32 指令集中的 IT 指令使用该字段(If-Then Control,控制 IT 指令块);

2.6.端序控制

  • E:Endianness mapping,端序选择:

    • 0:小端序(Little-endian);

    • 1:大端序(Big-endian);

    • 指令集只会使用小端序,并且忽略 PSTATE.E;

2.7.指令执行时间控制

  • DIT:Data Independent Timing,控制指令执行的时间,例如,计算 1 + 1 和计算 12345789 + 123456789 所耗费的时间是不一样的,但是启用该功能后,所有指令执行所花费的时间均相同(为了安全);

3.用户模式访问 PSTATE - APSR 寄存器

在用户模式中(EL0 权限),可以通过 APSR 寄存器(Application Program Status Register)访问 PSTATE

在 EL0 权限下,只可以访问部分 PSTATE 字段,通过 MRS 指令进行读取,通过 MSR 指令进行写入

APSR 寄存器的描述如下(可访问的 PSTATE 字段):

APSR 寄存器只提供了对 N、Z、C、V、Q、GE[3:0] 字段的访问,用户模式下,对剩余保留位执行的写入操作会被忽略,保留位虽然可以进行读取,但是读取出来的值是未知的

在更高的权限等级中(大于等于 EL1),可通过 CPSR 寄存器(Current Program Status Register)访问 PSTATE,CPSR 寄存器会提供更多的信息

4.系统模式的 PSTATE 信息

// 手册位置
// 手册:ARM Architecture Reference Manual for A-profile Architecture
// 章节:G The AArch32 System Level Programmers’ Model

AArch32 架构中,系统模式下的 PSTATE 信息如下所示:

4.1.状态标志

  • N:Negative Condition flag,负数标志;

  • Z:Zero Condition flag,计算结果为 0;

  • C:Carry Condition flag,进位标志;

  • V:Overflow Condition flag,溢出标志;

状态标志的含义和用户模式中的一致

4.2.溢出/饱和标志

  • Q:Overflow or Saturation flag,溢出/饱和标志;

该标志的含义和用户模式中的一致

4.3.大于等于标志

  • GE[3:0]:Greater than or equal flags,大于等于标志;

该标志的含义和用户模式中的一致

4.4.PE 状态控制

  • J、T:Instruction set state,指令集状态,该标志位的含义和用户模式中的一致:

    • AArch32 架构 PL1 权限下,处理异常时,通过系统控制寄存器(System Control Register,SCTLR)的 TE(T32 Exception Enable)位设置 T 标志位,表示当前执行的指令集为 T32({J、T} = {0,1});

    • AArch32 架构 PL2 权限下,通过 Hypervisor 系统控制寄存器(Hyp System Control Register,HCTLR)的 TE (T32 Exception Enable)位设置 T 标志位,表示当前执行的指令集为 T32({J、T} = {0,1});

  • IT[7:0]:IT block state,IT 块的状态,该标志位的含义和用户模式中的一致;

  • E:Endianness of data accesses,端序控制,该标志位的含义和用户模式中的一致,如果平台同时支持大端序和小端序,则:

    • AArch32 架构下执行 Warm Reset 时,该位的值依赖具体的平台实现:

      • 如果平台异常权限的最高等级不为 EL2,则将该位设置为 SCTLR.EE 中的值;

      • 如果平台异常权限的最高等级为 EL2,则将该位设置为 HSCTLR.EE 中的值;

    • 处理异常时:

      • AArch32 架构 PL1 权限下,将该位设置为 SCTLR.EE 中的值;

      • AArch32 架构 PL2 权限下,将该位设置为 HSCTLR.EE 中的值;

  • IL:Illegal Execution state,非法执行状态;

4.5.异步异常(中断)标志

  • A:SError interrupt mask bit,SError 中断标记;

    • 1:产生了该类型的异常;

    • 0:未产生该类型的异常;

  • I:IRQ interrupt mask bit,IRQ 中断标记;

    • 1:产生了该类型的异常;

    • 0:未产生该类型的异常;

  • F:FIQ interrupt mask bit,FIQ 中断标记;

    • 1:产生了该类型的异常;

    • 0:未产生该类型的异常;

4.6.PE 模式

  • M[4:0]:Current mode of PE,当前 PE 的模式(User、IRQ、Hyp 等),支持的模式如下:

其中的编码 Encoding 即为 M[4:0] 字段的可能值

其中 M[4] 用于指示当前处理器的状态:

  • M[4] 为 0:处理器为 AArch64 状态;

  • M[4] 为 1:处理器为 AArch32 状态;

AArch32 架构中执行 Warm Reset 时,M[4:0] 的值设置如下:

  • 如果系统最高权限等级不为 EL2,则该字段设置为 0b10011,表示 Supervisor 模式;

  • 如果系统最高权限等级为 EL2,则该字段设置为 0b11010,表示 Hypervisor 模式;

AArch32 架构中处理异常时,M[4:0] 会设置为异常类型所对应的模式

4.7.权限控制(ARMv8.1 可用)

  • PAN:Privileged Access Never (PAN) state,ARMv8.1 架构中,当 PAN 位置 1 时,将受 PL1 或 EL2 权限保护的数据,拷贝至仅受 EL0 权限保护的虚拟内存中时,会产生权限受限错误,该位置 0 时,系统行为和 ARMv8.0 保持一致;

4.8.指令执行时间控制

  • DIT:Data Independent Timing (DIT) bit,该标志位的含义和用户模式中的一致,仅当架构实现了 FEAT_DIT 相关指令时,该位有效;

4.9.Speculation 控制

  • SSBS:Speculative Store Bypass Safe (SSBS) bit,用于防止 Speculative Store Bypass 漏洞,仅当架构实现了 FEAT_SSBS 相关指令时,该位有效;

5.系统模式访问 PSTATE - CPSR 寄存器

用户模式下(EL0)仅能通过 APSR 寄存器访问一小部分 PSTATE 字段,在其他模式中(如中断 IRQ 模式)可以通过 CPSR 寄存器(Current Program Status Register)访问大部分 PSTATE 字段,同样的,通过 MRS 指令进行读取,通过 MSR 指令进行写入

CPSR 寄存器的描述如下(可访问的 PSTATE 字段):

CPSR 可以访问除 IL、IT[7:0]、J、E、T 字段的其余字段,这些字段可以通过 SPSR 寄存器(Saved Program Status Register)访问(仅在处理异常时可以访问),读写这些位需要使用对应的指令,例如,使用 SETEND BE 指令将 PSTATE.E 置 1,使用 SETEND LE 将 PSTATE.E 置 0 等等

相关文章:

  • GPT-4o 风格提示词案例大全(持续更新 ing...)
  • AE THYRO-AX 功率控制器 THYRISTOR-LEISTUNGSSTELLER THYRISTOR POWER CONTROLLER
  • Kotlin学习34-data数据类1
  • uniapp开发小程序,如何根据权限动态配置按钮或页面内容
  • 【Java学习笔记】抽象类
  • Redis 性能优化:核心技术、技巧与最佳实践
  • C++(4)
  • 第7章:Zephyr 的低功耗机制
  • 跟着华为去变革 ——读《常变与长青》有感
  • 读懂 std::true_type 和 std::false_type
  • 2025年- H52-Lc160--114. 二叉树展开为链表(前序遍历 + 用栈 + 原地修改)--Java版
  • 04_redis之ZSet使用实例-积分榜
  • leetcode-295 Find Median from Data Stream
  • Wan2.1 图生视频 多卡推理批量生成视频
  • 视频问答功能播放器(视频问答)视频弹题功能实例
  • ffmpeg转换竖屏(画面是横屏旋转90度的竖屏文件格式)视频到横屏
  • 网易互娱游戏研发实习一面
  • 在 ElementUI 中实现 Table 单元格合并
  • 萤石云实际视频实时接入(生产环境)
  • Node.js全局对象详解:console、process与核心功能
  • 上海专业做网站排名/电商培训
  • 电商网站制作项目描述/2023年8月份新冠
  • 建设报名系统网站/百度一下电脑版首页网址
  • wordpress发微信公众号/菏泽地网站seo
  • 石家庄搜索引擎优化/内部优化
  • 做网站哪些方面会侵权/成都网站设计公司