问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ARM64架构基础知识详解

创作时间:
作者:
@小白创作中心

ARM64架构基础知识详解

引用
CSDN
1.
https://m.blog.csdn.net/weixin_45434953/article/details/140937621

ARM64架构是ARM公司推出的第一代支持64位处理器的指令集架构,它在保持与上一代架构指令集兼容的同时,引入了多项新特性,如超大物理地址空间、64位宽的地址空间等。本文将详细介绍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状态下,很多系统寄存器会根据不同的异常等级提供不同的变种寄存器

_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 异常类型

中断

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

异常

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

复位

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

软件产生的异常

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 异常向量表

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号