【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】


下篇文章:ARMv8/v9 异常模型系列 1 – 处理器运行模式及EL3/EL2/EL1学习
下篇文章:ARMv8/v9 异常模型系列 3 - ARM64 Process State 介绍

1. ARMv8 异常模型简介

1.1 ARM Traps 的详细解释

Trap” 是计算机科学中常用的术语,它是一种由软件触发的中断或异常,用来调用操作系统内核的服务,或者响应可能的错误情况。

在ARM架构中,包括但不限于以下几种常见的 trap:

  • 系统调用:应用程序可以通过执行特殊的指令(例如SVC)来触发一个trap,请求操作系统内核提供服务,例如读写文件、创建进程等。

  • 异常处理:当发生一些异常情况,比如除以零、访问无效的内存地址、执行无效的指令等,处理器会触发一个trap,并跳转到预先定义好的异常处理程序。

  • 调试支持:调试器可以通过设置断点来触发trap,当程序执行到断点处时,处理器会触发一个trap,并将控制权交给调试器。例如ARM的BRK指令就可以用来生成一个软件断点。

当trap被触发时,处理器会保存当前的程序计数器等状态信息,然后跳转到预先定义好的处理程序。这个处理程序可以是操作系统内核的一部分,也可以是一个调试器的一部分。处理程序可以检查和修改处理器的状态,然后决定如何继续执行程序。

总的来说,trap是一种重要的机制,它使得软件可以与操作系统内核、调试器等更低层次的系统进行交互,也使得处理器可以更有效地响应错误和异常情况。

1.2 ARMv8-A General-Puspose Registers

ARM8v-A提供了31个通用寄存器,分别是X0-X30。还有SP、PC、XZR等寄存器, 每个寄存器是64bits,可以在任何 Exception Level访问。
在这里插入图片描述

表1-3 因为ARMv8-A为了兼容32位应用程序,所以放ARMv8-A中运行32位应用程序的时候,会时候 W0-W30 寄存器。只使用其中的低32位。

下面详细介绍写这些通用寄存器(general-purpose registers):
X0-X7 用于参数传递;
X9-X15 在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低,
在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低;
X19-X29 在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre,
在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre;
X8, X16-X18, X29, X30 这些都是特殊用途的寄存器
X8: 用于返回结果
X16、X17 :进程内临时寄存器
X18 :resrved for ABI
X29 :FP(frame pointer register)
X30 :LR:链接寄存器(LR)在进行子程序调用时存储返回地址。如果返回地址存储在堆栈中,它也可以用作通用寄存器, LR会映射到寄存器X30。

1.3 系统寄存器

ARMv8-A 除过提供了31个通用寄存器外,还提有一些非常重要的系统寄存器:
在这里插入图片描述
系统配置通过系统寄存器进行控制,并使用msrmrs指令进行访问。寄存器的名称会告诉你可以访问它的最低异常级别,具有后缀_ELn的系统寄存器在各异常级别中有一个独立的副本。

寄存器名称功能
SCR_EL3安全配置寄存器安全配置寄存器SCR_EL3是一个定义当前Security状态的配置寄存器,它指定EL0、EL1、EL2的安全状态,“安全”状态为“安全”或者“不安全”。
ELR_ELn异常链接寄存器存放异常返回地址
SP_ELn栈顶指针寄存器
SPSR
FAR_ELn错误的地址寄存器
ESR_ELn异常原因寄存器描述异常原因
CTR_EL0缓存寄存器与cpu缓存信息相关
ID_AA64ISAR0_EL1指令实现寄存器
TCR_ELn翻译控制寄存器用来控制MMU使用页表相关;x=1或者2
SCTLR_ELn系统控制寄存器用来控制mmu、缓存、对齐检查等ARM架构特性相关的特性 ,x=1或者2或者3
HCR_EL2虚拟化配置寄存器用来保存控制虚拟化状态,只能EL2使用
SCR_EL3安全配置寄存器用来保存控制安全状态,只能EL3使用

1.2.0 SCR_EL3 安全配置寄存器

在这里插入图片描述

位数名称含义
63RES0保留的
62NSE该字段表示根据SCR_EL3.NS,选择EL2及以下Exception级别的Security状态。
61:49RES0保留的
48GPF控制颗粒保护故障在EL0、EL1和El2的上报。
  • 0:异常从EL0、EL1或EL2不会路由到EL3;
  • 1:异常从EL0、EL1或EL2路由到EL3,并报告为颗粒保护检查异常。
47:42RES0保留的
41EnTP2在EL2、EL1和EL0上执行的trap指令(比如访问TPIDR2_EL0)陷入到EL3。
  • 0:这些指令会在EL2、EL1和EL0的执行时被捕获;
  • 1:任何指令的执行不会被捕获。
40TRNDRRNDR和RNDRRS读取是否捕获。
  • 0:不会导致RNDR和RDNRRS被捕获。;
  • 1:任何读取RNDR或RNDRRS的尝试都被陷入到EL3
39RES0保留的
38HXEn允许从EL3访问EL2上的HCRX_EL2寄存器。
  • 0:不允许,间接读会返回0;
  • 1:允许
37ADEn允许EL1和EL2上访问ACCDATA_EL1寄存器。
  • 0:在 EL1 at EL1和EL2访问ACCDATA_EL1会被捕获到EL3,除非访问被EL2细粒度trap捕获到EL2;
  • 1:访问ACCDATA_EL1不会被捕获。
36EnAS0在EL0, EL1或EL2触发ST64BVO指令异常是否路由到EL3。
  • 0:路由EL3;
  • 1:不会路由到EL3
35AMVOFFEN活动监视器虚拟偏移使能。
  • 0:使能,在EL2访问AMEVCNTVOFF0_EL2AMEVCNTVOFF1_EL2 寄存器会陷入到EL3;
  • 1:不使能
34TME允许在EL0、EL1和EL2上访问TSTART、TCOMMIT、TTEST和TCANCEL指令。
  • 0:不允许,定义为未定义指令;
  • 1:允许
33:30TWEDELTWE延迟。当SCR_EL3.TWEDEn为1,由SCR_EL3引起的WFE*陷阱的最小延迟为2的(TWEDEL + 8)次方,单位周期。
29TWEDEnTWE推迟启用。让由SCR EL3.TWE引起的WFE*指令延迟陷入可配置。
  • 0:陷入的延迟是已经定义的;
  • 1:陷入的延迟至少是SCR_EL3.TWEDEL中定义的周期数。
28ECVEnECV启用,启用对CNTPOFF_EL2寄存器的访问。
  • 0:EL2访问CNTPOFF_EL2会被捕获到EL3,;
  • 1:EL2访问CNTPOFF_EL2不陷入在EL3。
27FGTEn细粒度的陷阱使能。控制对HAFGRTR_EL2, HDFGRTR_EL2, HDFGWTR_EL2, HFGRTR_EL2, HFGITR_EL2,和HFGWTR_EL2,寄存器的访问。
  • 0:会陷入EL3;
  • 1:不会陷入EL3
26ATA分配标签访问,控制在EL2, EL1和EL0对分配标签的访问。
  • 0:避免对分配标签的访问,访问GCR_EL1, RGSR_EL1, TFSR_EL1, TFSR_EL2 或者TFSRE0_EL1会出现未定义指令异常并且陷入EL3
  • 1:允许对分配标签的访问
25EnSCXT使能对SCXTNUM_EL2SCXTNUM_EL1SCXTNUM_ELO 寄存器的访问。
  • 0:不使能,访问读取返回0并且会陷入EL3;
  • 1:使能
24:22RES0保留的
21FIEN故障注入启用。在EL1和EL2访问寄存器ERXPFGCDN_EL1, ERXPFGCTL_EL1ERXPFGF_EL1的结果。
  • 0:从EL1和EL2访问指定的寄存器会产生一个到EL3的Trap异常;
  • 1:任何指令不会被被捕>获
20NMEA屏敝外部中止。当SCR_EL3.EA 等于1时,
  • 0:SError中断不会路由到EL3;
  • 1:由PSTATE.A.决定是否把SError中断路由到EL3
19EASE外部中断到SError中断向量。同步执行到EL3的外部终止异常会被执行到的位置,
  • 0:VBAR_EL3相对应的同步异常向量;
  • 1:VBAR_EL3相对应的SError中断向量。
18EEL2安全EL2启用。
  • 0:与Secure EL2相关的行为都被禁用;
  • 1:与Secure EL2相关的行为都已启用。
17API控制与指针身份验证相关的下列指令的使用。
  • 0:任何与指针验证相关的指令的使用都会被捕获到EL3;
  • 1:指令不会被捕获。
16APK当APK被设置为1,对持有EL1或EL2指针认证“键”值的寄存器的访问被捕获到EL3,除非它们由于HCR_EL2.APK位或其他陷阱而被捕获到EL2。
15TERRTrap错误记录访问。
  • 0:不产生异常;1:从EL1和EL2访问指定的寄存器会产生一个到EL3的Trap异常。
14TLOR
  • 0:不产生异常;
  • 1:如果EL1和EL2访问的LOR寄存器不是未定义的,则被捕获到EL3,除非它被捕获到HCR_EL2
13TWE当被设置为1,在任何低于EL3的异常级别上执行WFE指令的任何尝试都会被捕获到EL3
12TWI当被设置为1,在任何低 于EL3 的异常级别上执行WFI指令的任何尝试都会被捕获到EL3
11ST当被设置为1, Secure EL1访问 counter timer 物理安全计时器寄存器会被捕获到EL3
10RW对较低异常级别的执行状态控制。
  • 0:低层的特权等级全部都是AArch32;
  • 1:低一层的特权等级是 AArch64
9SIF安全指令取出。当PE处于Secure状态时,在翻译的第一阶段标记为Non-secure,该位决定是否允许从翻译的第一阶段标记为不安全的内存中提取安全状态指令。
  • 0:允许;
  • 1:不允许
8HCEHypervisor调用指令启用。
  • 0:HVC指令未定义的;
  • 1:在EL3、EL2、EL1使能HVC指令。
7SMD安全监控呼叫禁用。
  • 0:SMC指令在EL3、EL2和EL1使能;
  • 1:SMC指令未定义的。
6RES0保留的
5:4RES1保留的
3EA外部中止和错误中断路由。当在EL3以下的异常级别执行时,External abortsSError中断会不会被路由到EL3。
  • 0:不会,但是在EL3时,SError中断不会被处理,外部中止中断会被处理>;
  • 1:会
2FIQ物理FIQ路由。 当在EL3以下的异常级别执行时,物理FIQ中断会不会被路由到EL3。
  • 0:不会,但是在EL3执行时,不使用物理FIQ中断;
  • 1:会。
1IRQ物理IRQ路由。 当在EL3以下的异常级别执行时,物理IRQ中断会不会被路由到EL3。
  • 0:不会,但是在EL3执行时,不使用物理IRQ中断;
  • 1:会。
0NS不安全位。该字段与SCR_EL3.NSE选择EL2及更低异常水平的安全状态。
NSE0时:
  • 0:安全;
  • 1:不安全。
    NSE1时:
  • 0:保留;
  • 1:领域

