草庐IT

Armv8之Execution State 和 Exception Level(一)

BSP-路人甲 2023-03-28 原文

@

ARMV8系统级编程模型主要包括异常级别、运行状态、安全状态、同步异常、异步异常、DEBUG等。本文主要对系统级编程模型做一个概要介绍。

1. 典型的Exception Level使用模型

异常级别 运行的软件
EL0 Secure or Non-secure application
EL1 Secure or Non-secure OS
EL2 Hypervisor (可以理解为上面跑多个虚拟OS)
EL3 Secure Monitor(ARM Trusted Firmware)

2.异常相关术语

术语 说明
Taking an exception PE第一次回应一个异常,此时PE state称为taken from, 之后PE状态为taken to
Returning from exception 当异常返回指令被提交运行,PE state就是return from exception
异常级别 不同异常级别优先级不同,如EL3的异常高于EL1的异常
精准异常(precise exception) 找到某条指令,这条指令前的所有指令都执行完毕,这条指令之后的所有指令都未执行(执行的需要回退),这样PE状态就被记录下载,异常处理完成后就可以恢复。除了SError irq 之外,其它的都是精准异常
同步异常(synchronous exception ) (1)异常的产生是和cpu core执行的指令或者试图执行相关
(2)硬件提供给handler的返回地址就是产生异常的那一条指令所在的地址
(3)synchronous exception又可以细分成两个类别:
  a) 一种我们称之为synchronous abort,例如未定义的指令、data abort、prefetch instruction abort、SP未对齐异常,debug exception等等;
  b) 另一种是正常指令执行造成的,包括SVC/HVC/SMC指令,这些指令的使命就是产生异常。
异步异常(asynchronousexception ) asynchronous exception基本上可以类似大家平常说的中断,它是毫无预警的,丝毫不考虑cpu core感受的外部事件(需要注意的是:外部并不是表示外设,这里的外部是针对cpu core而言,有些中断是来自SOC的其他HW block,例如GIC,这时候,对于processor或者cpu(指soc)而言,这些事件是内部的),这些事件打断了cpu core对当前软件的执行,因此称之interrupt。interrupt或者说asynchronous exception有下面的特点:
(1)异常和CPU执行的指令无关。
(2)返回地址是硬件保存下来并提供给handler,以便进行异常返回现场的处理。这个返回地址并非产生异常时的指令。
根据这个定义IRQ、FIQ和SError interrupt属于asynchronous exception。
SError interrupt SError interrupt是发生了external abort导致的异步异常(或称中断)。

external abort来自memory system, 是访问外部memory system产生的异常(当然不是所有的来自memory system的abort都是external abort,例如来自MMU的abort就不是external abort,这里的external是针对processor而非cpu core而言,因此MMU实际上是internal的)。external abort发生在processor通过bus访问memory的时候(可能是直接对某个地址的读或者写,也可能是取指令导致的memory access),processor在bus上发起一次transaction,在这个过程中发生了abort,abort来自processor之外的memory block、device block或者interconnection block,用来告知processor,搞不定了,你自己看着办吧。external abort可以被实现成synchronous exception(precise exception),也可以实现成asynchronous exception(imprecise exception)。如果external abort是asynchronous的,那么它可以通过SError interrupt来通知cpu core

3. Execution State

3.1 两种Execution State

  ARMv8 提供AArch32 state和 AArch64 state 两种Execution State,下表是两种Execution State对比:

Execution State 说明
AArch32 提供13个32bit通用寄存器R0-R12,一个32bit PC指针 (R15)、堆栈指针SP (R13)、链接寄存器LR (R14)
提供一个32bit异常链接寄存器ELR, 用于Hyp mode下的异常返回
提供32个64bit SIMD向量和标量floating-point支持
提供两个指令集A32(32bit)、T32(16/32bit)
兼容ARMv7的异常模型
协处理器只支持CP10\CP11\CP14\CP15
AArch64 提供31个64bit通用寄存器X0-X30(W0-W30),其中X30是程序链接寄存器LR
提供一个64bit PC指针、堆栈指针SPx 、异常链接寄存器ELRx
提供32个128bit SIMD向量和标量floating-point支持
定义ARMv8异常等级ELx(x<4),x越大等级越高,权限越大)
定义一组PE state寄存器PSTATE(NZCV/DAIF/CurrentEL/SPSel等),用于保存PE当前的状态信息
没有协处理器概念

3.2 决定Execution State的寄存器

寄存器及bit位 说明
SPSR_EL1.M[4], Saved Program Status Register (EL1) 决定EL0的执行状态:
(1) 0b1 :AArch32 execution state
(2) 其它 :AArch64 execution state
HCR_EL2.RW, bit [31], Hypervisor Configuration Register 决定EL1的执行状态:
(1) 0b0 :较低的级别都是AArch32
(2) 0b1 :EL1的执行状态为AArch64。 在EL0上执行时,EL0的执行状态由PSTATE.nRW的当前值确定。
SCR_EL3.RW, bit [10], Secure Configuration Register 决定EL2或EL1的执行状态:
(1) 0b0 :较低的级别都是AArch32
(2) 0b1 :下一层较低的异常级别是AArch64
SPSR_EL3.M[4], Saved Program Status Register (EL3) 决定EL3的执行状态:
(1) 0b1 :AArch32
(2) 0b0 :AArch64

