[ARM][架构] 01.ARMv7 特权等级与核心寄存器

目录

手册章节

[1.ARMv7 特权等级](#1.ARMv7 特权等级)

[2.ARMv8 异常等级](#2.ARMv8 异常等级)

[3.ARMv7 通用寄存器](#3.ARMv7 通用寄存器)


手册章节

cpp 复制代码
// 手册对应章节 
// D1.2 Registers for instruction processing and exception handling 
// E1.2.3 The general-purpose registers, and the PC, in AArch32 state

1.ARMv7 特权等级

处理器为了安全区分系统模式和用户模式,这两种模式也称特权等级 Privilege Level,PL

其中系统模式对应 PL1,用户模式对应 PL0

ARMv7支持安全扩展和虚拟化扩展,处理器实现了安全扩展后,会区分出 Normal World 和 Secure World,这样可以将敏感资源和普通资源隔离,从而提升系统安全性,如下图所示:

处理器实现了虚拟化扩展后,会新增 Hypervisor Mode (Hyp),同时新增 PL2 特权模式,这样程序可以根据自身需求运行在对应的模式下:

  • 虚拟化扩展允许在 Normal World 运行多个操作系统;

  • Hypervisor 只能运行在 Normal World;

  • Trusted OS 和 Trusted Services 运行在 Secure World;

ARMv7 提供了 9 种 CPU 模式,如下图所示:

各模式的描述如下:

  • User:用户模式,用户程序运行在 User 模式,访问系统资源受限;

  • FIQ:快速中断/异常处理模式,发生 FIQ 中断时处理器的模式,相较于普通中断,快速中断拥有更高的响应等级和更低的延迟;

  • IRQ:中断/异常处理模式,发生 IRQ 中断时处理器的模式;

  • Supervisor(SVC):管理员模式,操作系统通常运行在该模式下,处理器复位或应用程序调用 SVC 指令时会进入该模式,系统调用就是通过 SVC 指令完成的;

  • Abort(ABT):异常终止模式,发生 Data Abort Exception 或 Prefetch Abort Exception 时进入该模式;

  • Undefined(UND):未定义指令模式,执行未定义指令时进入该模式;

  • System(SYS):系统模式,系统模式和用户模式共享寄存器视图,目前大多数系统未使用该模式,利用该特性可以在处理器启动时,通过设置系统模式的 SP 寄存器达到设置用户模式堆栈的目的,用户模式的其他寄存器也可以这样操作;

  • Monitor(MON):监视器模式,实现了安全扩展的处理器才有该模式,该模式下执行处理器 Secure 和 Non-Secure 状态的切换;

  • Hyp:实现了虚拟化扩展的处理器才有该模式;

处理器模式、特权等级和安全状态的关系如下图所示:

非安全状态下有3种特权等级 PL0 ~ PL2,其描述如下所示:

  • PL0:用户模式 User Mode 中运行的应用程序处于 PL0 特权等级,运行在该模式下的程序称为非特权程序,非特权程序对于系统资源的访问受限,对应于 Linux 的用户态

  • PL1:除用户模式和 Hyp 模式,其他模式下运行的程序均为 PL1 特权等级,操作系统运行在 PL1 特权等级

  • PL2:实现了虚拟化扩展后,Hyp 模式运行的系统管理程序处于 PL2 特权等级,系统管理程序控制多个操作系统在同一处理器上的共存和执行

2.ARMv8 异常等级

ARM 平台将中断和异常统称为异常(Exception),区别于 ARMv7 架构中使用的特权等级,ARMv8 架构中定义了四个异常等级(Exception Level,EL),如下图所示:

  • EL0:非特权模式,应用程序

  • EL1:特权模式,内核

  • EL2:虚拟化监控程序,如 Hypervisor

  • EL3:安全模式,如 Secure Monitor

程序运行在四个异常等级中的一个,可以认为 ELn 对应着 PLn,各种软件(如应用程序、系统内核)一般只在某一个异常等级下运行,但虚拟机管理程序(如 KVM、VMWare)可以跨 EL1 和 EL2 工作(进入 EL2 管理虚拟机)

ARMv8 架构定义了 AArch32 和 AArch64 两种执行状态,AArch64 使用 64-bit 通用寄存器,AArch32 使用 32-bit 通用寄存器,ARMv8 中 AArch32 保留了 ARMv7 的特权等级,而在 AArch64 中特权等级被描述为异常等级(因此可以认为 ELn 对应 PLn)

异常等级的切换需要遵守以下规则:

  • 切换至更高的异常等级(例如从 EL0 到 EL1)表明增加了软件的执行权限;

  • 异常不能切换到更低的等级;

  • EL0 没有异常处理,异常只有在更高的异常等级(大于 EL0)中才会被处理;

  • 异常会改变程序的正常执行流程,异常处理程序(Exception Handler)在大于 EL0 的异常等级下开始执行;

  • 程序从异常返回可以保持相同的异常等级,或者变成较低的异常等级,但异常等级不能变大;

  • 除非从 EL3 返回到非安全模式,否则安全模式不会随着异常等级的更改而更改;

3.ARMv7 通用寄存器

ARMv7 AArch32 架构的用户模式中,提供了 16 个 32 位的通用寄存器(R0~R15)供软件使用:

  • R0~R14 可以用作通用的数据存储;

    • 进行函数调用时,默认会将 R0~R3 用于传递前 4 个参数;

    • R8~R12 常用于存放局部变量和中间结果;

  • R15 是程序计数器 PC,用来保存将要执行的指令;

  • R13 一般作为栈指针 SP;

  • R14 一般作为链接寄存器 LR,用于保存返回地址;

ARM 还提供了一个当前程序状态寄存器 CPSR 和一个备份程序状态寄存器 SPSR,这两个寄存器用于 PE 状态控制

ARMv7 有 9 种运行状态,每种状态均有其对应的通用寄存器组,如下图所示:

图中浅色字体的是与 User 模式共有的寄存器,蓝绿色背景的是各个模式所独有的寄存器,其中,不同模式一般有独立的栈指针寄存器 SP、链接寄存器 LR、R8~R12,R0~R7 为所有模式共享的数据寄存器

相关推荐
一只会跑会跳会发疯的猴子31 分钟前
linux安装ffmpeg7.0.2全过程
linux·运维·服务器
cnfelix5 小时前
LD与AR
linux
清月电子5 小时前
KT6368A通过蓝牙芯片获取手机时间详细说明,对应串口指令举例
单片机·嵌入式硬件·物联网·智能手机·音视频
小阳睡不醒6 小时前
小白成长之路-计算机网络(四)
linux·运维·计算机网络
且撷相思红豆枝6 小时前
一种比较精简的协议
c语言·网络·嵌入式硬件·esp32
password大鸭梨8 小时前
Linux--CentOs 8配置及基础命令
linux·运维·centos
苏格拉真没有底8 小时前
单片机(MCU)的 IO 口静电、浪涌、电压异常等保护
单片机·嵌入式硬件
LS_learner8 小时前
Teensy LC 一款由 PJRC 公司开发的高性能 32 位微控制器开发板
嵌入式硬件
国科安芯9 小时前
【AS32X601驱动系列教程】SMU_系统时钟详解
单片机·嵌入式硬件·fpga开发
love530love9 小时前
与 PyCharm 官方沟通解决开发环境问题记录(进展:官方已推出2个新的修复版本)
linux·运维·jvm·人工智能·windows·python