1.2.1 ELR_ELn 异常链接寄存器

在这里插入图片描述

有三个异常链接寄存器,ELR_EL1ELR_EL2ELR_EL3,对应3个异常级别。

当发生异常时,目标异常级别的异常链接寄存器存储在异常处理完成后跳转到的返回地址。
如果异常取自AArch32状态,则ELR中的前32位都设置为零。异常级别内的子程序调用使用LR存储子程序的返回地址。
例如,当异常级别从EL0更改为EL1时,返回地址存储在ELR_EL1中。

1.2.2 SP_ELx 寄存器

在这里插入图片描述

Stack Pointer: 栈顶指针寄存器,用来描述各个栈顶的指针寄存器。这个寄存器在每个EL都会存在一个SP_EL0, SP_EL1, SP_EL2, SP_EL3. 通过此寄存器就可以确定当前在那个EL

1.2.3 SPSR 寄存器

当异常发生时,处理器的状态将会被保存到相关的SPSR寄存器中。异常发生后,在处理异常之前,处理器会自动的将PSTATE寄存器的内容保存到SPSR中,异常返回时,会将SPSR保存的处理器状态恢复到PSTATE中。ARMv8定义的SPSR寄存器如下,兼容ARMv7中的SPSR寄存器,只使用低32位。
在ARMv8架构中,有3个SPSR寄存器,分别为SPSR_EL1SPSR_EL2SPSR_EL3。使用那个SPSR寄存器依赖于异常级别。若异常级别为EL1,则使用SPSR_EL1,若异常级别为EL2,则使用SPSR_EL2,若异常级别为EL3,则使用SPSR_EL3
ELR_ELn和SPSR_ELn寄存器和异常级别相关联,始终保存着低于当前异常级别的处理器状态。
在这里插入图片描述

位域功能
N符号位(N flag)
Z0标志(Z flag)
C操作进位(C flag)
V溢出标志(V flag)
Q
IT[1:0]
DIT
SSBS
PAN
SS用于软件调试。异常发生的时候,通过设置MDSCR_EL1.SS为1启动单步调试机制
IL不合法的执行状态(非法异常),保存自PSTATE.IL
GT
IT[7:2]
E
A软件错误掩码位
IIRQ掩码位
FFIQ掩码位
T
M[4]发生异常时处理器的执行状态,0表示AArch64
M[3:0]M[3:2]发生异常的级别;M[1]保留;M[0]根据此选择栈指针寄存器,
  • 0表示t;
  • 1表示h。可以通过异常级别的栈指针后缀表明所选的栈指针
    在这里插入图片描述

1.2.4 FAR_ELx 寄存器

在这里插入图片描述

FAR_ELx (Fault Address Register) 错误的地址寄存器:
当取指令或取数据时,PC对齐错误或者watchpoint异常(PC alignment fault and Watchpoint exceptions),会将错误的地址填入到该寄存器中。

1.2.5 ESR_ELn Register

异常原因寄存器,ESR_ELn寄存器有三段标志位。
在这里插入图片描述
ESR_ELn寄存器的第一段是 ECbits[31:26],标志了39个异常原因。
在同步异常或 SError中断异常,ESR_ELn 负责给出异常发生的原因。
ESR_ELn寄存器同样是3个特权异常等级都有的。

  • 第一类是 WFI/WFE(wait for interrupt/event,停止时钟但不断电)指令的异常。
  • 第二类是 MCR/MRC/MCRR/MRRC/LDC/STC等指令产生的异常,这些一般都是在搬数据。
  • 第三类是其他 SVE(可扩展向量??不太清楚) SIMD(单次执行多操作数) VMRS(浮点计算结果相关)产生的异常。该类是 Illegal Execution state的异常,PSTATE.IL置位后还执行了命令。
  • 第四类是 SVC HVC SMC异常,就是对syscall、hypercall、EL3切换的支持了。
  • 第五类是 ERET(异常返回指令) ERETAA ERETAB指令执行的异常。
  • 第六类是指令中止、数据中止类异常,包含从低EL级向高EL级以及同EL级的异常。
  • 第七类是PC SP对齐异常。
  • 第八类是debug相关的异常。

ESR_ELn 寄存器的第二段 IL bit[25],这个位指示同步异常的指令长度,0对应16bit,1为32bit,当抓到32bit指令的异常,这个值还会在如下异常用到:

  • SError中断异常
  • 指令中止异常
  • PC、SP对齐失败异常
  • 数据中止异常
  • Illegal Execution state异常
  • debug异常
  • 未知异常

ESR_ELn寄存器的第三段 ISS Instruction specific syndrome field, bit[24:0]
是在 EC 段指定异常后的一些附带信息,这一区域对于不同类型的异常可以被独立定义,但是实际使用中,一些ISS编码被用于不止一种异常类型。

Bitsfielddescription
[63:37]Reserved, RES0,读为零
[36:32]ISS2
[31:26]EC(Exception Class)异常原因:
  • EC == 0b000000 未知原因
  • EC == 0b000001,执行了WFI指令
  • EC == 0b000011 执行 MCR或者MRC,AArch32 状态下
  • EC == 0b000100 执行 MCRR 或者 MRRC,AArch32 状态下
  • EC == 0b000101 执行 MCR或者MRC (coproc==0b1110)
  • EC == 0b000110 LDC or STC access
  • EC == 0b000111 Access to SME, SVE, Advanced SIMD or floating-point functionality
  • EC == 0b001001 Pointer authentication instruction
  • EC == 0b001010 执行 LD64B或者ST64B执行导致的
  • EC == 0b001100 MRRC 指令导致
  • EC == 0b001110 Illegal Execution state异常
  • EC == 0b010011 执行 SMC 指令在 AArch32 状态下
  • EC == 0b010101 执行 SVC指令在AArch 状态下
  • EC == 0b010110 执行 HVC指令在AArch64状态下
  • EC == 0b010111 执行 SMC指令在AArch 状态下
