本文主要从这三个方面介绍ARMv8架构下CPU的异常处理流程。 一、ARMv8异常简介 1.异常级别 不同于Armv7架构采用CPU模式切换的方式进行异常处理,Armv8架构定义了一组全新的异常级别进行异常处理,即EL0至EL3,有如下特性: 如果ELn为异常级别,
aarch64 和 ARMv8 是紧密相关但涵义不同的术语,在解释他们的区别之前,让我们先简单理解它们各自的含义: ARMv8: ARMv8 是指 ARM 架构的第八个版本,这是由 ARM Holdings ARMv8 架构同时支持 64 位(AArch64)和 32 位(AArch32)指令集。 总而言之,ARMv8 指的是处理器架构的一个版本,这个版本包括了 64 位处理能力。而 aarch64 指的是 ARMv8 架构中的 64 位指令集。 也就是说,aarch64 是 ARMv8 的一部分。 所有运行在 aarch64 模式下的ARM处理器都基于 ARMv8 架构,但 ARMv8 架构也包括对之前架构如 ARMv7 的兼容支持(例如,在 32 位模式下运行)。
本文主要介绍 Armv8/v9 指令集架构中常用部分,详细的还是要看 Arm architecture reference manual. ARMv8 架构 ARMv8 架构支持3种指令集: T32, A32, A64 ARMv8 架构有两种执行状态: AArch32, AArch64 一个App 可以混合使用 T32 和 A32, 但是不能混合使用 stack pointer ARMv8体系结构为每个异常等级都实现了一个栈指针SP_ELn,以异常等级为后缀 当PE在某个异常等级处理异常时,可配置使用如下2个栈指针之一(通过PSTATE.SP配置), Saved Program Status Registers (SPSRs)(备份程序寄存器) 用于保存发生异常时的处理器状态 ARMv8体系结构为每个可作为target exception level 在ARMv8中,将PE的状态抽象为PSTATE。
1.前言 本文的主要内容来源于ARMV8白皮书v5,对ARMV8做一个概述。 包含如下的内容: 首先从背景谈起,讲述ARM的发展历程; 之后介绍ARMV8体系结构的基本特征; 介绍A64指令集 介绍异常级别 介绍内存管理单元 介绍编程寄存器 介绍DEBUG相关 ARMV8生态系统的演化 引入了多核 Cotex-A5:引入低功耗、低成本的网络互联 Cotex-A7:引入了出色的能效管理,可以延长手机的续航时间 Cotex-A15:引入了很多可选的扩展,如LPAE、虚拟化、 为何要引入ARMV8 ARMV8架构基本特性 ? ARMV8目前只定义了Application profile ARMV8定义了48bit符号虚拟地址和达到48bit物理地址 ARMV8采用了新的指令集A64 ARMV8兼容ARMV7的指令 A32和A64
ARMv8架构提供了这种捕获VM操作并模拟它们的陷入控制标志位。当配置了某种陷入异常之后,VM执行某个特定的操作,将会造成异常,从而陷入到更高级别的异常级(EL)中。 对于这些寄存器,ARMv8架构提供了代替方案: VPIDR_EL2:EL1读取MIDR_EL1时返回的值。 VMPIDR_EL2:EL1读取MPIDR_EL1时返回的值。 为了使能这些机制,ARMv8架构支持虚拟中断:vIRQ、vFIQ和vSError。这些虚拟中断的行为与物理中断(IRQ、FIQ和SError类似,但只能在EL0或EL1上执行时发出信号。
Normal memory 可以设置为 cacheable 或 non-cacheable,可以按 inner 和 outer 分别设置。
1.概述 armv8 mmu页表结构比较复杂,总体说来可以将MMU分为以下几个部分: (1)虚拟地址(VA)为48位,而一般只使用到39位(512G内核,512G用户) (2)可以配置成3级页表(64K
ARMv8是ARM重点发展的一个架构。有一些年头了!我们来了解下! 本文介绍了ARMv8-a中的一些概念! 从ARMv7开始,ARM公司面向三个市场:应用、实时、控制,分别推出A、R、M系列处理器。 在此背景下,ARMv8推出。 我们从5个方面描述: 1,AArch64,A64指令集,这里有一个误解是,64bit的指令集是指通用寄存器是64位宽的,而不是指32位的指令集编码变成64位的。
ARMv8架构,引入了Execution State、Exception Level、Security State等新特性,是目前ARM架构变动最大的一次,具体来说: 1,A64:对于Large memory ARMv8 定义了4 个 Exception level,简称 EL0-EL3。同时Exception level 包含了 privilege 概念。 ?
对于ARMv8架构,当EL3使用AArch32时,ARMv8架构相当于ARMv7,以确保完全兼容,安全状态下的所有特权模式被视为处于EL3。 AArch32的安全模型如下图所示。 二者区别主要在于EL3的不同,ARMv7-A中EL3 提供Secure Monitor 和Srcure OS,而ARMV8 中,EL3只提供Secure Monitor 。
虚拟机视角的物理地址在Armv8中有特定的词描述,叫中间物理地址(intermediate Physical Address, IPA)。 这么做的话,这些主设备控制器也需要一个MMU,Armv8称之为SMMU(通常也称为IOMMU)。 对这些寄存器,Armv8提供了与其对应的不需要陷入的版本。Hypervisor可以在进入VM 时先配置好这些寄存器的值。 Armv8提供了vIRQs, vFIQs, 和vSErrors来支持虚拟中断。 理论上,Armv8可以配置成VM直接接收物理FIQs和虚拟IRQs。但在实际应用中,通常配置VM只接收虚拟中断。
虚拟机视角的物理地址在Armv8中有特定的词描述,叫中间物理地址(intermediate Physical Address, IPA)。 这么做的话,这些主设备控制器也需要一个MMU,Armv8称之为SMMU(通常也称为IOMMU)。 对这些寄存器,Armv8提供了与其对应的不需要陷入的版本。Hypervisor可以在进入VM 时先配置好这些寄存器的值。 Armv8提供了vIRQs, vFIQs, 和vSErrors来支持虚拟中断。 理论上,Armv8可以配置成VM直接接收物理FIQs和虚拟IRQs。但在实际应用中,通常配置VM只接收虚拟中断。
经验总结: 手机指令集主要跟芯片相关,如果是c端,就默认是arm芯片了,也只有arm芯片才有armv7和armv8之分。 如果上MNN的话,MNN的量化都是做在armv8上的 现在c端大部分都是64位APP,对应的架构是armv8。 寄存器个数不一样,指令集也不一样。需要针对这些不同重新设计计算的方式。 armv8: 目前开源的库基本都是在armv8上做的优化。 armv8 比armv7大概10%~20%的收益,一般能用v8,就不用v7。 MNN量化之后armv8大概比armv7快一倍。 tnn的armv8做的还可以,v7这块笔者不太了解,关注得比较少。
CCI(Cache Coherent Interconnect)是ARM中的cache一致性控制器。
看了Linaro提供的开源ARMv8 Linux内核源代码,发现ARMv8异常处理与ARMv7及之前的架构有所不同,简单分析。 LinaroARMv8工程:http://www.linaro.org/engineering/engineering-projects/armv8 1.1 Linux内核异常处理相关文件 Linux内核中 *.endm */ push x28,x29 //进行压栈操作,push也是一个宏定义,由于ARMv8没有push指令,用stp取代
TTBR0 :(Translation Table Base Register)转换表基地址寄存器,用来存放用户(task_struct.mm.pgd)PGD全局转换表的基地址; 2.2 转换描述符格式 armv8
ARMv7 与 ARMv8的处理器架构自己一直没有详细了解过,现在来学习一下,在arm community 中文社区看到一个不错的总结。 两者之间的区别主要如下: ARMv8指令集分为Aarch64和Aarch32指令集,而ARMv7使用的是A32和T16指令集(分别为32位和16位)。
解决方法一:临时解决方法: 在终端export OPENBLAS_CORETYPE=ARMV8 解决方法二:将OPENBLAS_CORETYPE写入bashrc vi ~/.bashrc export OPENBLAS_CORETYPE=ARMV8 source ~/.bashrc 注意这个只对当前用户有效,因此加sudo仍然会提示Illegal instruction 解决方法三:随着脚本执行 OPENBLAS_CORETYPE =ARMV8 python3 xxx.py
questions/65631801/illegal-instructioncore-dumped-error-on-jetson-nano 解决的方法就是增加:OPENBLAS_CORETYPE=ARMV8 可以使用临时添加方法,在运行Python指令前运行:export OPENBLAS_CORETYPE=ARMV8 也可以采用增加系统变量方法,可以进行全局修改。 将“export OPENBLAS_CORETYPE=ARMV8”加入到“~/.bashrc”中 想弄清楚原因,可以查阅这个:https://www.reddit.com/r/JetsonNano/comments
Exception levels ARMv8-A系列定义了一系列的异常等级,从EL0到EL3,下面具体说明其含义: