欢迎大家来到IT世界,在知识的湖畔探索吧!
一、 ARMV8介绍
随着计算技术的飞速发展,处理器架构的每一次迭代都给我们带来了相应的性能提升和能效优化。其中,ARMv8架构作为ARM公司推出的新一代处理器架构,以其强大的64位计算能力和丰富的技术特性,正逐步成为高性能、低功耗计算领域的佼佼者。本文将简单介绍ARMv8体系结构中的一些基本概念和定义。
1.1 处理机(Processing Element,PE)
在ARM公司的技术手册中,把处理器处理事务的过程抽象为处理机。
1.2 执行状态(execution state)
处理器运行时的环境,包括寄存器的位宽、支持的指令集、异常模型、内存管理以及编程模型等。ARMv8体系结构定义了两个执行状态。
1.2.1 AArch64: 64位的执行状态。
- 提供31个64位的通用寄存器。
- 提供64位程序计数器(Program Counter, PC)指针寄存器、栈指针(Stack Pointer,SP)寄存器以 及异常链接寄存器(Exception Link Register, ELR)。
- 提供A64指令集
指令集的概念:指令集(Instruction Set)定义了处理器能够识别和执行的一系列基本指令。它的主要作用如下:指令格式和 编码:指令集定义了指令的格式和编码方式,包括操作码、操作数、寻址方式等。这些组成了处理器的原生语言。指令功能和操 作:指令集中包含各种算术、逻辑、数据传输、控制转移等基本操作指令,用于执行各种计算和控制任务。架构和设计:指令集 架构(ISA)是处理器设计的基础,决定了处理器的寄存器集、内存访问方式、中断机制等关键特性。软硬件接口:指令集定义了 软件(编译器、操作系统等)和硬件(处理器)之间的接口,使得软硬件可以协同工作。兼容性和扩展性:不同处理器的指令集可能 存在差异,但大多数处理器都支持某种”指令集架构”,以保证软件的兼容性。新架构也可以在保持兼容性的前提下进行扩展。 A64指令集可以处理64位宽的寄存器和数据并且使用64位的指针来访问内存。A64指令集运行在AArch64状态下。同时ARMv8兼容 旧的32位指令集—-A32位指令集,它运行在AArch32状态下。A64指令集和A32指令集是不兼容的,它们是两套完全不一样的指 令集,它们的指令编码是不一样的。 注意:A64指令集的指令宽度是32位,而不是64位。
- 定义ARMv8异常模型,支持4个异常等级,即EL0~EL3。
- 提供64位的内存模型。
- 定义一组处理器状态(PSTATE)用来保存PE的状态。
1.2.2 AArch32: 32位的执行状态。
- 提供 13个32位的通用寄存器,再加上PC指针寄存器、SP寄存器、链接寄存器(Link Register, LR)。
- 支持两套指令集,分别是A32和T32(Thumb 指令集)指令集。
- 支持ARMv7-A异常模型,基于PE模式并映射到ARMv8的异常模型中。
- 提供32位的虚拟内存访问机制。
- 定义一组PSTATE用来保存PE的状态。
1.3 ARMv8指令集
ARMv8体系结构根据不同的执行状态提供不同指令集的支持。
- A64指令集: 运行在AArch64状态下,提供64位指令集支持。
- A32指令集: 运行在AArch32状态下,提供32位指令集支持。
- T32指令集: 运行在AArch32状态下,提供16位和32位指令集支持。
1.4 系统寄存器命名
在AArch64状态下,很多系统寄存器会根据不同的异常等级提供不同的变种寄存器。
系统寄存器的使用方法如下:<register_name>_Elx //最后一个字母 x 可以表示 0、1、2、3。 如SP_EL0表示在EL0下的SP寄存器,SP_EL1表示在ELI下的SP寄存器。
二、 AArch64状态异常等级
简单的说,ARMv8处理器支持两种执行状态——AArch64状态和AArch32状态。AArch64状态是 ARMv8新增的64位执行状态,而AArch32是为了兼容ARMv7体系结构的32位执行状态。当处理器运行在AArch64状态下时,运行A64指令集;而当运行在AArch32状态下时,可以运行A32指令集或者T32指令集。
2.1 AArch64异常等级的作用
下面我们来介绍一下AArch64异常等级体系结构。AArch64 异常等级(Exception Levels, EL)在 ARM64 体系结构中发挥着关键作用,它为ARM64处理器提供了一个精细的特权隔离和访问控制机制,有利于构建更加安全和可靠的系统。它是ARM64体系结构实现安全性和可信计算的关键基础。它的作用主要体现在以下几个方面:
特权隔离和访问控制: 不同的软件组件(应用程序、操作系统内核、虚拟机监控器、安全监控器)可以在不同的 EL 级别运行,这种分级设计可以有效隔离不同软件层次的特权,提高系统的安全性。
异常处理和切换: 当发生异常(如中断、陷阱等)时,CPU 会自动切换到相应的 EL 级别进行处理,较低 EL 级别的异常会被切换到较高 EL 级别去处理,确保安全可靠的异常处理。
资源访问控制: 不同 EL 级别对系统资源(内存、设备等)的访问权限不同,这种分级访问控制可以防止低特权软件访问敏感资源,增强系统安全性。
执行环境隔离: 不同 EL 级别拥有独立的执行环境(包括寄存器、异常向量表等),这种隔离可以防止低特权软件干扰高特权软件的执行。
安全启动和可信启动: EL3 级别的安全监控器负责系统的安全启动和可信启动,确保系统在一个可信环境下启动,防止恶意代码注入。
2.2 AArch64异常等级结构图
如下图所示,AArch64状态的异常等级(exception level)确定了处理器当前运行的特权级别.
EL0: 用户特权,用于运行普通用户程序。
EL1: 系统特权,通常用于操作系统内核。如果系统使能了虚拟化扩展,运行虚拟机操作系统内核。
EL2: 运行虚拟化扩展的虚拟机监控器(hypervisor)。
EL3: 运行安全世界中的安全监控器(secure monitor)。
ARMv8体系结构允许切换应用程序的运行模式。如在一个运行64位操作系统的ARMv8
处理器中,我们可以同时运行A64指令集的应用程序和A32指令集的应用程序,但是在一个运
行32位操作系统的ARMv8处理器中就不能运行A64指令集的应用程序了。当需要运行A32
指令集的应用程序时,需要通过一条管理员调用(Supervisor Call, SVC)指令切换到ELI,操
作系统会做任务的切换并且返回AArch32的EL0,从而为这个应用程序准备好AArch32状态的
运行环境。
2.3 补充说明
2.3.1 ARMV8虚拟化扩展
ARM 的虚拟化扩展(Virtualization Extension)是 ARMv8 架构中引入的一项重要功能,用于支持硬件级虚拟化。在 AArch64 状态下,EL2 特权等级专门用于运行虚拟机监控器(Hypervisor)。它引入了一组专门用于虚拟化的寄存器和状态,如 virtual CPU 寄存器、虚拟内存管理等。增加了一系列虚拟化相关的指令,如 HVC(Hypervisor Call)、ERET(Exception Return)等。支持二级页表转换,允许虚拟机监控器(Hypervisor) 管理虚拟机的内存映射。提供对虚拟设备的模拟支持,如虚拟中断控制器、定时器等。通过这些虚拟化扩展,ARM 架构可以更好地支持虚拟化技术,让 虚拟机监控器(Hypervisor) 更好地管理和控制虚拟机。
这在云计算、边缘计算等场景非常有用,能够提高服务器、云端设备的资源利用率和安全性。
我们举一个例子,比如在一个服务器上,可以运行多个基于 ARM 的虚拟机,每个虚拟机都有自己的操作系统。虚拟机监控器(Hypervisor) 运行在 EL2 特权级别,负责管理和调度这些虚拟机,为它们分配CPU、内存等资源。这样可以实现对计算资源的高效隔离和利用。
2.3.2 TrustZone 安全机制
在 ARM 架构的 TrustZone 安全机制中,系统会被划分为两个世界:
安全世界(Secure World):它是更加可信的安全环境,运行于 EL3 特权级别。这里运行安全监控器(Secure Monitor)等关键的安全软件。
普通世界(Non-Secure World):这是常规的操作环境,运行于 EL0、EL1 或 EL2 特权级别。这里运行操作系统内核、虚拟机监控器等系统软件。
具体的流程是:系统启动时,首先进入 EL3 特权级别,运行安全监控器。安全监控器负责初始化系统的安全环境,并建立两个世界之间的隔离。之后,操作系统内核等软件会运行在非安全世界的 EL1 或 EL2 级别。这里之所以说”运行在非安全世界的 EL1 或 EL2 级别”,是因为:如果系统没有启用虚拟化功能,操作系统内核会直接运行在 EL1 级别。如果系统启用了虚拟化功能,操作系统内核会作为虚拟机运行在 EL1 级别,而虚拟机监控器(Hypervisor)会运行在 EL2 级别。总之,无论是直接运行在 EL1 还是作为虚拟机运行在 EL1,操作系统内核都是运行在非安全世界的特权级别上,而不是最高特权的 EL3 安全世界。这种设计可以有效地隔离安全关键的操作,提高系统的整体安全性。当需要执行一些安全关键的操作时(如密钥管理、安全引导等),会通过特殊的异常进入 EL3 级别,由安全监控器来处理。这种基于 TrustZone 的硬件安全机制,能够为系统提供可靠的安全防护。安全监控器作为系统安全的最后防线,运行在最高特权级别 EL3 上,可以确保关键安全功能的可靠性和完整性。
三、 ARMv8支持的数据宽度
ARMv8支持下面这几种数据宽度。
- 字节(byte): 8 位。
- 半字(halfword): 16 位。
- 字(word): 32 位。
- 双字(doubleword): 64 位。
- 四字(quadword): 128 位。
3.1 不对齐访问
不对齐访问有两种情况,一种是指令不对齐访问,另外一种是数据不对齐访问。A64指令集要求指令存放的位置必须以字(word,32位宽)为单位对齐。访问一条存储位置不是以字为单位对齐的指令会导致PC对齐异常(PC alignment fault)。
对于数据访问,除了独占加载/独占存储(load-exclusive/store-exclusive)指令或者加载-获取/存储-释放(load-acquire/store-release)指令外,对于其他加载或者存储单个或多个寄存器的所有指令,如果访问地址和要访问数据不对齐,那么按照以下两种情况进行处理。
- 若对应的异常等级中的SCTLR_ELx.A设置为1,说明打开了地址对齐检查功能,那么就会触发一个对齐异常。
- 若对应的异常等级中的SCTLR_ELx.A设置为0,那么处理器不支持不对齐访问。
当然,处理器对不对齐访问也有一些限制。
- 不能保证单次原子地完成访问,可能多次复制。
- 不对齐访问比对齐访问需要更多的处理时间。
- 不对齐访问可能会造成中止(abort)。
四、小结
以上这些就是关于armv8的简单介绍了,后面会继续增加关于armv8的寄存器部分以及指令操作,大家有需要可以进行关注和收藏。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/99931.html