ARMv8 Cortex-a 编程向导手册学习_1. ARMv8-A 架构介绍与基础

9 篇文章 4 订阅

/* TODO 本系列是对 ARMv8 Cortex-a 系列编程向导手册拙劣的翻译与注解,若有出入,以官方文档为准 */

Chapter2 ARMv8-A 架构与处理器

2.1 ARMv8-A

ARMv8-A 架构是最新一代架构(此时 ARMv9 已经问世),ARMv8 架构包括了32位执行状态(AArch32)与64位执行状态(AArch64), ARMv8 架构可以访问 64 位寄存器,且包含了向后兼容。ARM 架构发展如下:

在这里插入图片描述
ARMv8 架构存在以下能够让性能飞跃的改变:

  1. 硬件设计上能够访问更大的物理地址,超过4GB(地址总线超过32根)
  2. 64位的虚拟地址。
  3. 自动事件信令,可以实现高性能自旋锁。
  4. 更大的硬件寄存器组,存在32个通用寄存器: X0 - X30, 函数调用时可以传递更多的形参,减少堆栈的访问,提高性能。
  5. 额外的 16KB 和 64KB 翻译表粒度。
  6. 新的异常模型,这个很重要,与 cortex-a7 有很大不同。
  7. 有效的 cache 管理。

2.2 ARMv8-A 架构处理器属性

下表比较了 cortex-a53 和 cortex-a57 内核属性:
在这里插入图片描述

2.2.1 ARMv8 处理器

2.2.1.1 Cortex-A53

在这里插入图片描述
Cortex-A53 有如下特点:

  1. 顺序执行,8级流水线。
  2. 低功耗。
  3. 每一块 cpu 可以包含 1- 4 个核。
  4. 每一个核都拥有自己的 L1 cache, 所有核共享 L2 cache。
2.2.1.2 Cortex-A57

略.

Chapter3 ARMv8-A 架构基础

在 ARMv8 架构中,代码在 4 种异常等级(EL[3:0])中执行。
在 AArch64 状态中,异常等级用于确定特权等级,类似于 ARMv7 的特权等级,ELn 对应于 PLn,n 值越大,特权越大。
代码一般以下列模型运行:

EL0运行应用程序,无特权
EL1运行 OS 内核
EL2Hypervisor
EL3安全代码

在这里插入图片描述

3.1 执行状态

ARMv8 机构定义了两种执行状态: AArch32 与 AArch64.
AArch32执行状态:用于兼容 ARMv7, 可以使用 A32 或 T32 指令(ARM 指令和 thumb 指令),该状态访问的寄存器为 32 位,所有操作与 cortex-A7 类似。
AArch64 执行状态:使用 A64 指令集,访问的寄存器宽带为 64 位。

3.2 改变异常等级

在 ARMv7 中,处理器模式可以在特权软件(比如启动汇编代码)下改变或在异常发生时改变。
ARMv7 处理器模式如下:
在这里插入图片描述
在 AArch64 中, 没有处理器模式的概念,只有异常等级的概念,此时 ARMv7 的处理器模式与特权等级将映射到一个具体的异常等级,如下图:
在这里插入图片描述
其中:

  1. EL0 对应 user 模式,无特权
  2. EL1 对应 SVC, ABT, IRQ, FIQ, UND, SYS 模式,对应特权 PL1
  3. EL2 对应 Hyp 模式
  4. EL3 对应 Mon 模式

(重点关顾 EL0 与 EL1 即可,基本所有的中断处理都在 EL1 处理)

异常等级的改变遵循如下规则:

  1. 当向更高的异常等级移动,表示特权等级的增加。
  2. 当异常发生时,异常等级不能降低。
  3. 绝不会有任何异常的目标异常等级为 EL0.
  4. 异常可以打断当前程序流,异常处理函数在除 EL0 之外的任一个异常等级执行,异常处理函数从中断向量表中取址。
  5. 异常处理结束后必须调用 ERET 指令从异常中返回。
  6. 从异常中返回时,要么异常等级不变,要么异常等级降低。

3.3 改变执行状态

存在这样的一种情况,OS 运行在 EL1 是 AArch64 状态,但此时我们想要在 EL0 执行 AArch32 状态的应用程序,那么我们必须在从 EL1 返回时,改变执行状态为 AArch32。然后运行应用程序,当应用程序执行完毕,我们返回 OS 时,系统将会切换回 AArch64 状态。
但是如果 EL1 是AArch32 状态,那么 EL0 不能为 AArch64 状态。
如果想要改变同一异常等级的执行状态,那么我们必须切换到更改的异常等级,设置原先异常等级的执行状态,再返回。
我们只能在异常等级改变时切换执行状态。
总结:

  1. 如果想用切换到 AArch32 执行状态,那么需要通过执行 ERET 指令从更高i异常等级中返回低异常等级。
  2. 如果想要切换到 AArch64 执行状态,那么我们应该切换到更高异常等级,比如系统调用 SVC 指令。
  3. 如果异常发生时,异常等级没有发生改变,那么执行状态也不能改变。
  4. 在 ARMv8 架构中,如果处理器操作处于 AArch32 执行状态,那么处理器使用与 ARMv7 一样的异常模型,如果是 AArch64 执行状态,那么处理器使用 ARMv8 异常处理模型。

不同异常等级的执行状态遵循如下规则:

  1. 高异常等级为 AArch64 时,低异常等级的执行状态可以为 AArch64 或 AArch32.
  2. 高异常等级为 AArch32 时,低异常等级的执行状态只能为 AArch32.
    示例如下图:
    在这里插入图片描述
    对于最高等级异常比如 EL3,它的执行状态是基于 CPU 实现定义的,对于 EL2 与 EL1 的执行状态,可以通过系统寄存器来控制(后文会提到)。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值