[25]IL(Instruction Length)显示异常时的指令长度:
  • 0b0 16-bit instruction trapped
  • 0b1 32-bit instruction trapped
[24:0]ISS(Instruction Specific Syndrome)不同的异常类型有不同的含义:
  • 在这里插入图片描述在这里插入图片描述

1.2.6 MAIR_ELx Regiser

MAIR_EL1, (Memory Attribute Indirection Register) 内存属性寄存器:
配置内存的属性,如:

  • Tagged Normal Memory;
  • Normal memory;
  • Device memory

如果是 Normal memory,那么 inner 和 Outer 的配置是 Write-Through /Write-back/write Allocate/write non-Allocate等 属性。

1.2.7 SCTLR_ELx Register

系统控制寄存器SCTLR是一个用来控制标准内存、配置系统能力、提供处理器核状态信息的寄存器,包括SCTLR_EL1SCTLR_EL2SCTLR_EL3,但并不是所有bit在EL1都可用。
在这里插入图片描述

寄存器各个字段介绍

bit含义
UCI设置此位后,在AArch64中为DC CVAU、DC CIVAC、DC CVAC和IC IVAU指令启用EL0访问。
EE异常字节顺序。
  • 0表示小端,
  • 1表示大端。
EOEEL0显式数据访问的字节序。
  • 0表示小端,
  • 1表示大端。
WXN写权限不可执行 XN (eXecute Never)。
  • 0表示可写区域不设置不可执行权限(XN),
  • 1表示可写区域强制为不可执行(XN)
nTWE不陷入WFE,此标志为1表示WFE作为普通指令执行
nTWI不陷入WFI, 此标志为1表示WFI作为普通指令执行
UCT此标志为1时,开启AArch64的EL0下访问CTR_EL0寄存器
DNEEL0 下访问 DC AVA指令,
  • 0 禁止执行,
  • 1 允许执行
I开启指令缓存,这是在EL0和EL1下的指令缓存的启用位。对可缓存的正常内存的指令访问被缓存。
UMA用户屏蔽访问。当EL0使用AArch64,控制从EL0的中断屏蔽访问。
SED禁止SETEND。在EL0使用AArch32禁止SETEND指令。
  • 0 使能,
  • 1 禁止
ITD禁止IT指令。
  • 0表示IT指令有效,
  • 1表示IT指令被当作16位指令。仅另外16位指令或32位指令的头16位可以使用
CP15BEN CP15 barrier使能。如果实现了,它是AArch32 CP15 DMB,DSB和ISB barrier操作的使能位
SA0EL0的栈对齐检查使能位
SA栈对齐检查使能位
C数据cache使能。EL0和EL1的数据访问使能位。对cacheable普通内存的数据访问都被缓存
A对齐检查使能位
M使能MMU

在 AArch32状态下,有HSCTLRsctlr 寄存器,其中sctlr寄存器是banked:

  • SCTLR (NS)
  • HSCTLR
  • SCTLR (S)

重要的三个bit位:

  • I : Instruction cache enable
  • C : data cache enable
  • M : mmu enable

1.2.8 TCR_ELx Register 翻译控制寄存器

翻译控制寄存器是第1阶段翻译状态的控制寄存器,包括TCR_EL1TCR_EL2TCR_EL3
在这里插入图片描述

位数名称含义
63:60RES0保留的
59DS当在翻译制度的第1阶段使用4KB和16KB翻译粒时,该字段影响52位输出寻址,包括翻译描述符、块描述符、页描述符的输出情况
58TCMA1控制未检查访问的生成,
  • 0:对EL1上未检查访问是不会影响其他。
  • 1:在EL1的所有访问都是未检查的。
57TCMA0控制未检查访问的生成,
  • 0:对EL0上未检查访问是不会影响其他。
  • 1:在EL0的所有访问都是未检查的。
56E0PD1对由TTBR1_EL1转换的任何地址的非特权访问的故障控制。
  • 0:对由TTBR1_EL1转换的任何地址的非特权访问都不会产生错误;
  • 1:对由TTBR1_EL1转换的任何地址的无特权访问将产生0>级转换错误。
55E0PD0对由TTBR1_EL0转换的任何地址的非特权访问的故障控制。
  • 0:对由TTBR1_EL0转换的任何地址的非特权访问都不会产生错误;
  • 1:对由TTBR1_EL0转换的任何地址的无特权访问将产生0>级转换错误。
54NFD1该位控制是否对使用TTBR1_EL1转换的虚拟地址进行无错误的非特权访问,以响应是否执行阶段1转换表遍历。
  • 0:不禁用使用TTBR1_EL1的阶段1翻译表遍历;
  • 1:使用TTBR1_EL1转换的虚拟地址上的TLB错过会导致访问失败,而不会发生异常。不执行第1阶段的翻译表行走
53NFD1该位控制是否对使用TTBR0_EL1转换的虚拟地址进行无错误的非特权访问,以响应是否执行阶段1转换表遍历。
  • 0:不禁用使用TTBR0_EL1的阶段1翻译表遍历;
  • 1:使用TTBR0_EL1转换的虚拟地址上的TLB错过会导致访问失败,而不会发生异常。不执行第1阶段的翻译表行走
