《ARM Cortex-A Series Programmer’s Guide for ARMv8-A 》学习笔记

 第一章:引言
  1. 常见ARM处理器:

  2. AArch64 中,允许高达八个参数经过寄存器传递。
第二章:ARMv8-A 架构和处理器
  1. ARMv8-A 架构是针对应用程序配置文件的最新一代 ARM 架构。ARMv8 这个名字描述的是总体架构,此架构现在包括32位执行和64位执行。此架构引进了以64位宽寄存器执行任务的能力,同时保留了向后兼容现有ARMv7软件的能力。
  2. ARMv8A处理器性质(Cortex-A53处理器和Cortex-A57 处理器):

第三章:ARMv8-A的基本原理
  1. ARMv8通过引入四个明确的异常级别(EL0:普通用户应用程序;EL1:操作系统内核,通常描述为“有特权的” ;EL2:虚拟机管理程序;EL3:低级固件,包括安全监控程序。),简化并增强了之前ARM架构中的处理器模式。相比之下,ARMv7(ARMv7有九种)及更早的架构中有七种具体的处理器模式来管理不同的任务和异常。这种变化使得ARMv8的异常处理更加模块化和结构化,特别是为现代操作系统和虚拟化技术提供了更好的支持。
  2. ARMv8-A提供两个安全状态——安全状态和非安全状态。非安全状态也被称为“普通域”。这使得操作系统(OS)可与一个可信操作系统在同一个硬件上并行运行,并针对特定软件攻击和硬件攻击提供防护。ARM TrustZone技术(首次在 Armv6K 中引入,Armv7-A和Armv8-A 也支持)使系统能区分普通域和安全域。
  3. ARMv8中的异常级别切换遵循规则如下:切换到更高异常级别,比如EL0到EL1,表明软件执行特权有提升;异常不能被送到更低的异常级别处理;EL0级不进行异常处理,异常必须在比EL0更高的异常级别处理;异常会导致程序流变化,异常处理程序的执行在EL0以上的异常级别进行,从与所产生异常相关的向量表开始执行;结束异常处理和返回前一个异常级别的操作,通过执行ERET指令进行;从异常返回可以保持在同一个异常级别,也可以进入更低的异常级别,但不能进入更高的异常级别;除非从EL3回到非安全状态,否则安全状态并不会随着异常级别的切换而改变。
  4. ARMv8切换执行状态:即在AArch32执行状态和AArch64执行状态之间切换,要在同一个异常级别中切换执行状态,就必须先切换到更高的异常级别,再返回原异常级别。所以不能有32位(AArch32)和64位(AArch64)混合的应用程序,因为它们之间没有直接的调用方式。执行AArch64状态的虚拟机管理程序或操作系统可能在较低特权级别支持AArch32的操作。这意味着,一个在AArch64状态运行的操作系统可能同时容纳AArch32和AArch64应用程序。同样,AArch64虚拟机管理程序可能同时容纳AArch32和AArch64客户操作系统。不过一个32位操作系统无法容纳一个64位运行程序,一个32位虚拟机管理程序无法容纳一个64位客户操作系统。针对实现的最高异常级别(Cortex-A53和Cortex-A57处理器上的EL3),处理异常时对每个异常级别使用的执行状态是固定的(要么是AArch32,要么是AArch64),异常级别只能通过复位处理器改变。
  5. 除了通用寄存器外,ARMv8还有32个128位浮点寄存器,标记为V0-V31。这32个寄存器用于保存标量浮点指令的浮点操作数,以及NEON操作(即ARM高级SIMD扩展)的标量和矢量操作数,具体见P33(SIMD指令从ARMv6开始引入)。