AArch32和AArch64之间的执行状态切换只能通过发生异常或者系统Reset来实现。

4. Secure state

Secure state 说明
Non-secure EL0/EL1/EL2, 只能访问Non-secure 物理地址空间
Secure EL0/EL1/EL3, 可以访问Non-secure 物理地址空间 & Secure 物理地址空间,可起到物理屏障安全隔离作用

4.1 EL3对secure state的影响

EL3是否实现 说明
实现EL3 (1) EL3只有secure state;
(2) Non Secure state到secure state只能发生在EL3接收到异常;
(3) secure state到non secure state只能发生在异常从EL3返回;
(4) 如果 FEAT_SEL2未实现,EL2只有non secure state.
(5) 如果 FEAT_SEL2实现,EL2可以存在 secure state,并通过SCR_EL3.EEL2 比特位置 1来使能
未实现EL3 (1) 如果没有实现EL2,则secure state由SOC厂商决定;
2) 如果实现EL2且未实现 FEAT_SEL2, 则只有non secure state

4.2 EL3使用AArch64 or AArch32的影响

EL3是否实现 说明
Common (1) User mode(AArch32才有) 只执行在Non- Secure EL0 or Secure EL0;
(2) EL2只有Non-secure state( FEAT_SEL2未实现时);
(3) EL0 既有Non-secure state 也有Secure state
EL3处于AArch64执行状态 (1) 若EL1使用AArch32,那么Non-Secure {SYS/FIQ/IRQ/SVC/ABORT/UND} 模式执行在Non-secure EL1,Secure {SYS/FIQ/IRQ/SVC/ABORT/UND}模式执行在Secure EL1;
(2) 若 SCR_EL3.NS = = 0,则切换到Secure EL0/EL1状态,否则切换到Non-secure EL0/EL1状态; 当SCR_EL3.{EEL2, NS} =={1,0},那么EL2也处于Secure状态
(3) Secure state 通常只有Secure EL0/EL1/EL3,但是在实现FEAT_SEL2的前提下EL2也可以处于Secure;
(4) SCR.NS决定的是low level EL的secure/non-secure状态,不是决定当前的;
EL3处于AArch32执行状态 (1) 若EL1使用AArch32,那么Non- Secure {SYS/FIQ/IRQ/SVC/ABORT/UND} 模式执行在Non-secure EL1,Secure {SYS/FIQ/IRQ/SVC/ABORT/UND}模式执行在EL3;
(2) Secure state只有Secure EL0/EL3,没有Secure EL1 ;
(3) SCR_EL3.NS决定的是low level EL的secure/non-secure状态,不是决定当前的;

5. execution state与secure state组合

5.1 EL3使用AArch64时(注意两个图的差别和脚注)


5.2 EL3使用AArch32时

5.2.1 Armv8-A Security model when EL3 is using AArch32

5.2.2 AArch32 PE modes

5.2.3 AArch32 通用寄存器, PC, 和特殊寄存器 一览表


参考:
(1) 《Arm® Architecture Reference Manual Armv8, for Armv8-A architecture profile - The AArch64 System Level Memory Model D4.4 Cache support》。
(2) ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST(注意本文部分描述有误)

