[译] ARM架构入门
FORM;https://www.jianshu.com/p/4b37b4c1e8b7
Arm架构构成了每个Arm处理器的基础。 ARM架构基于RISC(精简指令集计算机)原则,同时也包含:
- 统一的寄存器文件加载/存储(load/store)结构,其中数据处理仅对寄存器内容进行操作,而不直接对存储器内容进行操作。
- 简单寻址模式,所有的加载/存储地址只能由寄存器内容和指令字段确定。
基于增强的RISC 架构,使ARM处理器能够在高性能,小代码尺寸,低功耗和小硅片面积之间有着良好的平衡。 Arm架构随着时间的推移而不断进化,在整个进化历史中引入了几个扩展的架构,包括:
- 安全扩展(TrustZone技术)
- 先进的SIMD(NEON技术)
- 虚拟化扩展,在Armv7-A中引入
- 加密扩展,在Armv8-A中引入
Arm设计了一系列处理器,它们共享通用指令集和编程模型,并具有一定程度的向后兼容性。 实现Arm架构的处理器会遵循特定版本的架构。 这些架构版本是:
- 为高性能市场(如移动和企业及应用)而设计的,架构总则(Architecture (‘A’) profile)。
- 为汽车和工业控制中嵌入式应用而设计的,实时总则(Real-Time (‘R’) profile)。
- 为可满足宽广的关键门数,实时性和性能要求微控制器市场而设计的,微控制器总则(Microcontroller (‘M’) profile)。
最新版本(Armv8架构)
最新的Armv8架构针对不同的市场有三种不同的变体来描述处理器架构:
- Armv8-A架构是A-profile中最新一代Arm架构。 它推出一个64位(AArch64)架构,同时也支持已经完善的32位(AArch32)架构,并支持不同等级(levels )的AArch64和AArch32。
- Armv8-R架构是R-profile中的最新一代Arm架构。 该架构包括确定的内存结构和内存保护单元(MPU),并支持A32和T32指令集。
- Armv8-M架构是M-profile中的最新一代Arm架构。 它定义了一个针对极度压缩低成本的嵌入式系统架构,并且需要低延迟的中断处理。 它使用与其他profile不同的异常处理模型,并支持T32指令集。
原文
[1] https://developer.arm.com/products/architecture/cpu-architecture
作者:赵国开
链接:https://www.jianshu.com/p/4b37b4c1e8b7
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
[译] Armv8-A 架构概述
FORM:https://www.jianshu.com/p/8119986a39c5
Armv8-A 架构
Armv8-A架构是针对应用程序('A')设计的最新一代Arm架构。
它引入了可用的64位和32位执行状态(Execution state ),分别称为AArch64和AArch32。 AArch64执行状态支持A64指令集,可以在64位寄存器中保存地址,并允许基本指令集中的指令使用64位寄存器进行处理。 AArch32执行状态是一个32位执行状态,它保留了与Armv7-A体系结构的向后兼容性,并增强了该体系结构,可以支持AArch64状态中包含的某些功能。 它支持T32和A32指令集。
Armv8-A是唯一支持AArch64的profile ,其中AArch64和AArch32之间的关系被称为interprocessing。 另外,Armv8-A架构允许支持不同等级的AArch64和AArch32,例如:
- 只有AArch64的设计。
- AArch64可支持AArch32操作系统/虚拟机的设计。
- AArch64只支持在应用层级(非特权)使用AArch32。
对工程师来说Armv8-A有什么新东西?
Armv8-A架构引入了许多变化,可以设计出可实现的性能更高的处理器。
- 大的物理地址
这使处理器能够访问超过4GB的物理内存。 - 64位虚拟寻址
这使虚拟内存越过4GB限制的。 这对使用内存映射文件I / O或稀疏寻址的现代桌面和服务器软件很重要。 - 自动信号事件
这使得高效,高性能的自旋锁成为可能。 - 更大的寄存器文件
有31个64位通用寄存器,这提高了性能并减少了堆栈的使用。 - 高效的64位立即生成
文字池的需求较少。 - 较大的PC相对寻址范围
在共享库和位置无关的可执行程序中的有效的数据寻址范围是+/- 4GB。 - 额外的16KB和64KB转换粒度
这降低了转换后备缓冲区(TLB)不命中率和页面访问的深度。 - 新的异常模型
这降低了OS和hypervisor 程序的复杂度 - 高效的缓存管理
用户空间缓存操作提高了动态代码生成效率。 快速数据缓存clear 操作使用数据缓存清零指令清除。 - 硬件加速密码技术
提供比软件加密更好的3倍到10倍速度性能。 这对于由于太小而不能有效转载到硬件加速器的细粒度解密和加密很有用,例如https。 - 加载-获取,存储-释放的指令
专为C ++ 11,C11,Java内存模型而设计。 它们通过消除显式的内存屏障指令来提高线程安全代码的性能。 - NEON双精度浮点高级SIMD
这使得SIMD矢量化可以应用于更广泛的算法集合,例如科学计算,高性能计算(HPC)和超级计算机。
Armv7-A体系结构
Armv7-A体系结构引入了architecture profiles的概念,并且继续被引入Armv8架构。 它实现了具有多种模式的传统Arm架构,支持基于内存管理单元(MMU)的虚拟内存系统架构(VMSA),并支持Arm(A32)和Thumb(T32)指令集。
架构扩展
这个架构也支持多个扩展。 包括:
- 安全扩展。 这是一组可选的扩展,这些扩展提供了一组安全功能,利用这些安全功能可以协助安全应用程序的开发。
- 多重处理扩展。 这些是一组可选的扩展,提供了一组增强多重处理功能的特性。
- 大的物理地址扩展。 这是一个可选的扩展,它提供了一个地址转换系统,支持高达40位的物理地址,并且具有良好的转换性能。 它需要实现多重处理扩展。
- 虚拟化扩展。 这些是一组可选的扩展,为虚拟机监视器(称为Hypervisor)提供硬件支持,以在各个Guest 操作系统之间进行切换。 它需要实现安全扩展和大的物理地址扩展。
- 通用计时器扩展。 这是一个可选的扩展,它提供了一个系统定时器和一个低延迟寄存器接口。 它是作为大的物理地址扩展或虚拟化扩展的一部分,但也可以使用Armv7-A架构的早期版本来实现。
- 性能监视器扩展。 该扩展定义了一个推荐的性能监视器实现方式,并为性能监视器保留了寄存器空间。
原文
https://developer.arm.com/products/architecture/a-profile
作者:赵国开
链接:https://www.jianshu.com/p/8119986a39c5
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
[译] ARMv8-A的基础知识
FORM:https://www.jianshu.com/p/563c43ec6a3d
在ARMv8-A中,程序会运行在四个异常级别中的一个。 在64位执行状态下,异常级别决定了执行权限级别,类似于ARMv7-A中定义的权限级别。
异常级别的概念是ARMv8-A架构的基础。 所有操作都在定义的异常级别进行,一个寄存器可以存在一个或多个异常级别。 在一个异常级别更改寄存器中的某个位可以在另一个异常级别有不同的效果。
异常级别提供了软件执行权限的逻辑分离,该软件执行权限适用于ARMv8-A体系结构的所有操作状态。 系统软件确定异常级别,从而确定运行软件的权限级别。 异常级别与计算机科学中常见的分层的保护域(hierarchical protection domains)类似,并且支持这一概念。
通常在每个异常级别运行的软件类型是:
- EL0
普通用户应用程序。 EL0对应于最低特权级别,通常被描述为非特权级别,而在EL0之上的任何异常级别执行的通常被称为特权执行。 - EL1
操作系统内核。通常被描述为特权。 - EL2
虚拟机管理程序(Hypervisor)。 - EL3
低级固件,包括安全监视器等。
如果一个异常级别(ELn)比另一个异常级别的n更大,则n更大的异常级别更高,被认为是处于较高的异常级别。 反之n值更小的则异常级别更低。
一般来说,一个软件(如应用程序,操作系统的内核或hypervisor)占用一个异常级别。 一个例外是内核管理程序,比如KVM,在EL2和EL1上都有运行。
ARMv8-A还提供了两个安全状态。 ARM®体系结构参考手册使用术语安全(Secure )和非安全(Non-secure)来指代这些系统安全状态。 这里,非安全状态被称为普通世界(Normal world)。 非安全状态并不表示任何安全漏洞,而是指正常操作,因此与普通世界相同。 “世界”(‘world’ )这个词是用来强调安全世界和这个设备能够拥有的其他状态之间的关系。
操作系统(OS)在普通世界中运行,与在同一硬件上运行在安全世界中的可信操作系统并行运行。 ARMTrustZone®技术使系统能够在普通世界和安全世界之间进行区分。 这可以防止某些软件攻击和硬件攻击。 安全监视器(Secure monitor )充当普通世界和安全世界之间移动的网关。 ARMv8-A体系结构中的安全监视器比起所有其他软件有着更高的异常级别。
exception_levels
在普通世界和安全世界中的ARMv8-A异常级别
ARMv8-A还为虚拟化提供硬件支持。 在普通世界中,虚拟化使得多个操作系统能够在同一个系统上共存和操作。 这意味着管理程序(hypervisor )或虚拟机管理器(VMM)可以在系统上运行并托管多个客户机操作系统。 然后每个客户操作系统在虚拟机上运行。 每个操作系统并没有意识到它与其他客户操作系统共享系统时间。
这意味着普通世界由以下部分组成:
- 应用
运行在普通世界的应用程序。 - 客户操作系统
这些包括在非安全EL1中运行的Linux或Windows。在虚拟机管理程序下运行时,操作系统内核可以作为客户机或主机运行,具体取决于虚拟机管理程序模式。 - 管理程序(Hypervisor)
这在EL2上运行。当管理程序出现并启用时,可以在多个客户操作系统之间进行切换操作。
安全世界有以下组件:
- 安全固件(Secure firmware)
在应用处理器上,安全固件必须是系统启动的第一个程序。它提供了多种服务,包括平台初始化,可信操作系统的安装以及路由安全监视器的调用。安全固件在EL3上执行。 - 可信的操作系统
可信的操作系统为普通世界提供安全服务,并为执行安全或受信任的应用程序提供运行时环境。它在EL3使用AArch64时在安全EL1上执行,在EL3使用AArch32时在安全EL3上执行。
原文
https://developer.arm.com/products/architecture/a-profile/docs/100878/latest/fundamentals-of-armv8-a
作者:赵国开
链接:https://www.jianshu.com/p/563c43ec6a3d
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
[译] ARMv8-A架构基础之执行状态
FROM:https://www.jianshu.com/p/04401286278d
ARMv8-A架构定义了两个执行状态AArch64和AArch32。 AArch64状态对于ARMv8-A是唯一的并且使用64位通用寄存器,而AArch32状态则使用32位通用寄存器向后兼容ARMv7-A。 GNU和Linux文档(Redhat和Fedora发行版除外)有时将AArch64称为ARM64。
AArch32执行状态与包含虚拟化扩展,安全扩展和大型物理地址扩展的ARMv7-A实现兼容。 ARMv8-A架构允许使用AArch32或AArch64来执行不同的软件层(比如应用程序,操作系统内核或Hypervisor层)。 ARMv8-A体系结构定义了AArch32和AArch64如何交互。
下图显示了在AArch64中异常级别的组织。
aarch64_exception_levels.png
下图显示了在AArch32中异常级别的组织。
aarch32-processor_modes.png
在AArch32状态下,可信的操作系统软件在安全EL1中执行,在AArch64状态下,它主要在安全EL3中执行。
原文
https://developer.arm.com/products/architecture/a-profile/docs/100878/latest/execution-states
作者:赵国开
链接:https://www.jianshu.com/p/04401286278d
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
[译] ARMv8-A架构基础之改变异常级别
FORM:https://www.jianshu.com/p/1886f93677af
之前版本的ARM架构定义了基于处理器模式的异常模型。 对于每种异常类型,体系结构都定义了异常所采用的模式。 这种模式被称为异常的目标模式(target mode)。 然而可配置的陷入,使能和路由控制常常可以更改异常的目标模式。 ARMv8-A 的AArch32遵循此模型。
当处理器发生异常时:
- 将当前程序状态保存在目标模式的SPSR中。
- 保存异常的返回地址:
- 如果目标模式不是Hyp模式,则在目标模式的链接寄存器(LR)中。
- 如果目标模式是Hyp模式,则在ELR_hyp中。
- 进入目标模式。 除非异常目标模式是Monitor模式,否则不会更改安全状态。
ARMv7-A体系结构使用从PL0到PL2的特权级别。 在ARMv8-A中,异常级别已经取代了权限级别,但本节将介绍如何对PL1继续进行特殊使用。 下表显示了包含虚拟化扩展和安全扩展的ARMv7-A处理器的全套处理器模式。 它还显示了ARMv7-A分配给每个模式的特权级别,这些模式定义了其执行权限。 执行权限是在每个安全状态中独立定义的。
模式 | 功能 | 安全状态 | ARMv7-A特权级别 |
---|---|---|---|
User (USR) | 非特权模式(大多数应用程序都运行在该模式) | Both | PL0 |
FIQ | FIQ中断异常时进入 | Both | PL1 |
IRQ | IRQ中断异常时进入 | Both | PL1 |
Supervisor (SVC) | 重置时进入或执行监督调用指令(SVC)时进入 | Both | PL1 |
Monitor (MON) | 当执行SMC指令(安全监视器调用)时或处理器进入Monitor 模式异常用于支持安全状态和非安全状态之间的切换。 | Secure only | PL1 |
Abort (ABT) | 内存访问异常时进入 | Both | PL1 |
Undef (UND) | 在执行未定义的指令时进入 | Both | PL1 |
System (SYS) | 特权模式,与用户模式共享寄存器视图 | Both | PL1 |
Hyp (HYP) | 由Hypervisor调用和Hyp陷入异常时进入 | Non-secure only | PL2 |
在ARMv7-A体系结构中,处理器模式可以在特权软件控制下更改,或者在发生异常时自动更改。 当发生异常时,内核保存当前执行状态和返回地址,进入处理异常所需的模式,并可能禁用硬件中断。 在以前没有特权的用户模式,应用程序以最低级别的特权PL0运行。
操作系统在PL1上运行。 在具有虚拟化扩展的系统中,Hypervisor在PL2上运行。 安全监视器作为在安全世界和普通世界之间切换的网关,也在PL1上运行。
ARMv8-A不更改此异常模型,但添加了以下规则以涵盖ARMv7-A中不可能出现的情况:
- 如果EL2正在使用AArch64,则任何以Hyp模式为目标的异常进入EL2也将使用AArch64。
- 如果EL3正在使用AArch64,则任何以Monitor模式为目标的异常进入EL3也将使用AArch64。
在AArch64中,处理器模式被映射到的异常级别如下图所示。
aarch32-processor_modes .png
当发生异常时,处理器把异常级别切换到能处理该异常类型的异常级别(相当于ARMv7-A中的处理器模式)。 在AArch32中安全监视器(Secure monitor)在PL1上运行,而在AArch64中安全监视器在EL3上运行。
处理器模式映射到异常级别
安全状态下的异常级别取决于EL3是否使用AArch64。 这会影响处理器模式如何映射到异常级别。
下图显示了当EL3使用AArch64时,AArch32处理器模式如何映射到异常级别:
map_processor_modes_to_aarch64.png
ARMv7-A中使用的monitor模式在ARMv8-A中不存在。这是因为正在使用AArch64的EL3提供了Secure monitor功能。
当EL3使用AArch32时,AArch32处理器模式映射到异常级别如下:
map_processor_modes_to_aarch32.png
比较这两个图,在普通世界中映射没有变化,但是在安全世界中,Supervisor 模式,Abort 模式,IRQ模式,FIQ模式,Undefined 模式和System 模式从EL1升级到EL3。 这是因为:
- EL3提供Secure Monitor功能。
- ARMv6安全扩展将Monitor 模式定义为与下面这些模式为同一层级的安全状态模式:Supervisor 模式,Abort 模式,IRQ模式,FIQ模式,Undefined 模式和System 模式。 因此,这些模式和Secure Monitor功能一起表示为EL3。
这个重映射对处理器的操作没有影响。 在AArch32状态内的操作完全根据处理器模式之间的交互来定义,而不涉及任何关联的权限级别或异常级别。
ARMv8-A中的权限级别
当EL3使用AArch32时,这些模式集(Supervisor,Abort,IRQ,FIQ,Undefined,System)是处于安全状态的EL3模式,在所有其他情况下都是EL1模式。
为了避免这种复杂的描述,这些模式可以被描述为PL1模式,反映它们在ARMv7-A中的特权级别。 与此相关的是:
- 在这两种安全状态下,这些模式下影响执行的控制可以被描述为PL1控制。
- 在这些模式或用户模式下执行时,使用的转换系统称为PL1&0转换机制。
原文
作者:赵国开
链接:https://www.jianshu.com/p/1886f93677af
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
[译] ARMv8-A架构基础之更改执行状态
FORM:https://www.jianshu.com/p/6d4049388a7c
有时你系统的执行状态必须改变。 例如,如果您正在运行AArch64操作系统,并希望在EL0上运行32位应用程序, 为此,系统必须切换到AArch32。 您只能通过更改“异常”级别来更改“执行”状态。 发生异常时异常可以将执行状态从AArch32更改为AArch64,并且从异常返回时可以将其从AArch64更改为AArch32。
当应用程序运行结束或执行返回到操作系统时,系统可以切换回AArch64。 下图显示哪些你能做,哪些不能做。 AArch32操作系统无法托管64位应用程序。 如下图所示:
move_between_32_and_64.png
在两个状态之间的切换是在安全监视器,管理程序或操作系统层级执行的。 以AArch64状态执行的管理程序或操作系统可以支持较低特权级别的AArch32操作。 这意味着在AArch64中运行的操作系统可以同时承载AArch32和AArch64应用程序。 同样,AArch64的管理程序可以同时承载AArch32和AArch64的客户操作系统。 但是,32位操作系统无法托管64位应用程序,而32位的管理程序无法托管64位客户操作系统。
要在同一个异常级别下更改执行状态,系统必须切换到较高的异常级别,改完之后在返回到原先的异常级别。
例如,您可能会在64位操作系统下运行32位和64位应用程序。 在这种情况下,32位应用程序可以执行和生成监督调用(SVC)指令,或者通过接收中断,以此切换到EL1和AArch64。 之后OS进行任务切换并返回到EL0中的AArch64。 实际上,这意味着你不能拥有一个混合32位和64位的应用程序,因为它们之间没有直接的调用方式。
在AArch64和AArch32执行状态之间切换的要点可以总结如下:
- 更改为AArch32需要从较高的异常级别出发到更低的级别。 这是通过执行ERET退出异常处理程序的结果。
- 更改为AArch64需要从较低的异常级别出发到更高的级别。 异常可能是一条指令执行或一个外部信号的结果。
- 如果在发生异常或从异常返回时异常级别保持不变,则执行状态也不能改变。
- AArch64和AArch32执行状态都具有类似的异常级别,但是安全和非安全操作之间存在一些差异。 当发生异常时,处理器所处的执行状态会限制能用于其他执行状态的异常级别。
- 如果ARMv8-A处理器在特定的异常级别以AArch32执行状态运行,它使用与ARMv7-A中相同的异常模型来处理发送到该异常级别的异常。
- EL3中的代码不能在更高的异常级别中使用异常,因此除了执行复位之外,不能更改执行状态。
对于实现的最高异常级别(大多数ARMv8-A处理器上的EL3),当发生异常时用于每个异常级别的执行状态是固定的。 异常级别只能通过重置处理器来更改。 对于EL2和EL1,当不是实现的最高级别的异常级别时,可通过更高权限级别(使用系统寄存器)进行控制。
原文
作者:赵国开
链接:https://www.jianshu.com/p/6d4049388a7c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。