ARMV7架构知识点记录

您所在的位置:网站首页 存储体系架构包括 ARMV7架构知识点记录

ARMV7架构知识点记录

2024-07-16 14:44| 来源: 网络整理| 查看: 265

ArmV7-A架构知识点记录

​ ARM会定期发布该架构的新版本。它们会添加新功能或对现有行为进行更改。此类更改几乎总是向后兼容的,这意味着在旧版本的体系结构上运行的用户代码将继续在新版本上正确运行。当然,为了利用新特性而编写的代码无法在缺乏这些特性的旧处理器上运行。在体系结构的所有版本中,一些系统特性和行为都是由实现定义的。例如,体系结构没有定义各个指令的缓存大小或循环时间。这些是由个别的核心和SoC决定的。每个架构版本还可以定义可选的扩展。这些可能在处理器的特定实现中实现。例如,在ARMv7体系结构中,高级SIMD (Advanced SIMD, NEON)技术是可选的扩展,在第7章介绍NEON时会介绍它。ARMv7体系结构也有配置文件的概念。这些是描述针对不同市场和用途的处理器的体系结构的变体。

1.ArmV7体系

​ ArmV7有三个体系分别是ArmV7-A,ArmV7-R,ArmV7-M

A 应用程序配置文件定义了一种针对高性能处理器的体系结构,支持使用内存管理单元(MMU)的虚拟内存系统,因此能够运行功能齐全的操作系统。提供了对ARM和Thumb指令集的支持。ARMv8-A架构支持AArch32状态,这是该架构的32位实现,向后兼容ARMv7-A。

R 实时概要文件定义了针对需要的系统的体系结构确定性定时和低中断延迟。不支持虚拟内存系统,但可以使用简单内存来保护内存区域保护单元(MPU)。R系列一般用于对实时性要求较高的场景。

M 微控制器配置文件定义了一种针对低成本系统的体系结构,其中低延迟的中断处理至关重要。它使用了与其他配置文件不同的异常处理模型,并且只支持Thumb指令集的一个变体。M系列一般用于控制以及低功耗方面。

2.架构历史和扩展

​ 从80年代中期的第一个测试硅到90年代早期的第一个ARM6和ARM7器件,ARM架构变化相对较小。在该体系结构的第一个版本中,大部分的加载、存储和算术操作以及异常模型和寄存器集都由ARM1实现。版本2增加了multiply和multiply-accumulate指令,并支持协处理器,还有其他一些创新。这些早期的处理器只支持26位的地址空间。该体系结构的版本3分离了程序计数器和程序状态寄存器,并添加了几个新模式,支持32位地址空间。版本4增加了对半字加载和存储操作的支持,以及一个额外的内核级特权模式。如果不熟悉ARM体系结构的读者在本描述中使用了他们不熟悉的术语,也不用担心,因为所有这些主题都将在后续章节中介绍。ARMv4T架构引入了Thumb(16位)指令集,由ARM7TDMI®和ARM9TDMI®处理器实现,这些产品已经出货数十亿美元。ARMv5TE架构增加了对dsp类型操作和饱和运算以及ARM/Thumb互操作的改进。ARMv6做了许多增强,包括支持非对齐内存访问、对内存架构的重大更改和多核支持,以及支持在32位寄存器中操作字节或半字的SIMD操作。它还提供了许多可选的扩展,特别是Thumb-2和安全扩展(TrustZone)。Thumb-2将Thumb扩展为混合长度(16位和32位)指令集。

​ ARMv7-A体系结构强制使用Thumb-2扩展,并添加了Advanced SIMD扩展(NEON)

​ 多年来,ARM对处理器采用了顺序编号系统,从ARM9到ARM8,再到ARM7。各种数字和字母被附加到基族中以表示不同的变体。例如,ARM7TDMI处理器有T表示Thumb, D表示Debug, M表示快速乘法器,I表示EmbeddedICE。

​ 对于ARMv7架构,ARM有限公司为其处理器采用了Cortex品牌名称,并附带一个字母表示处理器支持三种配置文件(A, R或M)中的哪一种。

​ 下图显示了不同版本的架构如何对应不同的处理器实现。这个图并不全面,也不包括所有的体系结构版本或处理器实现。 在这里插入图片描述

​ 我们常见的STM32F1,F4系列就是ARMV7-M架构的,可以去官网下载对应的我文档,这里介绍ArmV7-A。

​ ARM Cortex-A7处理器是ARM开发的最节能的应用处理器,扩展了ARM在入门级智能手机、平板电脑和其他先进移动设备上的低功耗领导地位。下图时ARMV7-Ac处理器架构框图 在这里插入图片描述

上图可以看出

支持处理器多核调式和跟踪支持数据处理引擎支持指令缓存和数据缓存支持硬件浮点运算128-bitAMBA总线接口 3处理器模式和寄存器组

