ARMv8是ARM版本升级以来最大的一次改变,ARMv8的架构继承以往ARMv7与之前处理器技术的基础,除了现有的16/32bit的Thumb2指令支持外,也向前兼容现有的A32(ARM 32bit)指令集,扩充了基于64bit的AArch64架构,除了新增A64(ARM 64bit)指令集外,也扩充了现有的A32(ARM 32bit)和T32(Thumb2 32bit)指令集;
ARMv8拥有两种执行模式(two execution modes):
AArch64 :64-bit registers and memory accesses, new instruction set;
AArch32 : backwards compatible with ARMv7-A;
(一)A64新的指令和寄存器
固定大小32位操作码,清除基于5位寄存器说明符的解码表;
可以拥有32位或者64位参数;
地址设定为64位,主要针对LP64和LLP64数据模型;
比AArch32拥有更少的条件指令,条件指令有:分支,比较,选择;
没有LDM/STM(用于批量从内存中读取或者写入数据)指令,添加LDP/STP指令来操作以降低复杂性及功耗;
支持先进的SIMD(Single-Instruction,Multiple-Data:单指令多数据)和(FP浮点);
支持加密技术;
可随时访问31个通用的64位寄存器 (X0-X30),没有banked(banked是指一个寄存器不同模式下会对应不同的物理地址)的通用寄存器,堆栈指针(SP),PC不是通用寄存器,附加专用的零寄存器(Xzr);
AArch32状态是使用CPSR来存储当前process执行状态,AArch64定义了一组PSTATE寄存器用以保存PE(Processing Element)状态;
AArch64 – Unbanked Registers:
左边的通用寄存器用于:32位或者64位的整数运算或者64位的寻址,右边的用于浮点运算;
AArch64 Banked Registers:
AArch64不在根据之前通过不同模式来区别banked寄存器,而是通过exception level;
下图为AArch32和AArch64通用寄存器对应关系:
(二)AArch64 Exception Model
AArch64 Exception Model:
Exception model nomenclature:
总共分为4 exception levels: EL3-EL0,在这种特权模式下EL0位权限最低模式,也就是用户模式,Monitor(EL3)和Supervisor(EL2),分别用于security扩展和virtualization扩展;;低level向高level切换通过exception的方式转换,有如下exceptions:
Interrupts, page faults etc.
SVC for transition to EL1 (system calls)
HVC for transition to EL2 (hypervisor:超级监督者 calls)
SMC for transition to EL3 (secure monitor call)
Dedicated ELR register for the return address (banked at each EL);
而高level向低level则通过ERET指令;
低level的寄存器位宽不能大于高level:E.g. no 64-bit EL0 with 32-bit EL1;
对异常的处理:
1. Exception Link Register written on exception entry;
2. 异常有可能发生任何在exception level,EL1, EL2, and EL3有不同的向量表地址,之前的arm版本只有一个向量表地址;
3. 向量的区分是根据Exception type(synchronous, IRQ, FIQ or System Error)或者Exception origin (same or lower exception level) and register width;
4. Syndrome 寄存器提供了exceptions信息;
AArch32 and AArch64之间切换
AArch32和AArch64之间的切换只能通过发生异常或者系统Reset来实现,A32 -> T32之间是通过BX指令切换的;
不同level之间的组合:
AArch32 /AArch64 relationship:
Changes between AArch32 and AArch64 occur on exception/exception return only;
Allows AArch32 applications under AArch64 OS Kernel;
Allows AArch32 guest OS under AArch64 Hypervisor;
Allows AArch32 Secure side with AArch64 Non-secure side
(二)AArch64 MMU Support
在ARMv8 64bit出现之前,我们用的都是32位寻址,每个地址单位对应内存一个字节单元(B),所以我们最大的寻址范围为2^32B = 4GB,但是实际当中,内存设备有可能远远大于4GB内存空间,以前是通过LPAE(大物理地址扩展)实现地址的扩展,可以支持最大2^40的地址寻址范围,ARMv8理论上最高可以提供提供了2^64个虚拟地址,但是超过16 Exabyte (2^4 * 2^60)意义并不大,所以选择跟x86一样,可以使用最大支持2^48虚拟地址的寻址范围就足够;
ARM 32bits下会用TTBR0存储User-Space行程所在的Page Table (也就是0xC0000000以下的存储空间),并用TTBR1存储Kernel Space所在的Page Table (也就是0xC0000000以上的存储空间).
在ARMv8 64bits架构下,会通过EL1的TTBR0 (ttbr0_el1, in /arch/arm64/mm/proc).存储User-Space行程所在的Page Table,与EL1的TTBR1存储Kernel Space所在的Page Table,并会依据Page Size与32/64bits行程而有不同的存储空间配置. 參考如下圖所示:
由于ARM 64bit Kernel分页大小为4kb和64kb两种,通过设置TASK_SIZE_64 (/arch/arm64/include/asm/memory.h)来设定,当分页大小为4KB的时候,决定TASK_SIZE_64大小的VA_BITS会等于39,也就是2^39大小的Task空间(=512GB),若分页大小为64KB时,则TASK_SIZE_64对应的VA_BITS等于 42,也就是2^42大小的Task空间(=4TB).
同时kernel空间也根据分页大小来划分内核空间,可以参考下面的图来区分:
参考资料:
ARM(V8) Architecture Reference Manual.pdf
ARMv8 Technology Preview.pdf
www.arm.com -cotex-A57介绍
Linux Support for ARM LPAE 分析
ARMv8 与 linux 的新手笔记
ARMv8 架构与指令集.学习笔记
上一篇:ARM基础学习-协处理器CP15
下一篇:【汇编优化】之ARM32与AARCH64指令集优化总结
推荐阅读最新更新时间:2024-11-17 03:51
设计资源 培训 开发板 精华推荐
- AD9204-65EBZ,用于 AD9204BCPZ-65、2 通道、10 位、65 MSPS 模数转换器的评估板
- 使用 ams AG 的 AS1312-BTDT-33 的参考设计
- 使用 ams AG 的 AS1312-BTDT 的参考设计
- 使用 ON Semiconductor 的 STK402-250 的参考设计
- DC1901A,使用 LTC3639EMSE 高效率、150V、100mA 同步降压转换器的演示板
- Bidirectional 400-V/12-V DC/DC Converter Reference Design
- 流水旋转灯
- 使用MC7805稳压器的棒球场速计应用电路
- 【实测成功】基于SL2.1A的USB-HUB扩展坞
- LT1022 的典型应用 - 高速、精密 JFET 输入运算放大器