【嵌入式软件开发】ARM64架构基础知识

一、ARM64结构介绍

1.1 ARMv8-A 架构介绍

ARMv8-A是ARM公司发布的第一代支持64位处理器的指令集架构,他在扩充64位寄存器的同时提供对上一代架构指令集的兼容,因而可以同时运行32位和64位应用程序的执行环境。ARMv8-A 架构除了提高了处理能力外,还引入了新的特性:

  • 通过超大物理地址空间,提供超过4GB物理内存的访问
  • 具有64位宽的地址空间
  • 提供31个64位的通用寄存器,可以减少对栈的访问,从而提高性能
  • 提供16KB和64KB的页,有助于降低TLB的未命中率

1.2 ARM64基本概念

ARM处理器实现的是RISC架构,本节介绍ARMv8-A架构的一些基本概念

1.处理单元
ARMv8-A可以把处理器处理事务的过程抽象为处理单元Processing Element

2.执行状态
执行状态是处理器运行时的环境,包括寄存器位宽、支持的指令集、异常模型、内存管理以及编程模型。ARMv8-A架构定义了两种执行模式

  • AArch64
    • 支持64位执行,处理器寄存器宽度为64位,能够处理更大的整数和更大范围的内存地址。
    • 使用全新的A64指令集,这个指令集设计更简洁、统一,支持64位操作数和寄存器。
    • 拥有31个通用寄存器(X0-X30),每个寄存器64位。还有专门的栈指针(SP)、链接寄存器(LR)和程序计数器(PC)
    • 支持更大的物理和虚拟地址空间,物理地址最高支持到48位,虚拟地址空间可达64位(通常实现上限制为48位或52位)。
    • 引入了新的异常模型、更先进的系统级指令和特性(如新的中断处理机制、系统寄存器结构等)。
  • AArch32
    • 支持32位执行,处理器寄存器宽度为32位,主要用于向后兼容32位ARM代码。
    • 使用传统的ARM和Thumb指令集,即ARMv7及更早版本中使用的32位指令集。
    • 有16个通用寄存器(R0-R15),每个寄存器32位。R13通常用作栈指针(SP),R14用作链接寄存器(LR),R15用作程序计数器(PC)。
    • 物理地址最高支持到40位,虚拟地址空间限制在32位。
    • 延续了ARMv7的异常模型和系统级特性。

3.ARMv8指令集
ARMv8根据不同的执行状态提供对不同指令集的支持

  • A64指令集:运行在AArch64状态,提供64位指令集支持
  • A32指令集:运行在AArch32状态,提供32位指令集支持
  • T32指令集,运行在AArch32状态,提供32位和16位指令集支持

4.系统寄存器命名
AArch64状态下,很多系统寄存器会根据不同的异常等级提供不同的变种寄存器

<register_name>_ELx, where x is 0,1,2 or 3

比如SP_EL0表示EL0下的栈指针寄存器

1.3 ARMv8处理器的运行状态

AArch64架构的异常等级确定了处理器当前运行的特权级别,类似于ARMv7架构中的特权等级。一般分为四个等级:

  • EL0:用户特权,用于运行普通用户程序
  • EL1:系统特权,通常用于运行操作系统
  • EL2:运行虚拟化扩展的虚拟监控程序(hypervisor)
  • EL3:运行安全世界中的安全监视器

在这里插入图片描述

2 ARMv8寄存器

2.1 通用寄存器

AArch64运行状态支持31个64位通用寄存器,分别是x0~x30,AArch32支持16个通用寄存器。其中ARM64架构的函数调用标准和规范对此有所约定
在这里插入图片描述
在AArch64运行状态下,使用X表示通用寄存器,比如X0,X30.另外可以使用W开头表示只是用低32位的寄存器

2.2 处理器状态寄存器

在ARMv7架构中使用CPSR表示当前处理器状态,而在AArch64架构中使用的是处理器状态寄存器(PSTATE),如图

字段描述
N负数标志位
Z零标志位
C进位标志位
V有符号数溢出标志位
SS软件单步,若为1则表示进行异常处理的时候使用了软件单步功能
IL不合法的一场状态
nRW当前执行状态:1为AArch32,0为AArch64
EL异常等级,从0到3
SP选择栈指针寄存器,在运行在不同的异常等级时,处理器可以运行在不同的SP_ELn栈指针寄存器中,该标志位标记使用哪个栈指针寄存器
D调试位,用于在异常处理过程中打开调试断点和软件单步功能
A用于屏蔽系统错误
I用于频闭IRQ
F用来频闭IFQ
PAN特权不访问
UAO用户特权覆盖标志位