​ ARM架构是一种模态架构。在引入安全扩展之前,它有7种处理器模式,如下表图所示。有6种特权模式和1种非特权用户模式。特权是执行某些在用户(非特权)模式下无法完成的任务的能力。在用户态下,对影响系统整体配置的操作有限制,例如MMU配置和缓存操作。ARMV7-M如我们的STM32只由特权和非特权两种。 在这里插入图片描述 在这里插入图片描述 在不同处理器模式下对LR(R14)寄存器的调整。

​ 特定处理器模式和状态的存在取决于处理器是否实现了相关的架构扩展,如下图所示。 在这里插入图片描述

​ 当前处理器模式和执行状态包含在当前程序状态寄存器(current Program Status Register, CPSR)中。改变处理器状态和模式可以通过特权软件显式地进行,也可以通过异常处理来实现。

3.1寄存器组

​ ARM架构提供了16个32位通用寄存器(r0 ~ r15)供软件使用。其中15个(r0 ~ r14)可用于通用数据存储,R15为程序计数器,其值随着核心执行指令的变化而变化。软件对R15的显式写入将改变程序流程。软件也可以访问CPSR,以及先前执行模式下保存的CPSR副本,称为保存的程序状态寄存器(SPSR)。 在这里插入图片描述 ​ Cortex-A7 有 9 种运行模式,每一种运行模式都有一组与之对应的寄存器组。每一种模式可见的寄存器包括 15 个通用寄存器(R0~R14)、一两个程序状态寄存器和一个程序计数器 PC。在这些寄存器中,有些是所有模式所共用的同一个物理寄存器,有一些是各模式自己所独立拥有的,各个模式所拥有的寄存器如下图所示。 在这里插入图片描述 ​ 浅色字体的是与 User 模式所共有的寄存器,蓝绿色背景的是各个模式所独有的寄存器。可以看出,在所有的模式中,低寄存器组(R0~R7)是共享同一组物理寄存器的,只是一些高寄存器组在不同的模式有自己独有的寄存器,比如 FIQ 模式下 R8~R14 是独立的物理寄存器。假如某个程序在 FIQ 模式下访问 R13 寄存器,那它实际访问的是寄存器 R13_fiq,如果程序处于 SVC 模式下访问 R13 寄存器,那它实际访问的是寄存器 R13_svc。总结一下,CortexA 内核寄存器组成如下:

34 个通用寄存器,包括 R15 程序计数器(PC),这些寄存器都是 32 位的。

8 个状态寄存器,包括 CPSR 和 SPSR。

Hyp 模式下独有一个 ELR_Hyp 寄存器。

3.1.1 通用寄存器

R0~R15 就是通用寄存器,通用寄存器可以分为以下三类:

未备份寄存器,即 R0~R7。

备份寄存器,即 R8~R14。

程序计数器 PC,即 R15。

分别来看一下这三类寄存器:

未备份寄存器

​ 未备份寄存器指的是 R0~R7 这 8 个寄存器,因为在所有的处理器模式下这 8 个寄存器都是同一个物理寄存器,在不同的模式下,这 8 个寄存器中的数据就会被破坏。所以这 8 个寄存器并没有被用作特殊用途。

备份寄存器

​ 备份寄存器中的 R8~R12 这 5 个寄存器有两种物理寄存器,在快速中断模式下(FIQ)它们对应着 Rx_irq(x=8~12)物理寄存器,其他模式下对应着 Rx(8~12)物理寄存器。FIQ 是快速中断模式,看名字就是知道这个中断模式要求快速执行! FIQ 模式下中断处理程序可以使用 R8~R12寄存器,因为 FIQ 模式下的 R8~R12 是独立的,因此中断处理程序可以不用执行保存和恢复中断现场的指令,从而加速中断的执行过程。备份寄存器 R13 一共有 8 个物理寄存器,其中一个是用户模式(User)和系统模式(Sys)共用的,剩下的 7 个分别对应 7 种不同的模式。R13 也叫做 SP,用来做为栈指针。基本上每种模式都有一个自己的 R13 物理寄存器,应用程序会初始化 R13,使其指向该模式专用的栈地址,这就是常说的初始化 SP 指针。备份寄存器 R14 一共有 7 个物理寄存器,其中一个是用户模式(User)、系统模式(Sys)和超级监视模式(Hyp)所共有的,剩下的 6 个分别对应 6 种不同的模式。

​ R14(链接寄存器LR)保存了在使用Link (BL)指令时输入的子例程的返回地址。当它不支持从子例程返回时,它也可以用作通用寄存器。R14_svc、R14_irq、R14_fiq、R14_abt和R14_und类似地用于在中断和异常发生时,或在中断或异常例程中执行分支和链接指令时,保存R15(PC)的返回值。

