书接上一篇文章,这次主要是厘清在ARM体系结构下,EL/PL究竟是个什么东西。这次还是以v8为例,其一是这是目前唯一一个同时包含了32位和64位的体系规范,其二,这也是最新的规范。

首先是PL。PL的概念是从ARM体系规范之前的版本一路升级上来的,并且仍然存在于V8体系的AARCH32,即32位状态下。PL首先是一个权限级别的限制,里边实现了各种各样的mode。这个mode的概念也是32位所特有的,在一个同时实现了安全扩展和虚拟扩展的v7-a的ARM中,各个PE可以使用的mode有usr,只在PL0中使用,可以是安全或者非安全的,一般情况下,用户软件处于非安全态的usr下,而secure的应用程序则处于安全的usr下

sys, und, fiq, irq, svc, abt,只在PL1中,可以是安全或者非安全的,一般情况下,非安全的os或者虚拟扩展下的guest os位于非安全的mode下,而secure os位于安全的mode下

hyp, 只能在非安全态的PL2中,一般情况下,虚拟扩展的hypervisor实现在这个模式

mon,只能在安全态的PL1中,一般情况下,这个mode用于在安全态和非安全态之间切换

这9中mode不仅存在于spec的描述中,同时在结构的设计上,也有其对应的位置。32位状态下的current program status register, CPSR中,有一个位域M编码当前的处理器的状态。此外,一些应用程序可见的通用寄存器,例如LR和SP在一些模式下是banked的,这意味着在不同模式下,存在着不同的LR和SP实体,从体系结构角度讲,在context switch的时候,就无需保存和恢复这些寄存器了。

32位模式下,通用寄存器的bank情况如下:

摘自ARM文档,版权归ARM所有

从上图可以看出,在32位状态下,mode有着其不可替代的作用。此时PL只是一个虚拟的概念,没有地方明确表示当前处于何种PL级别,我们只能够根据当前的mode,以及当前PE的安全状态(存放在另一个系统寄存器SCR.NS中),来推测出现在是哪个PL。可以说,在32位状态下,mode比PL更重要。

然而,在v8体系中,引入的64位支持下,不再保留mode的概念,并且提出了新的EL概念。在v8中,PE的状态保存在一个叫做叫做PSTATE的结构上。当CPU切到一个EL的时候,之前的状态保存在一个叫做Saved Program Status Register,即SPSR上。SPSR在各个EL之间是banked的,这意味着我们有SPSR_EL1, SPSR_EL2, SPSR_EL3. 因为EL0是用户态,无法处理exception,所以没有SPSR_EL0这个寄存器。

不过话又说回来,当前的cpu状态存放在哪里呢?64位的规范并没有定义一个类似于32位下的CPSR的寄存器保存当前状态,而只是说明当前CPU的状态应该保存有PSTATE这个结构的内容。具体是由什么寄存器实现的,则无规定。我们继续关于CPU状态的讨论,在PSTATE中,有一个一位的nRW,这可不是Read/Write的缩写,而是Register Width的缩写。区分32位和64位最重要的区别,实际上就是通用寄存器的宽度。32位下,通用寄存器都是32位,64位下,通用寄存器都是64位。注意,即使是64位下,指令的长度仍然是32位(而且只能是32位)。当nRW位0的时候,表示当前PE处于64位状态,1则表示为32位状态。PSTATE的定义如下:

摘自ARM文档,版权归ARM所有

在64位状态下,还有两个有趣的部分,EL决定当前处于哪一个Exception Level,而SP则选择当前使用哪个Stack Pointer寄存器。所以,在64位系统下,SP是banked的,而且,除了EL0之外,所有其他的EL层都可以选择,要么是用当前状态特定的SP_ELx,要么是用SP_EL0,前者叫做handler,后者则叫做thread。这两个术语是从V7-R中引入的,所以,可用的PE状态又可以分别叫做ELh和ELt,前者是用自己的SP,后者是用EL0的SP。

摘自ARM文档,版权归ARM所有