第四章:ARMv8-A寄存器
  1. AArch64执行状态在任何时候和任何异常级别下均提供31个64位通用寄存器,可在任何时候和任何异常级别下访问。每个寄存器宽64位,一般被称作寄存器X0-X30,每个AArch64 64位通用寄存器(X0-X30)也有一个32位(W0-W30)的形式(每个寄存器的下半部分)。X29为帧指针寄存器(FP,不是SP),X30为程序链接寄存器(注意这里的程序链接寄存器是在子程序调用时默认存储返回地址的寄存器,当然也可以指定其他的寄存器实现该功能,要与异常链接寄存器ELRx区别开)。除了 31 个核心寄存器外,还有一些特殊寄存器:零寄存器(这是一个单独的特殊寄存器)、程序计数器(PC)、栈指针寄存器、异常链接寄存器(保存异常返回地址)、已保存程序状态寄存器(保存处理异常前PSTATE的值,并用于在执行异常返回时,恢复PSTATE的值,AArch64执行状态没有与ARMv7当前程序状态寄存器(CPSR)直接相等的寄存器,在AArch64中,传统当前程序状态寄存器的组成部分以可单独访问的字段形式提供,这些统称为处理器状态PSTATE)(P20)。
  2. 原ARMv7指令集的一个特征是将R15程序计数器(PC)用作通用寄存器。程序计数器使得一些巧妙的编程技巧得以实现,但也使得编译器和综合流水线的设计变得更复杂。因此在ARMv8架构中,取消了对程序计数器PC的直接访问(不得将程序计数器指定为数据处理指令或加载指令的目的地),这样使返回预测变得更容易,并且简化了ABI规范。
  3. 在AArch64中,系统配置是通过系统寄存器控制的,并使用MSR指令和MRS指令访问。这一点与ARMv7-A架构不同,在ARMv7-A架构中,该类寄存器通常是通过协处理器15(CP15)操作访问的(P23)。例如系统控制寄存器(SCTLR),是一种控制标准存储器和系统设备,并针对处理器核实现的功能提供状态信息的寄存器,控制架构特征,例如MMU、缓存和对齐检查。
  4. ARMv6 之前的架构只有前七种工作模式,ARMv7 新增了安全扩展和虚拟化扩展,ARMv7的九种处理器模式如下:用户模式(User mode,普通的应用程序运行模式,权限最低)、快速中断模式(FIQ mode,用于处理快速中断请求,优先级最高,通常用于时间关键的中断处理)、中断模式(IRQ mode,用于处理一般的中断请求,优先级次于FIQ)、管理模式(Supervisor mode,内核通常运行在该模式下,在系统复位的时候或者应用程序调用svc指令的时候将会进入到当前模式下,系统调用就是通过svc指令完成)、中止模式(Abort mode,内存访问异常处理模式,常见的MMU fault就会跳转到该模式下进行相应的处理)、未定义模式(Undefined mode,当执行未定义的指令时,触发硬件异常,硬件上自动跳转到该模式下)、系统模式(System mode,系统模式,这个模式下将与用户模式共享寄存器视图)、安全模式(Monitor mode,针对安全扩展,在该模式下执行secure和non-secure处理器状态的切换(TrustZone架构),处理受信任的操作)、虚拟化模式(Hypervisor mode,用于虚拟化操作,管理虚拟机的执行(ARMv7-A架构扩展,支持虚拟化的CPU才有此模式))。
  5. 与ARMv7架构几乎相同意味着AArch32必须与ARMv7特权级别相匹配。还意味着AArch32只能处理ARMv7 32位通用寄存器。因此,ARMv8架构与AArch32执行状态所提供的视图之间必须有某种对应关系。执行状态AArch64和AArch32之间的切换意味着,AArch64寄存器必须映射到AArch32(ARMv7)寄存器集中。这种映射见P31。
第五章:ARMv8-A 指令集简介
  1. ARMv8架构添加了一个A64指令集,这个指令集对现有32位指令集架构进行了补充。这个指令集的添加,提供了访问64位宽整数寄存器和数据操作的权限,以及使用64位大小存储器指针的能力。新指令集被称为A64并在AArch64执行状态下执行。ARMv8 架构还包含原ARM指令集(现称为A32)和Thumb指令集(T32)。A32和T32指令集都在AArch32执行状态下执行,并且可向后兼容ARMv7。新A64指令集与现有A32指令集类似,指令宽度为32位,并具有相似语法。
  2. A64程序调用标准(PCS)在寄存器中传输多达八个参数(X0-X7)。相比之下,A32和T32仅在寄存器中传输四个参数,超出四个的参数在栈上传输。
  3. 一个应用程序无法使用两种执行状态的代码。ARMv8架构中A64与A32或T32指令集之间并无互通,A32与T32指令集之间有互通。用A64为ARMv8处理器编写的代码无法在ARMv7 Cortex-A系列处理器上运行。但为ARMv7-A处理器编写的代码可在AArch32执行状态的ARMv8处理器上运行。