3.1.2 程序计数器

​ 程序计数器 R15 也叫做 PC,R15 保存着当前执行的指令地址值加 8 个字节,这是因为 ARM的流水线机制导致的。ARM 处理器 3 级流水线:取指->译码->执行,这三级流水线循环执行,比如当前正在执行第一条指令的同时也对第二条指令进行译码,第三条指令也同时被取出存放在 R15(PC)中。我们喜欢以当前正在执行的指令作为参考点,也就是以第一条指令为参考点,那么 R15(PC)中存放的就是第三条指令,换句话说就是 R15(PC)总是指向当前正在执行的指令地址再加上 2 条指令的地址。对于 32 位的 ARM 处理器,每条指令是 4 个字节,所以:R15 (PC)值 = 当前执行的程序位置 + 8 个字节。

3.1.3 程序状态寄存器

​ 所有的处理器模式都共用一个 CPSR 物理寄存器,因此 CPSR 可以在任何模式下被访问。CPSR 是当前程序状态寄存器,该寄存器包含了条件标志位、中断禁止位、当前处理器模式标志等一些状态位以及一些控制位。所有的处理器模式都共用一个 CPSR 必然会导致冲突,为此,除了 User 和 Sys 这两个模式以外,其他 7 个模式每个都配备了一个专用的物理状态寄存器,叫做 SPSR(备份程序状态寄存器),当特定的异常中断发生时,SPSR 寄存器用来保存当前程序状态寄存器(CPSR)的值,当异常退出以后可以用 SPSR 中保存的值来恢复 CPSR。因为 User 和 Sys 这两个模式不是异常模式,所以并没有配备 SPSR,因此不能在 User 和Sys 模式下访问 SPSR,会导致不可预知的结果。由于 SPSR 是 CPSR 的备份,因此 SPSR 和CPSR 的寄存器结构相同。 在这里插入图片描述

N(bit31):当两个补码表示的有符号整数运算(CMP指令)的时候,N=1 表示运算对的结果为负数,N=0

表示结果为正数。

**Z(bit30):**Z=1 表示运算结果为零,Z=0 表示运算结果不为零,对于 CMP 指令,Z=1 表示进行比较的两个数大小相等。

C(bit29):在加法(ADD)指令中,当结果产生了进位,则 C=1,表示无符号数运算发生上溢,其它情况下 C=0。在减法指令中,当运算中发生借位,则 C=0,表示无符号数运算发生下溢,其它情况下 C=1。对于包含移位操作的非加/减法运算指令,C 中包含最后一次溢出的位的数值,对于其它非加/减运算指令,C 位的值通常不受影响。

V(bit28):对于加/减法运算指令,当操作数和运算结果表示为二进制的补码表示的带符号数时,V=1 表示符号位溢出,通常其他位不影响 V 位。

**Q(bit27)**仅 ARM v5TE_J 架构支持,表示饱和状态,Q=1 表示累积饱和,Q=0 表示累积

不饱和。

**IT:(bit26:25)**和 IT(bit15:bit10)一起组成 IT[7:0],作为 IF-THEN 指令执行状态。

**J(bit24):**仅 ARM_v5TE-J 架构支持,J=1 表示处于 Jazelle 状态,此位通常和 T(bit5)位一起表示当前所使用的指令集:

JT描述00ARM01Thumb11ThumbEE10Jazelle

GE(bit19:16):SIMD 指令有效,大于或等于。

**IT(bit15:10):**参考 IT[1:0]。

**E(bit9):**大小端控制位,E=1 表示大端模式,E=0 表示小端模式。

**A(bit8):**禁止异步中断位,A=1 表示禁止异步中断。

**I(bit7):**I=1 禁止 IRQ,I=0 使能 IRQ。

**F(bit6):**F=1 禁止 FIQ,F=0 使能 FIQ。

**T(bit5):**控制指令执行状态,表明本指令是 ARM 指令还是 Thumb 指令,通常和 J(bit24)一起表明指令类型,参考 J(bit24)位。

**M[4:0]:**处理器模式控制位。 在这里插入图片描述

4.协处理器(CP15)

​ CP15作为系统控制协处理器,提供了控制核心的许多功能。它可以包含多达16个32位主寄存器。对CP15的访问是权限控制的,并非所有寄存器都在用户态可用。CP15寄存器访问指令指定所需的主寄存器,指令中的其他字段用于更精确地定义访问,并增加CP15中物理32位寄存器的数量。CP15的16个主寄存器被命名为c0到c15,但经常被称为名称。例如,CP15系统控制寄存器称为CP15.(CTLR)。