然后,让我们回到64位下的SPSR的定义中,如上图所示。我们知道,32位状态产生的exception可以由64位处理,64位产生的exception也可以由64位处理。所以SPSR这个寄存器就需要考虑到在64位状态下,处理的exception究竟来自于哪个状态。在SPSR的定义中,有一个5位的部分M,来标示这一点。M的最高位,M[4],表示出来的是32位还是64位。如果是64位,则M[3:2]表示excpetion来源的EL级别,而M[1:0]表示其使用的是哪个SP,自己的,还是EL0的。如果M[4]表示当前处于32位状态,则M[3:0]编码32位状态的mode,可选的有usr, fiq, irq, svc, abt, und和sys。注意,这里没有编码hyp和mon两个32位可用的mode。没有mon,这个比较容易理解,因为mon对应64位中security的EL3,故而不会有32位的mon的exception需要64位的EL3处理。然而,如果一个32位,non-sec的EL2,产生一个SMC,需要64位的Secure Monitor处理的时候,SPSR_EL3.M究竟是如何编码的?这个问题目前在Spec中还没有找到答案。

因此,64位系统中EL,从某种程度上,更像是从32位系统中的mode简化而来,而并非由PL扩展而来的。这个就看各人的不同理解了。

V8体系中,统一使用EL来进行权限描述,这不仅包括64位体系AARCH64,还包括32位体系AARCH32。对于64位而言,现在就只有EL了,毕竟64位是新加入的体系。然而对于32位体系而言,同时存在mode,PL和EL,由于向下兼容,32位体系结构变得很是复杂。不过,总的来说,还是有规律可循的mode的概念只存在于32位体系中,如果实现的是64位体系,则只用EL描述,不存在mode的概念

32位体系之上不可能跑64位的程序,即,一个AARCH64产生的exception,不可能由AARCH32来处理

首先,我们考虑一下,假如EL3是由64位实现,而不是32位实现的,系统的组织可能是什么样子?对于非安全的世界,一切与纯32位系统一样,但是对于安全的世界,有个很重要的mode,mon,需要额外处理。现在EL3已经使用64位实现,也就是说在安全世界和非安全世界之间进行切换有了方法,那么就不再需要支持mon mode了。这不仅仅是设计的概念,如果一个chip设计的时候决定EL3支持64位,那么就可以不用为32位系统预留后缀_mon的那些banked的寄存器了。这个时候,大概可能的情况如下:

摘自ARM文档,版权归ARM所有

注意,如果支持虚拟化的话,这个时候non-security的EL2是可选使用32位还是64位的。

另一种情况下,假如我们决定EL3由32位实现呢?这个时候,第一,我们需要在EL3上支持mon mode。第二,想一下我们是否需要再设计一个security的EL1来放置哪些sys/irq/fiq/spv/abt/und呢?这些mode实际上和mon有着相同的访问权限,所以理论上是没必要的,所以,大概的可能如下:

摘自ARM文档,版权归ARM所有

注意,这个时候如果支持虚拟化的话,EL2只能是32位。如果EL2实现为64位,那么由EL2产生的SMC就不可能由EL3处理了。

这就是32位的时候EL与mode之间的对应关系。32位的时候mode和PL之间实际上有这清晰的对应关系,所以EL与PL之间的对应关系这里就不再多说了。

