ARMv8手册阅读笔记

Execution state

armv8有两种执行状态:AArch64和Aarch32

Aarch64

  • 提供31个64位的通用寄存器,X30用作程序链接寄存器
  • 一个64位的PC指针,64位的SPs指针,异常链接寄存器ELRs
  • 提供32个128bit的寄存器用作SIMD(这个就是单指令多数据集)和标量浮点(这个暂时不懂)。
  • 提供单个指令集A64
  • 定义了ARMv8异常模式,最多4中异常模式EL0~EL3,提供特权等级
  • 提供64位的虚拟地址
  • 提供了一些process state(这个暂时不懂)
  • 每个system寄存器都使用后缀来表示最低的异常等级(也就是要访问这个寄存器,最低需要什么异常等级)

Aarch32

  • 提供13个32位的通用寄存器,一个32位的PC,SP和LR寄存器。LR既用作ELR也用作程序链接寄存器。
  • 提供一个ELR寄存器,用作从Hyp模式返回
  • 提供32个64位寄存器用于SMID,和标量浮点
  • 提供两种指令集:A32和T32
  • 支持ARMv7的异常模式,基于PE模式,将ARMv7的异常模式映射到ARMv8的异常模式(基于异常等级映射)。
  • 提供32位的虚拟地址

只有当异常状态改变时,PE才可以在两种执行状态之间切换,而且要遵循一定的规则。这就意味着在不同异常状态下的软件层,例如应用程序、操作系统、超级监督者,可以在不同的执行状态下执行。

执行状态的切换

  • 如果运行一个64位的操作系统,然后想在EL0运行一个32位的应用程序,那么系统必须切换到AArch32,应用程序执行完毕或者执行返回到OS,系统又会切换回AArch64。
  • 要在同一个异常级别切换执行状态,你必须首先切换到一个更高的异常级别,
    下面总结AArch64和AArch32之间切换的状况:
  • 两个执行状态的异常等级比较相似,但是在secure和Non-secure的操作上有些不同。异常发生时处理器的执行状态限制了异常等级访问其他的执行状态。
  • 执行状态切换到AArch32,需要从高异常级别到低异常级别。执行ERET指令退出异常处理程序可以产生这种切换。
  • 执行状态切换到AArch64需要从低遗产级别到高异常级别。执行指令或者外部信号产生会导致这种异常切换。
  • AArch64 异常处理

异常等级

  • ARMv8异常分为EL0~EL3,数字越大,特权越高。
  • EL0是非特权模式
  • EL2支持非安全操作的虚拟化(virtualization of Non-secure operation)。
  • EL3支持在两种安全状态下进行切换,secure和Non-secure
    所有的实现必须包含EL0和EL1,剩下两种是可选的。

在Aarch64的情况下,只有在异常发生或者从异常返回时才能进行异常等级的切换:

  • 异常发生时,异常等级只能提高(比如EL0到EL1)
  • 从异常返回时,异常等级只能降低(比如EL1到EL0)

异常等级的应用

ARMv8没有规定哪个软件必须用哪个异常等级。但是一般使用下面的用法:
在这里插入图片描述
每个异常都有自己相应的异常及地址寄存器(VBAR),定义了异常向量表的基地址。

在AArch64状态下:ESR_ELx寄存器保存异常的信息。
在这里插入图片描述
EC:是Exception class field,表示异常发生的原因;
IL:表示指令的长度,在synchronous异常发生时,这个表示陷入的指令是32位还是16位。
ISS:这个域可以被每种异常class单独定义。然而实际上,一些ISS编码被超过一个的异常class使用。

寄存器

SCTLR:系统控制寄存器

作用:控制MMU、icache、dcache等功能的打开和关闭。
【持续更新…】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值