Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ARMv8
处理器架构
ARMv8 架构编程探索上篇
发布于 2021-04-27 17:25:08 浏览:1296
订阅该版
[tocm] 随着开发工作逐渐迁移到 ARMv8 的 64 位平台,因此有必要尽快熟悉 ARMv8 架构。ARMv8 与先前较为熟悉的 ARMv7 架构有较大变化,其中非常重要的一点是支持了 A64 指令集,大大提升了处理器的性能。从目前的的了解来看,基本上 ARMv8 与上代架构的差别是非常大的。除了 A64 指令集之外,还有许多地方都有较大改动,下面列出几个目前比较关注的点: - 执行状态与异常级别(异常级别为 EL0 - EL3) - ARMv8 寄存器组(和先前完全不同的 64 位寄存器) - A64 指令集(新的 64 位指令集) - 内存管理(毕竟地址空间变成 64 位了) - Memory Ordering - 安全系统(例如普通世界和安全世界的切换) 本篇就依据上面的关键点对 ARMv8 架构进行一番探索。 ## ARMv8-A 架构基础 ![image-20210423144454062.png](https://oss-club.rt-thread.org/uploads/20210427/2e5afa103a37f2582d7d911c83b7c936.png) 从上图可以看到,ARMv8 架构兼容了 ARMv7 架构的关键特性,例如支持 A32 和 T32 指令集,单精度浮点操作以及基于单精度浮点的 SIMD 指令。 ARMv7 为什么不支持双精度浮点的 SIMD 指令呢?也许是可用的浮点寄存器不够吧,AArch64 使用了 `32*128-bit` 的浮点寄存器,比 ARMv7 要多了一倍。 下图展示了后续要使用的 `Cortex-A53` 与 `Cortex-A57` 处理器属性: ![image-20210423145757846.png](https://oss-club.rt-thread.org/uploads/20210427/d176543b8c64ed1b76749edb91daf307.png) 可用看出,无论是 A53 还是 A57 的性能都远远超过先前的处理器性能,甚至 A57 架构还配备了专用的 GPU。 ## 执行状态与异常级别 在 ARMv8 架构中定义了两种执行状态,AArch64 以及 AArch32。这两种执行状态分别用于描述执行使用 64 位宽的通用寄存器或者使用 32 位宽的通用寄存器。然而在 ARMv8 AArch32 中保留了 ARMv7 中定义的特权级,而在 AArch64 中,特权级通过异常等级被定义。因此执行在异常等级 `ELn` 对应于执行在特权等级 `PLn`。 在 AArch64 中,处理器模式在不同的异常等级间切换,就像指在 ARMv7(AArch32) 中当异常被处理时,处理器切换到相应的异常等级来处理异常。下图展示了两种架构在异常处理时的映射关系: ![image-20210423151347275.png](https://oss-club.rt-thread.org/uploads/20210427/b6df7e4a573c9cc146430aeba8cddebe.png) 可以看出先前在 ARMv7 时有各种异常模式,而在 ARMv8 中,这些模式统统都属于 EL1 级别,处理的时候先进入 EL1 的处理函数,然后再通过寄存器信息判断现在发生了哪种异常,然后执行对应的处理函数。 ## ARMv8 寄存器组 AArch64 执行状态在所有的异常级别下提供了 31 个 64 位通用寄存器,每一个寄存器有 64 位宽,从 X0-X30。 下图展示了 AArch64 的 通用寄存器组与特殊寄存器: ### 通用寄存器组 ![image-20210423152018377.png](https://oss-club.rt-thread.org/uploads/20210427/899cb1d2233402c2409de41cefb0f324.png) ### 特殊功能寄存器组 ![image-20210423152111287.png](https://oss-club.rt-thread.org/uploads/20210427/9045041330b520f02b968da01ab12753.png) 可以看出 AArch64 与先前的寄存器组有了非常大的变化,不仅通用寄存器组的宽度和个数变多了,特殊寄存器组也非常不同。特殊寄存器组最大的变化是,先前在 ARMv7 下各种不同模式下的 BANK 寄存器组都没有了,取而代之的是不同级别异常下的 SP 指针、SPSR 以及异常返回寄存器组。 同时为了兼容先前 ARMv7 下 AArch32 执行状态,支持从 AArch64 到 AArch32 寄存器组的映射,如下图所示: ![image-20210423152918083.png](https://oss-club.rt-thread.org/uploads/20210427/a062831446a458e9952518400f6f4c76.png) - PSTATE at AArch32 在 AArch64 中,传统的 CPSR 寄存器被 PSTATE 取代。 ![image-20210423153622163.png](https://oss-club.rt-thread.org/uploads/20210427/237fccaaa47949e40e8dc8e85355acf6.png) ### NEON 与浮点寄存器 除了通用寄存器组之外, ARMv8 也提供了 32 个 128 位的浮点寄存器组,V0-V31。这 32 个寄存器用户保存浮点操作数用于标量浮点执行或者标量和向量操作数用于 NEON 操作。 #### 标量寄存器大小 ![image-20210423154416039.png](https://oss-club.rt-thread.org/uploads/20210427/3c18b058e3ef241acb6d9396786a011c.png) #### 向量寄存器大小 ![image-20210423154455999.png](https://oss-club.rt-thread.org/uploads/20210427/1770909a7c42802c5dcd19cc1dfad126.png) 针对不同大小的向量操作: ![image-20210423154551451.png](https://oss-club.rt-thread.org/uploads/20210427/c88588b62be81ea3a15d083c9782d3e1.png) #### NEON 在 AArch32 运行模式下 在 AArch32 中,小的寄存器被打包成更大的寄存器,例如 D0 和 D1 被组合成 Q1。这就引入了一些复杂的循环依赖关系,会降低编译器向量化循环结构的能力。 ![image-20210423155325041.png](https://oss-club.rt-thread.org/uploads/20210427/48103a230d9d54ddf471a3580c30aee3.png) ## ARMv8 指令集 ARMv8 架构最大的变化之一就是引入了额外的 64 位指令集,补充了现有的 32 位指令集架构。这一添加提供了访问 64 位宽的整数寄存器和数据操作,以及使用 64 位大小的指针访问内存的能力。新的指令集称为 A64,运行在 AArch64 执行状态。ARMv8 也包括先前的 ARM 指令集,现在叫做 A32 和 T32 指令集,这两种指令集都运行在 AArch32 状态,提供对 ARMv7 的先后兼容。 另外有一点需要注意的是,A64 指令集的操作码的长度仍然是 32 位,而不是 64 位。 ### A64 指令集 A64 的指令助记符与 ARMv7 没有太大变化,只是所操作的寄存器形式不同, AArch64 寄存器有不同的位宽,但是我们并不需要记住不同形式的指令,汇编器会根据我们操作的寄存器名称自动选择合适的编码。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
我夏了夏天
Life isn't about finding yourself, life is about creating yourself.
文章
24
回答
1319
被采纳
19
关注TA
发私信
相关文章
1
armv8 下start汇编中sp堆栈指针为什么设置为_start入口函数地址
2
armv8a移植遇到的问题。
3
是否有标准的系统稳定性方面的测试方法?
4
请问RT-Thread支持ARMv8这种多核架构了吗?
5
rk3399移植遇到的问题
6
RT-Thread 移植到双核A53
7
A53 架构, entry_point.S 为什么是运行再el3 特权级别?
8
移植RTThread多核如何开始(ZYNQ US 64位 A53)?求指引
9
GICV2 IGROUP 初始化
10
arm a53架构 调试rt-thread
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
289
次被采纳
张世争
808
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
catcatbing
3
篇文章
4
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部