2.3 特殊寄存器

在这里插入图片描述

  1. 0寄存器:ARMv8架构提供两个0寄存器,这两个寄存器的内容都是全9,可以用作源或目标寄存器,其中XZR是64位,WZR是32位
  2. 栈指针寄存器:共有4个栈指针寄存器,每一个栈指针寄存器对应一个异常等级
  3. PC寄存器,程序指针寄存器
  4. 异常链接寄存器ELR:用于存放异常返回的地址
  5. 保存状态寄存器:当我们进行异常处理的时候,处理器状态寄存器PSTATE会复制到异常状态寄存器SPSR中,处理完成后,再把SPSR中的值恢复到PSTATE中。

3.A64指令集

A64的常规指令如加减乘除,条件判断指令在此不赘述,主要介绍一些具有一定特殊性的指令

3.1 内存屏障指令

ARMv8是吸纳了弱一致性的内存模型,因此内存访问的次序可能和程序预期的次序不一致,因此A54提供了内存屏障指令

指令描述
DMB数据存储屏障,用于确保执行新的存储器访问之前,所有的存储器访问均已完成
DSB数据同步屏障,用于确保下一条指令执行前,所有存储器的访问均已完成
ISB指令同步屏障,用于清空当前流水线,确保在执行新的指令前,之前的指令都已完成

3.2 独占内存访问指令

ARMv7和v8都提供了独占内存指令,在A64中,LDXR指令尝试在内存总线中申请独占访问的锁,用于独占访问某个内存地址。STXR指令会往刚才指令已经申请独占访问的内存地址中写入新内容。这两个指令一般会组合使用以完成一些同步操作,比如说Linux内核的自旋锁。当然,如果需要多字节独占访问,请使用LDXP和STXP

4. ARM64异常处理

在ARM64架构中,中断属于异常的一种。

4.1 异常类型

  1. 中断
    在ARM处理器中,有两种中断,分别是FIQ和IRQ,FIQ的优先级要高于IRQ,在芯片内部,分别由IRQ和FIQ两根中断线连接到处理器内部,而SoC则有一个专门的中断处理器,众多外部设备会将中断引脚连接到中断处理器,由中断处理器负责优先级调度,然后发送中断信号给处理器。

  2. 异常
    中止abort主要有指令中止和数据中止两种,通常是因为访问外部存储单元的时候发生了错误,处理器内部的MMU(Memory Management Unit)会捕获这些错误并且报告给处理器。

  3. 复位
    复位reset是优先级最高的一类异常处理,复位操作包括上电复位和手动复位

  4. 软件产生的异常
    ARMv8提供了三种软件产生的异常,发生异常往往是软件试图进入更高的异常等级。包括如下几种:
    SVC指令:允许用户模式下的程序请求操作系统的服务
    HVC指令,允许客户机请求主机服务
    SMC指令:允许普通世界(normals world)请求安全监控服务

4.2 异常的发生和退出

当异常发生的时候,CPU核心能够感知到异常的发生,并且根据对应目标异常等级进行以下操作:

  • 将处理器状态寄存器PSTATE存到对应目标异常等级的SPSR_ELx中
  • 将返回地址保存在对应目标异常等级的SPSR_ELx中
  • 吧PSTATE寄存器中的DAIF域都设置为1,这相当于把调试异常、系统错误、IRQ和FIQ都关闭了,也就是关中断
  • 如果出现同步异常,则通过查看ESR_ELx寄存器获知具体信息
  • 设置栈指针,指向对应目标异常等级下的栈,自动切换SP为SP_ELx
  • CPU从异常发生现场的异常等级切换到对应目标异常等级,然后跳转到异常向量表并执行

上述是ARMv8检测到异常后自动做的事情,接下来由操作系统接手,操作系统会从中断向量表开始,根据异常类型,跳转到合适的异常向量表,异常向量表中会保存有每一种异常的处理函数的跳转指令,然后操作系统跳转到对应异常处理函数位置开始处理。

当操作系统的异常处理完成之后,执行eret指令就可以从异常返回,这条指令会:

  • 从ELR_ELx中恢复PC指针
  • 从SPSR_ELx恢复处理器状态,此时此刻SPSR_ELx内容覆写回PSTATE,此时也会将关闭的中断打开

4.3 异常向量表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值