【嵌入式软件开辟】ARM64架构底子知识

打印 上一主题 下一主题

主题 982|帖子 982|积分 2946

一、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为AArch64EL非常等级,从0到3SP选择栈指针寄存器,在运行在不同的非常等级时,处理器可以运行在不同的SP_ELn栈指针寄存器中,该标记位标记使用哪个栈指针寄存器D调试位,用于在非常处理过程中打开调试断点和软件单步功能A用于屏蔽系统错误I用于频闭IRQF用来频闭IFQPAN特权不访问UAO用户特权覆盖标记位 2.3 特殊寄存器



  • 0寄存器:ARMv8架构提供两个0寄存器,这两个寄存器的内容都是全9,可以用作源或目标寄存器,其中XZR是64位,WZR是32位
  • 栈指针寄存器:共有4个栈指针寄存器,每一个栈指针寄存器对应一个非常等级
  • PC寄存器,程序指针寄存器
  • 非常链接寄存器ELR:用于存放非常返回的地点
  • 保存状态寄存器:当我们进行非常处理的时候,处理器状态寄存器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 非常向量表


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表