有关Armv8之Execution State 和 Exception Level(一)的更多相关文章

  1. javascript - armv6l 上的 meteor (树莓派) - 2

    我喜欢meteor的外观,之前从未尝试过,认为它会成为我树莓派上web仪表板的绝佳平台。尝试了推荐的安装程序并得到了这个:$curlinstall.meteor.com|/bin/shUnabletoinstallMeteoronunsupportedarchitecture:armv6lInstallationfailed.好吧,我不会坐视不管的!我打算尝试手动安装它,但是有人已经尝试/失败/成功了吗?有小费吗? 最佳答案 显然,现在有针对raspi的预构建包。唉,我很久以前就失去了兴趣——这里有预建包的详细信息:http://m

  2. go - 在debian armv7l上安装Go的最新版本[保留] - 2

    我想在我的qemu机器上下载并安装golangv1.11+。Linuxip-10-0-2-153.16.0-6-armmp-lpae#1SMPDebian3.16.57-2(2018-07-14)armv7lGNU/Linux我查过了officialGosite但是如果有人能帮我的话,没有提供任何关于armv7l的信息?我从源代码中检查了设置,但是这个过程看起来非常乏味 最佳答案 GoWikipageforArm提到了一些instructionsforinstallingonARMv7l,它们链接到davecheney的thispo

  3. go - 未定义 : SQLiteConn when trying to build go app for armv7 - 2

    我必须为UbuntuARM-v7编译一个Go服务当我编译它时GOARCH=armGOARM=7gobuild-v-orelease/edge_to_bc-ldflags'-s-w-extldflags"-static"'./...我得到:gitlab.com/company/edge_to_bc/vendor/github.com/hyperledger/fabric/bccsp/pkcs11#gitlab.com/company/edge_to_bc/vendor/github.com/hyperledger/fabric/bccsp/pkcs11vendor/github.com/

  4. c++ - 如何在没有 fpu 的情况下使用 armv7 编译 node-v4.2.4? - 2

    我有一个cpu是armv7但没有fpu的设备。我可以使用选项--with-arm-float-abi=soft编译Node,但是当我运行“Node”时,发生“非法指令(核心转储)”。root@router:/tmp/target/bin#./node-vv4.2.4root@router:/tmp/target/bin#./node--v8-options|head-2targetarmv7vfp3softARMv7=1VFP3=1VFP32DREGS=0NEON=0SUDIV=0UNALIGNED_ACCESSES=1MOVW_MOVT_IMMEDIATE_LOADS=0COHERE

  5. unity android包(armV7+arm64)启动黑屏崩溃,在splash动画开始前 - 2

    1、先交代下问题背景。打包一直是用的armV7架构,前段时间老板提到加上arm64。没想到公司其中一台手机居然崩溃,unity的splash动画都没播,但是也没闪退,就是黑屏。看到一串红色崩溃日志。2、解决方式。把原来安装的armV7架构包删掉,再装armV7+arm64架构的包就可以了。参考UnityAndroidbuildcrashwhenusingARM64withIL2CPP-UnityForum,其中有好几种情况,也分别有好几种解决方式,这种方式解决不了,可以看看上边问题的回答。我是参考了里边的“更换签名文件”3、崩溃日志关键字:signal11(SIGSEGV),code1(SEG

  6. ios - 架构 armv7 : "_OBJC_CLASS_$_UBSDKConfiguration", 的 undefined symbol 引用自 - 2

    我的应用程序包含许多第三方SDK,如Facebook、Google+、GoogleAnalytic等。在iOS7到最新的iOS10.xbeta上,一切都运行良好现在我想整合UberRidesSDK在我的申请中。由于UberRidesSDK支持“高于iOS8.x”,我更新了我的应用程序并提供了高于iOS8.x的支持能力。现在我收到错误Undefinedsymbolsforarchitecturearmv7:"_OBJC_CLASS_$_UBSDKConfiguration",referencedfrom:objc-class-refinAppDelegate.old:symbol(s)n

  7. ios - 仅在 armv7 设备上获取 "Library not loaded, image not found";怀疑 App Thinning - 2

    我有一个使用Xcode7.3.1构建的应用程序。此应用程序的最新更新添加了Taplytics框架并支持iOS9和watchOS2。使用Crashlytics分发版,我的QA团队和Beta版测试人员已成功在armv7、armv7s和arm64设备上运行该应用程序。该应用程序于昨晚获准上架,今天,具有armv7架构的设备(iPhone5、iPhone5c)无法加载该应用程序。我从一个设备的崩溃日志中提取的错误如下:ExceptionType: EXC_CRASH(SIGABRT)ExceptionCodes:0x0000000000000000,0x0000000000000000Exce

  8. iphone - 架构 armv6 的 undefined symbol - 2

    我的应用程序在运行iOS5.0的iPhone模拟器上编译良好,但在我运行iOS4.2.1的旧iPodtouch上却失败了。我收到以下错误:Undefinedsymbolsforarchitecturearmv6:"_OBJC_CLASS_$_TestFlight",referencedfrom:objc-class-refinAppDelegate.old:symbol(s)notfoundforarchitecturearmv6我看过其他关于此的问题:Undefinedsymbolsforarchitecturearmv6,UpdatingtoiOS4.3但他们的解决方案不起作用。确

  9. iphone - xcode 中架构 armv7 的 undefined symbol - 2

    我在使用codeTimestamp时遇到了错误类来检查我的代码的速度。但是这些类(class)正在处理任何其他项目。我不知道这是怎么回事。错误是:体系结构armv7的undefinedsymbol:“__Z25LogTimestampChunkInMethodPKciaa”,引用自:-EAGLView.o中的[EAGLViewrenderFrameQCAR]ld:未找到体系结构armv7的符号clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)在此先感谢您的帮助,祝您有美好的一天。 最佳答案 您知道必须在该文件上设置-

  10. ios - 无法为 armv6 构建 RestKit - 2

    我经常收到这样的警告:warning:noruletoprocessfile'$(PROJECT_DIR)/Vendor/YAJL/NSBundle+YAJL.m'oftypesourcecode.c.objcforarchitecturearmv6warning:noruletoprocessfile'$(PROJECT_DIR)/Vendor/YAJL/NSObject+YAJL.m'oftypesourcecode.c.objcforarchitecturearmv6warning:noruletoprocessfile'$(PROJECT_DIR)/Vendor/YAJL/ya

随机推荐