52TBID1使用指令地址的顶部字节进行地址匹配控制 。
  • 0:TCR_EL1.TBI1适用于指令访问和数据访问;
  • 1:TCR_EL1.TBI1仅适用于数据访问。
51TBID0使用指令地址的顶部字节进行地址匹配控制 。
  • 0:TCR_EL1.TBI0适用于指令访问和数据访问;
  • 1:TCR_EL1.TBI0仅适用于数据访问。
50HWU162TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[62]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
49HWU161TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[61]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
48HWU160TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[60]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
47HWU159TTBR1_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[59]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
46HWU062TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[62]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
45HWU061TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[61]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
44HWU060TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[60]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
43HWU059TTBR0_EL1进行翻译的阶段1的时候,翻译表块或页条目的位[59]能否实现定义的硬件使用。
  • 0:不能;
  • 1:可以
42HPD1分级权限禁用,影响TTBR1 EL1指向的翻译表中的一些控制位。
  • 0:启用分级权限;
  • 1:禁用分级权限
41HPD10分级权限禁用,影响TTBR0 EL1指向的翻译表中的一些控制位。
  • 0:启用分级权限;
  • 1:禁用分级权限
40HD从EL0和EL1转换阶段1脏态的硬件管理。
  • 0:禁用脏状态的阶段1硬件管理;
  • 1:启用脏状态的阶段1硬件管理
39HA从EL0和EL1翻译的阶段1硬件访问标志更新。
  • 0:阶段1访问标志位更新被禁用;
  • 1:阶段1访问标志位更新启用。
38TBI1最高字节忽略。
  • 0:地址计算中使用的Top字节匹配TTBR1_EL1区域的地址;
  • 1:地址计算中忽略的Top字节
37TBI0最高字节忽略。
  • 0:地址计算中使用的Top字节匹配TTBR0_EL1区域的地址;
  • 1:地址计算中忽略的Top字节
36ASASID大小。
  • 0:8位,除了回读寄存器外,TTBRO_ELT和TTBR1_EL1的高8位被硬件忽略;
  • 1:16位,TTBRO_EL1和TTBR1_EL1的高16位用于在TLB中分配和匹配。
35RES0保留的
34:32IPS中间物理地址大小。
  • 000:32位,4GB;
  • 001:36位,64GB;
  • 010:40位,1TB;
  • 011:42位,4TB;
  • 100:44位,16TB;
  • 101:48位,256TB;
  • 110:52位,4PB
31:30TG1TTBR1_EL1的颗粒大小。
  • 01:16KB;
  • 10:4KB;
  • 11:64Kb
29:28SH1与使用TTBR1_EL1的翻译表有关的内存的可共享性属性。
  • 00:不共享;
  • 10:外部可共享;
  • 11:内部可共享
27:26ORGN1与使用TTBR1_EL1的翻译表有关的内存的外部缓存属性。
  • 00:不缓存;
  • 01:写回的读写缓存;
  • 10:写穿的读缓存写不缓存;
  • 11:写回的读缓存写不缓存
25:24IRGN1与使用TTBR1_EL1的翻译表有关的内存的内部缓存属性。
  • 00:不缓存;
  • 01:写回的读写缓存;
  • 10:写穿的读缓存写不缓存;
  • 11:写回的读缓存写不缓存
23EPD1控制是否在TLB miss上对使用TTBR1_EL1进行转换的地址执行转换表遍历。
  • 0:使用TTBR1_EL1执行翻译表遍历;
  • 1:不执行翻译表遍历
22A1选择是否是TTBR0_EL1或TTBR1_EL1定义ASID。
  • 0:TTBR0_EL1.ASID定义了ASID;
  • 1:TTBR1_EL1.ASID定义了ASID
21:16T1SZTTBR1_EL1寻址的内存区域大小偏移量。区域大小为2的(64-T1SZ)次方字节。T1SZ的最大值和最小值取决于翻译表的级别和内存翻译粒度大小。
15:14TG0TTBR0_EL1的颗粒大小。
  • 01:16KB;
  • 10:4KB;
  • 11:64Kb
13:12]SH0与使用TTBR0_EL1的翻译表有关的内存的可共享性属性。
  • 00:不共享;
  • 10:外部可共享;
  • 11:内部可共享
11:10ORGN0与使用TTBR0_EL1的翻译表有关的内存的外部缓存属性。
  • 00:不缓存;
  • 01:写回的读写缓存;
  • 10:写穿的读缓存写不缓存;
  • 11:写回的读缓存写不缓存
9:8IRGN0与使用TTBR0_EL1的翻译表有关的内存的内部缓存属性:
  • 00:不缓存;
  • 01:写回的读写缓存;
  • 10:写穿的读缓存写不缓存;
  • 11:写回的读缓存写不缓存
7EPD0控制是否在TLB miss上对使用TTBR0_EL1进行转换的地址执行转换表遍历。
  • 0:使用TTBR0_EL1执行翻译表遍历;
  • 1:不执行翻译表遍历
6RES0保留的
5:0T0SZTTBR0_EL1寻址的内存区域大小偏移量。区域大小为2的(64-T0SZ)次方字节。T0SZ的最大值和最小值取决于翻译表的级别和内存翻译粒度大小。

1.2.9 CTR 缓存寄存器

缓存寄存器(CTR)是一个提供有关缓存架构的信息的寄存器,硬件上只有一个,就是CTR_EL0,所以特权和非特权状态都是访问它。
在这里插入图片描述