第六章:A64指令集
  1. 与所有之前的ARM处理器一样,ARMv8架构是一个加载/存储架构,这意味着数据处理指令不直接对存储器中的数据进行运算。数据必须首先载入寄存器,经修改后再存入存储器。
  2. 常见指令分类:数据处理指令:算术和逻辑运算(ADD、SUB、ADDS、SUBS、MOV、CMP、BIC等等)、乘法和除法指令(MADD、MNEG、MUL、SDIV、UDIV等等)、移位运算(LSL、LSR、ASR、ROR等等)、位字段和字节操作指令(SXTB、SXTH、SXTW、UXTB、UXTH等等)、条件指令(ADC、CSEL、CSINC、CMP等等)(P47);存储器访问指令:加载指令(LDRB、LDRSB、LDUR等等,LDUR用于偏移量是负数时)、存储指令(STRB、STRSB、STUR等等)、浮点和NEON标量加载和存储(LDR、LDP等等,LDP指令用于从内存中加载一对连续的值到两个寄存器);流控制(B、BL、BR、RET、CBZ等等)、系统控制和其他指令(异常处理指令SVC #imm16、HVC #imm16、SMC #imm16,P63;系统寄存器访问:MRS、MSR;调试指令:BRK、HLT;提示指令:NOP、YIELD、WFE、WFI等等;NEON指令;浮点指令;密码指令)。
  3. 在A64中,对于存储器访问指令,地址操作数的基址寄存器必须始终是X寄存器。但一些指令支持零扩展或符号扩展,因此,可按照W寄存器提供32位偏移。A64中为加载或存储指令指定地址有以下几种方式:偏移方式、变址方式(分为前变址方式和后变址方式,P58)、程序计数器相对方式(加载-文字)。
  4. A64的其他与存储器访问的相关问题:访问多个存储单元(A64不包括可用于A32和T32代码的多加载(LDM)或多存储(STM)指令。在A64代码中,有“加载对”(LDP)和“存储对”(STP)指令。与A32的LDRD和STRD指令不同,任何两个整数寄存器都可被读取或写入,数据从相邻存储单元读取或写入)、无特权访问、存储器预取、非临时加载/存储对、存储器访问原子性、存储屏障和栅栏指令(DMB(Data Memory Barrier):用于内存访问排序,确保在屏障之前的所有内存访问在屏障之后的内存访问之前完成;DSB(Data Synchronization Barrier):更强的屏障,确保在屏障之前的所有内存访问和执行操作都完成后,才开始执行屏障之后的任何操作;ISB(Instruction Synchronization Barrier):用于指令流水线的同步,确保在屏障之前的所有指令执行完成后,才开始执行屏障之后的指令)、同步原语(LDXR指令从一个存储地址加载一个数值,并试图默默要求给地址上排它锁,成对LDXR/STXR 用于构建标准同步原语,P62)。
  5. 在ARM架构中,“文字库”(Literal Pool)是汇编编程中的一个重要概念,用于存储需要在程序中使用的常量数据。这些常量数据通常包括立即数(如地址、浮点数等)和字符串等。由于某些立即数无法直接编码到指令中,因此文字库提供了一种在代码段附近存储这些数据的方法,以便指令可以间接地引用它们。
第七章:AArch64 浮点和 NEON
  1. ARM高级SIMD架构、其相关实现以及支持软件通常被称为NEON技术。AArch32(等同于ARMv7 NEON架构)和AArch64都有NEON指令集,两者都可用于大幅加快对大数据集的重复操作。
  2. 在AArch64中,NEON单元将寄存器堆视为:32 × 128位四字寄存器(ARM中一个字的大小为4字节)——V0-V31:每个可划分为2X64通道、4X32通道、8X16通道、16X8通道(每个通道可理解为存储一个通道大小的向量的标量成员)。AArch64已取消ARMv7 NEON指令的V前缀,NEON指令如:ADD V0.4H, V1.4H, V4H(关于后缀4H参考P36的表4-9),可通过后面的操作数形式来判断上述命令为一个向量指令(ADD W0, W1, W2{, shift #amount}}则表示基础指令、ADD D0, D1, D2则表示浮点指令)(P71)。
  3. 标量数据和NEON:标量数据是指单值,而非包含多个值的向量。部分NEON指令使用标量操作数,寄存器内的标量通过获取值向量的索引访问。访问向量单个元素的通用数组符号为:<Instruction> Vd.Ts[index1], Vn.Ts[index2],Vd是目的寄存器,Vn是第一源寄存器,Ts是元素的大小说明符,例如:INS V0.S[1], V1.S[0]。
  4. 在AArch64中,浮点单元将NEON寄存器堆(32个128位寄存器)视为:32 × 64位D寄存器D0-D31。D寄存器称为双精度寄存器,包含双精度浮点值、32 × 32位S寄存器S0-S31。S寄存器称为单精度寄存器,包含单精度浮点值、32 × 16位H寄存器H0-H31。H寄存器称为半精度寄存器,包含半精度浮点值、或者上述情况的寄存器组合。浮点命令一般以F开头,如:FABS、FMUL、FADD、FSUB等等。
第八章:迁移至A64
  1. A64指令的一些变化:A64无法用与通用寄存器一样的方法访问程序计数器,因此有一个新的程序计数器相对寻址方式;A64取消了先前ARM架构的所有多存储器访问指令(批量加载或存储),这种架构能够从存储器读取或写入任意的寄存器列表。相反,应使用可对任意两个寄存器进行操作的加载对(LDP)和存储对(STP)指令,A64取消了PUSH和POP指令;ARMv8增加了加载和存储指令,包括单向存储屏障:加载-获取和存储-释放;AArch64不支持协处理器概念,包括CP15;在AArch64中,当前程序状态寄存器不作为单个寄存器存在。相反,PSTATE字段(例如 NZCV)可使用特殊寄存器访问;等等(P77)。
  2. 将代码从A32和T32指令集迁移至A64时要注意的点有:地址对齐、数据类型(各个数据类型对应所占据的内存大小)等。
第九章:ARM64位架构的应用程序二进制接口
  1. ARM架构的应用程序二进制接口(ABI)指定了所有可执行本机代码模块一起正常工作所必须遵守的基本规则。程序调用标准(PCS):指定了单独编写、编译以及汇编子例程, 从而实现共同工作的方式。它规定了调用例程与被调用者之间的合约,或例程及其执行环境之间的合约,例如调用例程或栈布局时的义务(P88)。
  2. AArch64程序调用标准中的寄存器使用:对于函数调用,通用寄存器划分为四组:自变量寄存器(X0-X7)、调用者保存临时寄存器(X9-X15)、被调用者保存寄存器(X19-X29)、专用寄存器(X8、X16-X18、X29、X30,其中X29是帧指针寄存器(FP),X30是链接寄存器(LR))

  3. ARM 64架构中NEON和浮点寄存器中的参数规则:V0-V7用于将多个自变量值传递到一个子例程,以及从一个函数返回结果值,它们还可以用于将中间值留在一个例程内(但一般情况下仅留在子例程调用之间);V8-V15必须由被调用者跨子例程调用保存;V16-V31不需要保存(或者说应该由调用者保存)(P94)。

第十章:AArch64异常处理
  1. RVBAR(Reset Vector Base Address Register)是一个寄存器,用于存储复位向量的地址。在ARM处理器中,RVBAR_ELn是指定复位向量地址的寄存器,其中n表示实现的最高异常级别的数量。不同的ARM处理器可能支持不同数量的异常级别,因此RVBAR_ELn寄存器的具体名称可能会有所不同。
  2. 执行特定指令可能产生异常。一般执行此类指令是为了请求在较高特权级别运行的软件提供服务,管理程序调用(SVC)指令使处于用户模式的程序可以请求操作系统服务,虚拟机管理程序调用(HVC)指令使客户操作系统可以请求虚拟机管理程序服务,安全监控程序调用(SMC)指令使普通域可以请求安全域服务。如果异常是因为在EL0级别取出指令而产生的,则将其作为一起异常送到EL1级别,除非HCR_ELTGE位设在非安全状态,这种情况下,将其送到EL2级别。如果异常是因为在任何其他异常级别取出指令而产生的,则异常级别保持不变(P96)。
  3. 在AArch32状态下,状态寄存器包括CPSR和SPSR,可以直接通过MRS和MSR指令进行访问和修改。这与ARMv7类似,操作简单直接。在AArch64状态下,状态寄存器管理更复杂。PSTATE包含处理器状态的各个字段,但不能整体访问,只能通过系统寄存器访问其字段(如NZCV、DAIF)。SPSR_ELx寄存器用于保存异常状态,并可以通过MRS和MSR指令整体访问和修改。AArch64提供更精细的状态管理和更复杂的异常处理机制,使得状态寄存器的访问和管理更灵活。
  4. 在AArch64中,异常可能同步也可能异步。如果异常是因为执行或尝试执行指令流而产生,并且返回地址提供了造成该异常的指令详情,则该异常被描述为“同步异常”。“异步异常”并非因为执行指令产生,同时,返回地址可能不会总是提供导致该异常的原因详情(P99)。
  5. 发生异常时,处理器必须执行对应于该异常的处理程序代码。存储器中存储处理程序的位置被称为“异常向量”。在ARM架构中,异常向量存储在一个表中,这个表被称为“异常向量表”。每个异常级别都有自己的向量表,即EL3、EL2和EL1各有一个。该表包含需要执行的指令,而不是一组地址。单个异常的向量位于距离表开头固定偏移量的位置。每个表基址的虚拟位置由向量基址寄存器VBAR_EL3、 VBAR_EL2 和 VBAR_EL1 设定。向量表的每个表项都是32条指令长(128字节)。相比于ARMv7,这本身就是一个显著变化。ARMv7每个项目只有4个字节。ARMv7向量表的这个间距意味着每个表项几乎始终以特定分支形式转移到存储器别处的实际异常处理程序。在AArch64中,向量之间的间距更宽,因此顶层的处理程序可以直接写入向量表。AArch64的异常向量表中异常被分为四大类:同步、IRQ、FIQ和SError(后面三个为异步异常)。
  6. GIC是ARM架构中用于中断管理的关键组件,它负责中断的分配、路由、优先级管理和状态维护。通过有效地管理中断,GIC确保系统能够高效、正确地响应和处理各种中断请求,提高系统的整体性能和可靠性(P107)。
第十一章:缓存
  1. 使用ARMv8-A架构的处理器,通常用两级或更多级的缓存来实现。这通常意味着处理器给每个核心都分配了小型的L1指令缓存和数据缓存。Cortex-A53和Cortex-A57处理器通常用两级或更多级的缓存来实现,即小型的L1指令缓存和数据缓存,以及大型的L2统一缓存——在一个集群中的多个核心之间共享。另外,可能有一个外部硬件模块形式的外置L3缓存,在集群之间共享。如下图:

  2. 缓存控制器是一种硬件模块,专门负责以一种在很大程度上对程序不可见的方式
  3. 管理高速缓冲存储器。它会自动从主存储器向缓存写入代码或数据。它处理核心
  4. 发出的读写存储器请求,对高速缓冲存储器或外存储器执行必要的动作(P117)。
  5. 一致性点(PoC)。对于一个特定的地址,PoC就是保证能够访问存储器的所有观察者(例如核心、DSP或DMA引擎)都看到存储单元同一个副本的点。 它通常是主外部系统存储器。统一点(PoU)。一个核心的PoU就是保证该核心的指令缓存、数据缓存和转换表遍历看到存储单元同一副本的点。例如,在有哈佛1级缓存和(用于缓存转换表项的)TLB的系统中,2级统一缓存就是统一点。如果不存在外缓存,主存储器就将是统一点。
第十二章:存储器管理单元
  1. 每个程序可以使用相同的虚拟存储地址空间,即使物理地址是碎片化的,也可以用连续虚拟存储映像进行处理,这个虚拟地址空间与系统中的实际物理存储映像分离。在虚拟存储空间中,可以写、编译和链接应用程序。“虚拟地址”是用户、编译器和链接器在将代码放入存储器时使用的地址,“物理地址”是实际硬件系统使用的地址。MMU使用虚拟地址的最高有效位来索引转换表中的表项,确定正在访问的存储块。MMU将代码和数据的虚拟地址转换成实际系统中的物理地址,转换在硬件中自动进行,并且对应用程序是透明的。除地址转换外,MMU控制着存储器每个区域的存储器访问权限、存储器访问排序和缓存策略。MMU使任务或应用程序的写入方式不需要它们知道系统的物理存储映像,或者可能同步运行的其他程序。这使得每个程序可以使用相同的虚拟存储地址空间操作系统通常同时运行或执行多个应用程序或任务,每个均有一组唯一转换表。作为任务之间上下文切换过程的一部分,内核从一个切换到另一个。但大部分存储系统仅由内核使用,并且有固定的虚拟到物理地址映射,其中转换表项很少更改。
  2. 在ARMv8-A架构中,内存管理单元(MMU)在进行虚拟地址(VA)到物理地址(PA)转换时,使用的页表结构是相同的,但不同异常级别(Exception Levels, EL)可以使用不同的页表转换表。每个异常级别可以有自己独立的转换表基址寄存器,用于指向不同的页表。EL0使用TTBR0_EL1的页表, EL1使用TTBR0_EL1和TTBR1_EL1的页表,EL2使用TTBR0_EL2, EL3使用TTBR0_EL3的页表。
  3. ARMv8架构界定了安全和非安全两种安全状态,并且还界定了两个物理地址空间,即安全和非安全物理地址空间,因此,普通域只可访问非安全物理地址空间,安全域可访问安全和非安全物理地址空间(P146)。
  4. 实现ARMv8-A架构的处理器一般用于以下系统,即运行复杂操作系统且有许多应用程序或任务同时运行的系统。每个进程在物理存储器中都有唯一转换表。应用程序启动时,操作程序给应用程序分配一组转换表项,该转换表项将应用程序所用的代码和数据映射到物理存储器。之后内核可更改这些表,以在额外空间映射。应用程序无法运行时,这些表被移除。因此,存储系统中可能有多个任务。内核调度程序定期将执行从一个任务传到另一个任务,这称为上下文切换,内核需要保存与进程相关的所有执行状态,并恢复下一个待运行进程的状态。内核也将转换表项切换到下一个待运行进程项。目前未运行任务的存储器受到全面保护,避开运行的任务。实际必须保存和恢复的内容在不同操作系统中各不相同,但一般进程上下文切换包括保存或恢复如下部分或所有元件:通用寄存器X0-X30、高级SIMD和浮点寄存器 V0-V31、一些状态寄存器、TTBR0_EL1和TTBR1_EL1、线程ID(TPIDxxx)寄存器、地址空间ID(ASID)
  5. 地址空间ID(ASID,Address Space Identifier)是ARM架构(以及其他一些处理器架构)中的一个机制,用于区分不同进程的地址空间,从而提高TLB的效率和减少上下文切换的开销。在使用虚拟内存的系统中,TLB用于缓存虚拟地址到物理地址的映射,以加快地址转换速度。然而,当系统在多个进程之间切换时,如果没有ASID机制,每次切换进程时都需要清空TLB,以防止一个进程的虚拟地址映射在另一个进程中被错误使用。每个TLB表项除了存储虚拟地址和物理地址映射外,还存储该映射所属进程的ASID,在进行地址转换时,系统不仅检查虚拟地址是否匹配,还检查当前进程的ASID是否与TLB表项中的ASID匹配。只有当两者都匹配时,TLB表项才被视为有效。因为TLB表项包含ASID信息,不同进程的TLB表项可以同时存在于TLB中而不会互相干扰。在进行上下文切换时,系统只需更新当前的ASID,而不需要清空整个TLB,这大大减少了上下文切换的开销。
第十三章:存储器访问排序
  1. ARMv8架构采用存储器的弱有序模型。一般而言,这意味着存储器访问顺序不需要与加载和存储操作的程序顺序相同。处理器能重新排列存储器读取操作的顺序。
  2. 在ARM体系结构中,存储器类型并不是直接在转换表(translation table)项中编码的,转换表项使用一个索引来引用存储器类型表中的条目,这个存储器类型表存储在一个称为MAIR_ELn(Memory Attribute Indirection Register)的寄存器中。MAIR_ELn 寄存器包含八个条目(表项),每个条目有8位,每个条目定义了一种存储器类型的属性。这些属性包括存储器的缓存策略、内存类型等。转换表项的索引:在转换表项中,不直接包含存储器类型的具体编码,而是包含一个3位的索引。这个索引用于查找MAIR_ELn寄存器中的相应条目,从而确定存储器的类型和属性。而TLB表项通常包括存储器类型的信息,这样处理器可以快速访问需要的存储器类型。
  3. ARM架构包括屏障指令,以强制要求在特定点执行访问排序和访问完成。在一些架构中,类似指令被称为栅栏。ISB指令用于刷新处理器的指令流水线,确保在它之前所有的指令已经执行完毕,并且之后的指令将重新从指令缓存或内存中获取。DMB指令确保在它之前的所有内存访问(读/写)在它之后的内存访问(读/写)之前执行。DSB指令确保在它之前的所有内存访问在它之后任意指令之前完成,DSB是一个更强的屏障,比DMB更严格。屏障用于阻止不安全优化发生,并强制执行特定存储器访问排序。因此,使用不必要的屏障指令会导致软件性能下降。仔细考虑在特定情况下是否需要屏障,如果需要,再仔细思考可使用的正确屏障(P153)。
第十四章:多核处理器
  1. 对称多处理(SMP)是一个动态确定单个核角色的系统架构,集群中的每个核都有相同的存储器视图和共享硬件视图,如两个或多个处理器(核心)共享同一个主存,并对称地访问所有系统资源(例如内存、I/O设备等)。在SMP系统中,所有处理器都平等地参与任务处理,没有主从关系,能够并行执行任务,提高系统的处理能力和性能。任何应用程序、进程或任务均可在任何核上运行,操作系统调度程序可在核之间动态迁移任务,以实现最佳系统加载。多线程应用程序可同时在几个核上运行,操作系统可对应用程序隐藏很多复杂性。
  2. 操作系统任务调度程序通常可将任务分布到系统中的整个可用核内。此功能被称为负载平衡,旨在获得更好的性能和/或节能。例如,对于某些类型的工作负荷,若将作为工作负荷一部分的任务在更少的核上进行调度,便可实现节能。因此,更多资源将在较长一段时间内闲置,从而节能。在其他情况下,若任务分布在更多核内,工作负荷的性能可能会提高。相比于在更少的核上运行,这些任务可向前进展得更快而相互不干扰。
  3. 非对称多处理(AMP)系统使得能够将单独角色静态地分配给集群中的一个核心,因此实际上核心是独立的,各个核心在各个集群中执行独立工作。这称为功能分配软件架构,并且通常表示OS在单独核心上独立运行。系统可能呈现为一个单核系统,有专用加速器执行某些关键系统服务。
  4. 异构多处理(HMP)一词用于多个不同上下文。ARM使用HMP来表示由多个应用处理器集群组成的系统,这些处理器在指令集架构上完全一样,但在微体系结构上却大不相同。所有处理器的缓存完全一致,并且这些处理器是相同一致性域的一部分。对此最好的解释是利用ARM实现HMP技术(称为大小核技术)。在大小核系统中,节能小核与高性能大核一致耦合,形成可以用最节能的方式完成高强度任务和低强度任务的系统(P164)。
  5. 独占监控器是一种硬件机制,通过LDREX和STREX指令的配合,确保处理器在多处理器环境下能够安全地进行原子操作和同步。这对于实现锁、原子变量和临界区保护等并发控制机制至关重要。在硬件中,核心包括命名为本地监控器的设备。该监控器监测核心。核心执行独占加载访问时,会记录本地监控器中的实际情况(P165)。
  6. 一致性是指确要保系统内所有处理器或总线主控器看到相同的存储器视图。它意味着保存在一个核心的缓存中的数据变更,其他核心也可见,因此核心无法看到陈旧、过时的数据(P167)。
第十五章:电源管理
  1. 功耗可划分为两个部分:静态功耗:也称漏电,这种情况在核心逻辑或RAM块通电时出现。一般而言,漏电与总硅面积成正比,表示芯片越大,漏电越多。与更小的芯片相比,漏电产生的功耗明显更多。动态功耗:之所以出现动态功耗是因为晶体管开关,并且动态功耗与核心时钟速度和改变每个周期状态的晶体管数量有关。很明显,更高的时钟速度和更复杂的核心,消耗的电能更多(P176)。
  2. ARM 核心通常支持如下几个级别的电源管理:待机、保持、断点、休眠模式、热插拔。
第十六章:大小核技术
  1. 大小核就是一个异构处理系统示例。此类系统通常包括几种不同类型的处理器,它们有不同的微体系结构。大小核技术将异质性向前推进了一步,因为它包含微体系结构不同但指令集体系结构兼容的通用处理器。此类系统常用的一个术语是异构多处理(HMP)HMP与非对称多处理(AMP)的不同之处在于,HMP系统中的所有处理器完全一致并运行相同的操作系统映像(P181)。根据性能要求,软件可以在大核或小核(或两种类型的)处理器上运行。如果需要最佳性能,可以使软件仅在大核处理器上运行。对于常规任务,软件可以在小核处理器上出色地运行。通过这种组合,大小核技术提供了一种解决方案,可以在最新移动设备热边界之内交付该设备要求的高性能,并且实现尽可能节能(P181)。
  2. 大小核系统中两种核心类型的缓存完全一致并共享相同的指令集体系结构(ISA)。相同的应用程序二进制接口在其中任何一个核心上运行而无需更改。处理器内部微体系结构的差异使其可以提供不同的电源和性能特征,此类特征是大小核概念的基础,这些通常由操作系统进行管理。
第十七章:安全
  1. TrustZone架构为系统设计者提供了一种帮助确保系统安全的方式,该方式利用TrustZone安全扩展 ,此外还确保外部设备安全。ARM安全模型分配设备硬件和软件资源,从而让这些资源存在于安全子系统的安全域或任何其他事物的普通域中,系统硬件确保无法从普通域访问任何安全域资产,安全设计将所有敏感资源置于安全域中,且理论上有强大的软件在运行(P188)。
第十八章:调试
  1. ARMv8处理器提供硬件特性,此类特性允许调试工具对核心活动进行有效的控制,并以非侵入方式收集大量关于程序执行的数据。 硬件特性分为两大类, 侵入式和非侵入式(P194)。

第十九章:ARMv8模型

其他
  1. ARM TrustZone是基于硬件的安全功能,它通过对原有硬件架构进行修改,在处理器层次引入了两个不同权限的保护域——安全世界和普通世界,任何时刻处理器仅在其中的一个环境内运行。同时这两个世界完全是硬件隔离的,并具有不同的权限,正常世界中运行的应用程序或操作系统访问安全世界的资源受到严格的限制,反过来安全世界中运行的程序可以正常访问正常世界中的资源。这种两个世界之间的硬件隔离和不同权限等属性为保护应用程序的代码和数据提供了有效的机制:通常正常世界用于运行商品操作系统(例如Android、iOS等),该操作系统提供了正常执行环境(Rich Execution Environment,REE);安全世界则始终使用安全的小内核(TEE-kernel)提供可信执行环境(Trusted Execution Environment,TEE),机密数据可以在TEE中被存储和访问。这样一来即使正常世界中的操作系统被破坏或入侵(例如iOS已被越狱或Android已被ROOT),黑客依旧无法获取存储在TEE中的机密数据。
  2. push支持同时将多个寄存器入栈,格式:{xx,xx},如:push {r0, r1,r2} (等同于STMFD命令),arm规定入栈顺序是先入栈序号低的寄存器到最低地址,被指定的寄存器顺序是无效的,所以push {r0, r1}和push{r1, r0}效果是一样的,即总是将r0入栈到低地址。出栈时总是将最低地址的栈空间的内容弹出到最低编号寄存器,pop {fp, lr}(等同于LDMFD命令),先从sp指向栈低地址处出栈内容到fp,再从高地址处出栈内容到lr中。
  3. EDA(Electronic Design Automation):电子设计自动化,是指用于设计、验证和制造电子系统的计算机辅助工具和软件。这些工具帮助工程师在设计复杂集成电路(IC)、印刷电路板(PCB)和系统级芯片(SoC)时提高效率、减少错误并优化性能。
  4. IP:代表知识产权的意思,是指一种事先定义、经过验证的、可以重复使用,能完成特定功能的模块,IP是构成大规模集成电路的基础单元,SoC甚至可以说是基于IP核的复用技术。IP一般分为硬核、软核和固核。硬核一般已经映射到特定工艺,经过芯片制造验证,具有面积和性能可预测的特点,但灵活性较小;软核以HDL形式(如Verilog、VHDL)提交,灵活性强,但性能方面具有不可预测性;固核通过布局布线或利用通用工艺库,对性能和面积进行了优化,比硬核灵活,比软核在性能和面积上更可预测,是硬核和软核的折中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值