​ SCTLR是使用CP15访问的众多寄存器中的一个,用于控制标准内存、系统设施,并为在核心中实现的函数提供状态信息,结构如下图所示 在这里插入图片描述

TE - Thumb指令启用。它控制是否在ARM或Thumb指令的状态。NMFI -不可屏蔽FIQ (NMFI)支持。 所有的ARM内核都有两个外部中断请求,即FIQ和IRQ。这两种都是电平敏感的低活跃输入。各个实现都有中断控制器,可 以接受来自各种外部源的中断请求,并将其映射到FIQ或IRQ上,从而导致内核发生异常。一般来说,只有明确了适当的 CPSR禁用位(F位和I位),并且断言了相应的输入,才能发生中断异常。CPS指令提供了一种简单的机制来启用或禁用由 CPSR a、I和F位(分别是异步夭折、IRQ和FIQ)控制的异常。CPS IE和CPS ID分别启用和禁用异常。使用字母A、I和f中的 一个或多个指定要启用或禁用的异常。省略相应的字母的异常将不会被修改。在Cortex-A系列处理器中,可以通过配置内 核使fiq无法被软件屏蔽。这被称为不可屏蔽FIQ,由硬件配置输入信号控制,该信号在核心重置时进行采样。当遇到FIQ异 常时,它们仍然会被自动屏蔽。 4.1 字节顺序 EE 异常字节顺序。这定义了CPSR的值。进入异常时的比特位。 在big-endian机器上,对象在内存中的最高有效字节存储在最低有效地址(接近于0)上。在小端序的计算机上,最高有效字节存储 在最高地址。 int i = 0x44332211; unsigned char c = *(unsigned char *)&i; 在32位大端序机器上,c表示i的最高位字节的值:0x44。在小端序的机器上,c是i的最低有效字节:0x11。 4.2 对齐模型 U -表示使用对齐模型。 在ARM内核上,访问的对齐非常重要。在老式的ARM处理器上, 可以访问未对齐的地址,但行为与使用ARMv7体系结构 的地址不同。在ARM7和ARM9处理器上,非对齐LDR在内存系统中执行的方式与对齐访问相同,但返回的数据会被旋 转,因此请求地址处的数据会被放置在加载寄存器的最低有效字节中。一些老的编译器和操作系统能够使用这种行为进行 巧妙的优化。在将代码从ARMv4或ARMv5移动到ARMv7架构时,这可能表示可移植性问题。ARM mmu可以配置为自动 检测这种非对齐访问并中止它们(使用CP15:SCTL位)。

​ 与对齐访问相比,这些非对齐访问可能需要额外的周期,因此对齐也是一个性能问题。此外,这种访问不能保证是原子性的。这意味着外部代理(系统中的另一个核心)可能执行内存访问,该访问似乎是通过非对齐访问的一部分发生的。例如,它可能读取访问的位置,并看到某些字节的新值和其他字节的旧值,下图为对齐访问。 ​在这里插入图片描述 ​ 按字对齐的地址是4的倍数,例如0x100、0x104、0x108、0x10C、0x110。对齐访问的例子。

​ 下图为非对齐访问 在这里插入图片描述

​ 地址1处的一个未对齐字如上图所示。它从0处的单词中取出三个字节,从4处的单词中取出一个字节。

​ 对齐效果对性能有显著影响的一个简单例子是memcpy()的使用。在字对齐的地址之间复制少量字节将被编译为LDM或STM指令。复制对齐到单词边界的较大内存块通常使用优化的库函数完成,该函数还将使用LDM或STM。复制开始或结束点不在单词边界上的内存块可能会导致对通用memcpy()函数的调用,这可能会明显变慢。尽管如此,如果源和目标同样没有对齐,那么只有起始片段和结束片段是非最优的。每当执行显式类型转换时,这种转换总是带有对齐含义。

FI – FIQ 配置使能

V 这个位选择异常向量表的基址。 在这里插入图片描述 ​ 第一列给出了异常在向量表中的偏移量。这是一个指令表,当出现异常时,ARM内核跳转到这个指令表。这些指令位于内存中的特定位置。向量的默认基址是0x00000000,但大多数ARM内核允许将向量的基址移动到0xFFFF0000(或HIVECS)。所有的Cortex-A系列处理器都允许这样做,这是Linux内核选择的默认地址。实现安全扩展的内核还可以使用CP15向量基地址寄存器,为安全状态和非安全状态分别设置向量基地址。

4.3 cache控制位 I -指令缓存启用位。

​ 主要用于对cache的控制启用,操作方法如下。

​ 手册上的介绍例子 在这里插入图片描述

​ 官方SDK中汇编启动文件中的示例

/* Reset SCTlr Settings */ mrc p15, 0, r0, c1, c0, 0 /* Read CP15 System Control register */ bic r0, r0, #(0x1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3