位数名称含义
63:38RES0保留的
37:32TminLine标签最低线。在所有可以包含由PE控制的分配标签的缓存中,最小的缓存行中分配标签所覆盖的大小为2的n次方,单位为4字节。
31RES1保留的
30RES0保留的
29DIC指令缓存无效要求数据与指令一致性。
0: 数据与指令的一致性,需要指令缓存失效到统一点。
1:指令缓存失效到统一点,不需要数据到指令一致性。
28IDC数据缓存清理要求指令数据一致性。
0:数据缓存清理到统一点是要求指令的数据一致性;
1:数据缓存清理到统一点是不需要指令的数据一致性。
27:24CWG回写缓存颗粒。当缓存条目中的某个内存位置被修改后,删除该缓存条目可以覆盖的最大内存大小为2的n次方。
23:20ERG独占保留粒度,保留粒度的最大大小为2的n次方,单位4字节
19:16DminLinePE控制的所有数据缓存和统一缓存中最小的缓存行大小为2的n次方,单位4字节
15:14L1Ip一级指令缓存策略。指示L1指令缓存的索引和标记策略。
  • 00:只有FEAT_VPIPT被实现才能用;
  • 01:使用ASID+虚拟地址索引域和虚拟地址的标记域;
  • 10:使用虚拟地址的索引域和物>理地址的标记域;
  • 11:使用物理地址的索引域和物理地址的标记域
13:4RES0保留的
3:0IminLine由PE控制的所有指令缓存中最小的缓存行大小为2的n次方,单位为4字节

1.2.10 HCR_EL2 虚拟化配置寄存器

虚拟化配置寄存器(HCR_EL2)是一个用来为虚拟化提供配置控制的寄存器,包括定义各种操作是否被捕获到EL2。
在这里插入图片描述

位数名称含义
63:60TWEDELTWE延迟: 当HCR_EL2.TWEDEn为1,由HCR_EL2引起的WFE*陷阱的最小延迟为2的(TWEDEL + 8)次方,单位周期。
59TWEDEnTWE推迟启用: 让由HCR EL2.TWE引起的WFE*指令延迟陷入可配置。
0:陷入的延迟是已经定义的;
1:陷入的延迟至少是SCR_EL3.TWEDEL中定义的周期数。
58TID5陷入ID组5:
0:任何指令不会被捕获;
1:在EL1和EL0访问ID组寄存器5会被捕获到EL2
57DCT默认的可缓存性标记。当HCR_EL2.DC实际上控制的是阶段1翻译被视为标记还是或未标记的。
  • 0:未标记的;
  • 1:标记的
56ATA分配标签访问,控制在EL1和EL0对分配标签的访问。
0:避免对分配标签的访问,访问GCR_EL1, RGSR_EL1, TFSR_EL1, TFSR_EL2 或者TFSRE0_EL1会出现未定义指令异常并且陷入EL2;
1:允许对分配标签的访问
55TTLBOS操作于外层共享域的TLB维护陷入指令。当EL2在当前的Security状态中启用时,在EL1执行TLB*指令会导致,
0:任何指令不会被捕获。
1:指定指令的执行被陷入在EL2中。
54TTLBIS操作于内部共享域的TLB维护陷入指令。当EL2在当前的Security状态中启用时,在EL1执行TLB*指令会导致,
0:任何指令不会被捕获。
1:指定指令的执行被陷入在EL2中。
53EnSCXT启用对SCXTNUM_EL1和SCXTNUM_EL0寄存器的访问。
0:当HCR_EL2.E2H为0或者HCR_EL2.TGE为0,则访问寄存器会导致未定义指令异常并且陷入EL2;
1:访问寄存器不会导致陷入EL2
52TOCU操作到统一点的缓存维护陷入指令。当EL2在当前安全状态下启用时,将这些缓存维护指令的执行捕捉到EL2。
0:任何指令不会被捕获;
1:指定指令的执行会被困在EL2
51AMVOFFEN活动监视器虚拟偏移使能。
0:活动监视器的虚拟化被禁用。间接读取虚拟偏移寄存器是零;
1:启用了活动监视器的虚拟化
50TICABICIALLUIS/IC IALLUIS缓存维护陷入指令。当EL2在当前安全状态下启用时,在EL1到EL2处捕捉那些缓存维护指令的执行。
0:任何指令不会被捕获。
1:指定指令的执行被陷入在EL2中
49TID4陷入ID组4。
0:任何指令不会被捕获;
1:在EL1和EL0访问ID组寄存器4会被捕获到EL2
48GPF控制颗粒保护故障在EL0、EL1的上报。
0:异常从EL0、EL1不会路由到EL2;
1:异常从EL0、EL1路由到EL2,并报告为颗粒保护检查异常。
47FIEN故障注入启用。在EL1访问寄存器ERXPFGCDN_EL1, ERXPFGCTL_EL1和ERXPFGF_EL1的结果。
0:从EL1访问指定的寄存器会产生一个到EL2的Trap异常;
1:任何指令不会被被捕获
46FWB强迫写回。定义在2阶段转换机制的组合缓存属性。
45NV2嵌套的虚拟化。改变HCR_EL2的行为。(NV1, NV)为硬件提供一种能够将系统寄存器的读写转换为内存的读写的机制。
0:该位对HCR EL2的行为没有影响;
1:如果HCR_EL2{NV1, NV} 开启了,则将寄存器的读/写转换为对内存的读/写和将EL2寄存器重定向到EL1寄存器。
44AT地址转换。当 EL2 在当前安全状态下启用时,在EL1执行AT S1E0R, AT S1E0W, AT S1E1R, AT S1E1W, AT S1E1RP, AT S1E1WP地址转换指令是否会被捕获到EL2。
  • 0:不会;
  • 1:会