arm el2与el3_ARM下的EL/PL概念相关推荐

  1. arm el2与el3_【精品博文】ARMv8的A32的异常等级

    原标题:[精品博文]ARMv8的A32的异常等级 ARMv8,定义了异常等级,来进行权限控制.分别是EL0,EL1,EL2,EL3. 对于AArch32,ARMv8定义了9种PE模式,来确执行权限,不 ...

  2. free(): invalid pointer arm环境O2优化下string free异常分析

    文章目录 1. 背景: 2. 代码示例: 3. 分析过程 3.1 现象一 3.2 现象二 3.3 现象三 4.结论 1. 背景: 近期,ARM开发环境中出现过一次free(): invalid poi ...

  3. 【文献研究】班轮联盟下合作博弈的概念

    前言:以下是本人做学术研究时搜集整理的资料,供有相同研究需求的人员参考. 1. 合作博弈的一些概念 合作博弃中比较重要的问题是共赢状态下的利润分配问题,这关系到联盟的合作机制能否长期有效.这里首先介绍 ...

  4. 《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务

    文章目录 二.高级篇(大厂进阶) 5.Docker-compose容器编排 5.1是什么 5.2能干嘛 5.3去哪下 5.4 Compose核心概念 5.5 Compose使用的三个步骤 5.6 Co ...

  5. arm el2与el3_armv8 memory translation

    AArch32,arm的32bit架构: AArch64,arm的64bit架构: ARMv8.2-LPA,是armv8.2中的新feature,扩大了IPA和PA的支持范围,从48bit扩展到52b ...

  6. 在x86和arm混合部署架构下排查TiKV节点内存占用极高的问题

    作者:何傲 原文来源: https://tidb.net/blog/91cb51aa [是否原创]是 [首发渠道]TiDB 社区 前言 前不久我们在混合部署架构下测试了TiDB 5.0的性能,测试过程 ...

  7. linux流水灯实验,小静视频第二期:第三节ARM开发板linux下流水灯流水灯的实现...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 视频来自:优酷 一.ARM+Linux硬件操作流程及对代码的简单理解 二.NFS挂载网络文件系统 ①准备NFS文件系统目录 1. 准备 NFS 文件系统目 ...

  8. arm el2与el3_armv8架构与指令集.整理.初稿.pdf

    目 录 第 1 章 ARMV8 简介 3 1.1 基础认识 3 1.2 相关专业名词解释 3 第 2 章 EXECUTION STATE 4 2.1 提供两种EXECUTION STATE 4 2.2 ...

  9. ARM在不同模式下如何区别同名寄存器(如fiq模式下的R8_fiq与其他模式下的R8),从而访问不同的寄存器...

    首先看下ARM状态下不同模式下的的寄存器,共37个,31个通用的. 好,问题来了:在快速中断模式下的R8_fiq与其他模式下的R8是不同的寄存器,但是在汇编代码中不会区别寄存器名字. 例如MOV R8 ...

  10. 嵌入式软件开发培训笔记——ARM架构Linux系统下交叉编译环境搭建、NFS、TFTP服务配置及Nandflash的读写

    bootloader原理和开发-->kernel构建-->文件系统/根文件系统(filesystem/rootfs) APP 一.配置交叉编译环境(可参考嵌入式Linux移植与驱动开发co ...

最新文章

  1. Proxy与NAT有什么区别
  2. IBM又双叒叕要分拆了,IT基础设施部门将剥离,未来专注云计算和AI
  3. SQL Server 2008(三) T-SQL(常用全局变量)
  4. 测绘技术的发展与分类简述
  5. (三)Redis for StackExchange.Redis
  6. python打印楼梯和笑脸_Python实现打印楼梯形状图形
  7. webpack指南-webpack入门-webpack的安装
  8. wordpress多站点主站调用分站最新文章_企业网站SEO最新的7个优化步骤!
  9. 腾讯x5加载本地html乱码,腾讯X5内核播放器遇到的问题
  10. 美团技术:复杂环境下落地 Service Mesh 的挑战与实践
  11. Nginx(一)-- 初体验
  12. LeetCode刷题(31)
  13. 全国行政区划变更 (2010~2019)
  14. Python - matplotlib - ROC曲线(Receiver Operating Characteristic curve)
  15. 国际学术论文写作个人总结-引言(Introduction)部分
  16. BUUCTF MD5
  17. 山东财经大学新生赛暨天梯赛选拔赛 B 流浪地球(物理题 , 动量守恒定律)
  18. 如何写毕业设计——外文翻译
  19. 手部IK,自制动画,蒙太奇——开门手臂自动弯曲、靠墙手自动扶墙
  20. 设置EXCEL的默认打印机

热门文章

  1. 用计算机写作文主题,《用计算机写作文》教学设计(周未定)
  2. java pdf水印排布问题_Java——PDF水印接口设计
  3. 12/14 计算器雏形
  4. 计算机网络的雏形为,计算机网络的发展雏形是什么(图文)
  5. 高效C++ Effective C++
  6. 霜降已至,你妈喊你加裤添衣!感恩老妈,就送她智慧云谷新风机
  7. CapstoneCS5212|CapstoneCS5218|DP转VGA1080P方案设计| DP转HDMI4K 30Hz方案设计
  8. SpringCloud Gateway gatewayRequestUrl is missing
  9. Leetcode 1235. 规划兼职工作(DAY 73) ---- 动态规划学习期(上午去上高数课了 课下老师说上次旷课不扣平时分嘻嘻)
  10. java第十一次作业