43NV1嵌套的虚拟化:
  • 0:没有作用;
  • 1:如果HCR_EL2.NV2为1 ,从EL1到实现的EL2寄存器的访问被转换为load和store;如果HCR_EL2.NV2为0,EL1访问VBAR_EL1, ELR_EL1, SPSR_EL1会陷入EL2
42NV嵌套的虚拟化。
0:没有作用;
1:如果HCR_EL2.NV20 ,EL1对指定寄存器的访问或指定指令的执行被捕获到EL2,如果HCR_EL2.NV21,重新定义EL1的寄存器,使用SPSR_EL2, ELR_EL2, ESR_EL2,和FAR_EL2代替SPSR_EL1, ELR_EL1, ESR_EL1FAR_EL1
41API控制与指针身份验证相关的下列指令的使用。
  • 0:任何与指针验证相关的指令的使用都会被捕获到EL2;
  • 1:指令不会被捕获。
40APK当APK被设置为0,当EL2在当前安全状态下启用时,对保存指针身份验证“键”值的寄存器的访问被捕获到EL2。
39TME允许在EL0、EL1上访问TSTARTTCOMMIT、TTEST和TCANCEL指令。
0:不允许,定义为未定义指令;
1:允许
38MIOCNCE使能用于EL1和EL0的翻译机制的不匹配的内部/外部缓存的非一致性。对于EL1&0翻译机制,对于使用共享性和缓存性的通用定义的内存位置的允许访问,如果这些访问的内部缓存属性与外部缓存属性不同,
0:那么一定不会失去一致性;
1:可能会失去一致性
37TEA路由同步外部中止异常到EL2:
0:异常不会从EL0和EL1路由到EL2;
1:当前Security状态下启用时,如果EL0和EL1的同步外部中止异常没有路由到EL3,则路由到EL2。
36TERR陷入错误记录访问: 从EL1陷入到EL2读取的RAS错误寄存器。
0:任何指令不会被捕获。
1:当EL2在当前安全状态下被启用时,访问EL1指定的寄存器会生成一个到EL2的陷入异常。
35TLOR陷入LOR寄存器。非安全的EL1访问LORSA_EL1, LOREA_EL1, LORN_EL1, LORC_EL1, 和 LORID_EL1
0:不产生异常;
1:被捕获到EL2
34E2HEL2主机,启用主机操作系统在EL2中运行。
  • 0:在EL2上支持主机操作系统的设施被禁用。
  • 1:在EL2上支持主机操作系统的设施被启用。
33ID禁用阶段2指令访问缓存:
0:这种控制对EL1和EL0翻译体系的第二阶段没有影响;
1:强制所有对普通内存的指令访问的第二阶段转换为不可缓存。
32CD禁用阶段2数据访问缓存:
0:这种控制对EL1和EL0翻译体系的第二阶段没有影响;
1:强制所有对普通内存的指令访问的第二阶段转换为不可缓存。
31RW对较低异常级别的执行状态控制:
0:低层的特权等级全部都是AArch32;
1:低一层的特权等级是 AArch64
30TRVM陷入读取虚拟内存控制。从EL陷入到EL21读取虚拟内存控制寄存器。
0:任何指令不会被捕获。
1:当EL2在当前安全状态下启用时,对指定虚拟内存控件的EL1读访问被捕获到EL2。
29HCDHVC指令禁用:
0:在EL2和EL1上启用HVC指令执行;
1:HVC指令在EL2和EL1是未定义的,任何产生的异常都被带到执行HVC指令的异常级别。
28TDZDC ZVA指令陷入: 当EL2在当前Security状态下启用时,在EL0和EL1执行DC ZVA指令将陷入EL2。
  • 0:不会陷入;
  • 1:当EL2在当前Security中启用时,任何试图执行该指令会被捕获到EL2。
27TGE陷入一般异常:
0:对ELO的执行没有影响;
1:当EL2在当前安全状态下未启用时,对EL0没有影响。当EL2在当前安全状态下启用时,所有异常路由到EL2
26TVM虚拟内存控制陷入:
0:任何指令不会被捕获;
1:当EL2在当前安全状态下启用时,对指定的EL1虚拟内存控制寄存器的EL1写访问被捕获到EL2。
25TTLBTLB维护指令陷入:
0:任何指令不会被捕获;
1:当EL2在当前安全状态下启用时,在EL1执行指定的TLB维护指令会被捕获到EL2。
24TPU缓存维护指令陷入,操作到统一点。
0:任何指令不会被捕获;
1:当EL2在当前安全状态下启用时,在EL1执行指定的缓存维护指令会被捕获到EL2。
23TPCP数据或统一的缓存维护指令陷入,操作到一致性或持久性点:
0:任何指令不会被捕获;
1:当EL2在当前安全状态下启用时,在EL1执行指定的缓存维护指令会被捕获到EL2。
22TSW数据或通过“设置/方式”操作的统一缓存维护指令陷入。
0:任何指令不会被捕获;
1:当EL2在当前安全状态下启用时,在EL1执行指定的缓存维护指令会被捕获到EL2。
21TACR辅助控制寄存器陷入:
0:任何指令不会被捕获;
1:当EL2在当前安全状态下启用时,在EL1访问辅助控制寄存器会被捕获到EL2。
20TIDCP实现定义的功能陷入:
0:任何指令不会被捕获;
1:当EL2在当前Security状态中启用时,EL1访问或执行保留的指定编码实现定义功能被捕获到EL2。
19TSCSMC 指令陷入:
  • 0:任何指令不会被捕获;
  • 1:当EL2在当前安全状态下启用时,在EL1执行smc指令会被捕获到EL2。
18TID3陷入ID组3。
0: 任何指令不会被捕获;
1:在EL1和EL0访问ID组寄存器3会被捕获到EL2
17TID2陷入ID组2。
0:任何指令不会被捕获;
1:在EL1和EL0访问ID组寄存器2会被捕获到EL2
16TID1陷入ID组1。
0: 任何指令不会被捕获;
1:在EL1和EL0访问ID组寄存器1会被捕获到EL2
15TID2陷入ID组0。
0: 任何指令不会被捕获;
1:在EL1和EL0访问ID组寄存器0会被捕获到EL2
14TWE当被设置为1,在任何低于EL2的异常级别上执行WFE指令的任何尝试都会被捕获到EL2
13TWI当被设置为1,在任何低于EL2的异常级别上执行WFI指令的任何尝试都会被捕获到EL2
12DC默认的缓存能力
0:对EL1和EL0翻译策略没有影响;
1:EL1和El0翻译阶段1产生的记忆类型为非正常可共享的,内部写回式读分配写分配,外部写回式读分配写分配。
11:10BSU屏障共享升级:该字段确定从EL1或EL0执行的指令屏障的最小可共享域。
  • 00:不共享;
  • 01:内核共享;
  • 10:外部共享;
  • 11:全部共享
9FB强制广播:
0:任何指令不会被捕获;
1:在EL1执行指定的指令之一时,该指令会在内部共享域中广播。
8VSE虚拟SError中断:
0:不会使一个虚拟的SError中断挂起;
1:使一个虚拟的SError中断挂起
7VI虚拟IRQ中断
0:不会使一个虚拟的IRQ中断挂起;
1:使一个虚拟的IRQ中断挂起
6VF虚拟FIQ中断
0:不会使一个虚拟的FIQ中断挂起;
1:使一个虚拟的FIQ中断挂起
5AMO物理SError中断路由:当在EL2以下的Exception级别执行时,并且EL2在当前的Security状态下被启用,
0:如果HCR_EL2.TGE为0,路由到EL2,如果HCR_EL2.TGE为1,不执行。
1:路由到EL2,如果HCR_EL2.TGE为1,启用虚拟SError中断。
4IMO物理IRQ中断路由:当在EL2以下的Exception级别执行时,并且EL2在当前的Security状态下被启用,
0:如果HCR_EL2.TGE为0,路由到EL2,如果HCR_EL2.TGE为1,不执行。
1:路由到EL2>,如果HCR_EL2.TGE为1,启用虚拟IRQ中断。
3FMO物理FIQ中断路由:当在EL2以下的Exception级别执行时,并且EL2在当前的Security状态下被启用,
0:如果HCR_EL2.TGE为0,路由到EL2,如果HCR_EL2.TGE为1,不执行。
1:路由到EL2>,如果HCR_EL2.TGE为1,启用虚拟FIQ中断。
2PTW受保护的表遍历:在EL1&EL0转换体系中,作为第一阶段转换表遍历的一部分的转换表访问要服从第二阶段转换。来自两个转换阶段的内存类型属性的组合意味着可以访问某种类型的Device内存。
0:转换表的遍历发生在普通非缓存内存中。这意味着它可以被推测;
1:内存访问产生二级权限故障
1SWIO设置/失效指令覆盖:
0:通过设置/失效指令对数据缓存无效的操作没有影响;
1:通过设置/失效指令使数据失效,达到清理数据缓存的目的
0VM虚拟化支持:当EL2在当前安全状态下启用时,为EL1和0转换机制启用阶段2地址转换。
  • 0:禁用;
  • 1:启用

下篇文章:ARMv8/v9 异常模型系列 1 – 处理器运行模式及EL3/EL2/EL1学习
下篇文章:ARMv8/v9 异常模型系列 3 - Process State 介绍

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Yocto中,生成文件的过程是由BitBake工具完成的。BitBake是一个构建工具,用于构建Yocto项目,它可以生成各种文件,包括配置文件、日志文件、临时文件、构建输出等等。 在您提到的情况下,生成`aarch64-poky-linux.json`文件的过程如下: 1. 首先,BitBake通过查找`recipes-devtools/rust/rust-cross_%.bbappend`文件来确定如何构建交叉编译工具链。在该文件中,会有一些变量和指令,用于指导BitBake如何构建交叉编译工具链。 2. 根据`do_configure`指令,BitBake会运行`rust/configure`脚本来配置Rust编译器。在这个过程中,BitBake会设置一些编译器选项、环境变量等等。 3. 接下来,BitBake会运行`do_compile`指令来编译Rust编译器。在这个过程中,BitBake会生成一些中间文件、目标文件和库文件。这些文件会被放置在`build/tmp/work/x86_64-linux/rust-cross-armv8a-glibc/1.59.0-r0/build/x86_64-unknown-linux-gnu/stage2/lib/rustlib/aarch64-poky-linux/lib/`目录下。 4. 最后,BitBake会运行`do_install`指令来安装Rust编译器。在这个过程中,BitBake会将编译好的文件复制到`build/tmp/work/x86_64-linux/rust-cross-armv8a-glibc/1.59.0-r0/sysroot/usr/lib/rustlib/aarch64-poky-linux/lib/`目录下。同时,BitBake也会生成`aarch64-poky-linux.json`文件,并将其放置在`build/tmp/work/x86_64-linux/rust-cross-armv8a-glibc/1.59.0-r0/targets/`目录下。 总的来说,生成`aarch64-poky-linux.json`文件是由BitBake工具在编译Rust交叉编译器的过程中生成的。具体的生成过程是由`recipes-devtools/rust/rust-cross_%.bbappend`文件和`do_configure`、`do_compile`、`do_install`指令控制的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公CodingCos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值