关于Trace32的访问类型的基本概念可以参考博文:
Trace32使用教程-访问类型(Access Class)_SOC罗三炮的博客-CSDN博客
本文将以ARMv8为基础,详解Trace32的内存访问类型。
内存访问类型 | 描述 |
A | 绝对寻址(物理地址),即绕过MMU |
E | 运行时访问。(可以由 SYStem.CpuAccess 和SYStem.MemAccess命令来enable和disable) |
M Armv8-A only | EL3 Mode (TrustZone devices). 只适用于 64-bit EL3 mode。在Armv8下, 如果设备处于32位模式,如果使用“M”访问类型,将会被转换为“ZS”访问类型。 |
N | EL0/1非安全模式(TrustZone设备) |
H | EL2/Hypervisor模式(具有虚拟化扩展的设备) |
R | AArch32 Arm Code (A32, 32位)长度) |
X Armv8-A only | AArch64 Arm64 Code (A64, 32位instr。长度) |
Z | 安全模式(TrustZone设备) |
S | Supervisor Memory (privileged access) |
DAP DAP2, AHB, AHB2, APB, APB2, AXI, AXI2 | 访问内存时,通过BUS master ,也称为Memory Access Ports (MEM AP)。由Debug Access Port (DAP)提供。DAP是一个CoreSight组件,在基于Cortex的设备上是必需的。 使用哪一个bus master (MEM-AP)作为访问类型,是通过给MEM-AP分配一个端口号来进行的:
用户必须给MEM-AP(比如AHB)分配一个内存访问端口号,然后就可以使用 AHB 作为访问类型。AXI和DAP也是一样。 是给可以控制两个DAP的调试器使用的。 |
SPR Armv8/Armv9 only | 访问系统寄存器,特殊用途寄存器以及系统指令等( System Register, Special Purpose Registers and System Instructions). 建议只在AArch64模式下使用。 |
T | AArch32 Thumb 码(T32, 16位)。长度) |
C | “Current”,不要使用该访问类型,如果应该使用的访问类型未知,调试器将会根据当前处理器的状态,来推断出访问类型。 |
C14 | 访问c14协处理器寄存器。建议只在AArch32模式下使用。 |
C15 | 访问c15协处理器寄存器。建议只在AArch32模式下使用。 |
D | 内存数据,默认使用,不加也可。 |
I | 中间地址。可在具有虚拟化的设备上使用 扩展。 |
J | Java Code (8-bit) |
JSEQ: | Access data via JTAG sequences registered with JTAG.SEQuence.MemAccess.ADD |
VM | Virtual Memory (memory on the debug system) |
P | 程序内存 |
U | 用户内存(非特权访问),尚未实现;将执行特权访问。 |
USR | Access to Special Memory via User-Defined Access Routines |
以下是 ANC、NC、A以及默认情况下的访问类型示意图:
- A 意味着绕过MMU,直接访问物理地址,但是会经过cache。
- NC,Non-cache,会绕过cache,但是会经过MMU,所以访问的是虚拟地址。
- ANC,意味着绕过cache 和 MMU,直接利用CPU去访问内存。
- 如果任何访问类型都未声明,则默认经过cache和MMU。
假设想要查看包含32位Arm代码的安全内存区域。此外,访问由MMU进行转换,因此必须选择正确的CPU模式以避免转换失败。在我们的例子中,应该有必要在Arm supervisor 模式下访问内存。要确保安全访问,使用“Z”。要在访问期间将CPU切换到supervisor模式,使用“S”。要使调试器将内存内容反汇编为32位Arm代码,使用“R”。将三者结合在一起,即为 “ZSR”:
List.Mix ZSR:0x10000000 // View 32-bit Arm code in secure memory
虽然已经知道了要使用 ZSR 三个属性,但是能不能使用 SZR 或者 RZS 呢,答案是不能,访问类型之间存在一定的先后规则。
来创建有效的访问类型组合的规则:
- 对于每一列,只能选择一个访问类型
- 如果该列有空格块选项,则可以跳过。
- 访问类型的排列顺序必须严格按照色块的顺序,从左至右。
通过CPU访问内存(CPU视角)
调试器使用CPU访问内存和外设,如UART或DMA控制器。这意味着CPU将执行调试器请求的访问。例如虚拟、物理、安全或非安全的内存访问。
一些简单的访问类型的组合示例:
- AD View physical data (current CPU mode)
- AH View physical data or program code while CPU is in hypervisor mode
- ED Access data at run-time
- NUX View A64 instruction code at non-secure virtual address location, e.g. code of the user application.
- ZSD View data in secure supervisor mode at virtual address location
- AZHD Physical secure hypervisor access. ArmV8.4-A only.
- ZI Secure intermediate access. ArmV8.4-A only
外设寄存器访问,Peripheral Register Access
- NC15 Access non-secure banked coprocessor 15 register (AArch32 mode)
- C15 Access coprocessor 15 register in current secure mode (AArch32 mode)
- SPR Access system register (AArch64 mode)
- MSPR Access system registers in EL3 (AArch64) mode
- HSPR Access system registers in EL2 (AArch64) mode
- ZSPR Access system registers in secure EL1 (AArch64) mode
CoreSight Access
这些访问通常用于访问CoreSight总线APB、AHB和AXI等,直接通过DAP,并且绕过CPU。例如,这可以用于在CPU运行时查看物理内存:
- EZAXI Access secure memory location via AXI during run-time
- DAP Access debug access port (e.g. core debug registers)
User input at the command line | Expansion by TRACE32 | These access classes are added because... |
List.Mix (see also illustration below) | NSR: | N: … the CPU is in non-secure mode. S: … the CPU is in supervisor mode. R: … code is viewed (not data) and the CPU uses 32-bit instructions. |
Data.dump A:0x0 | ANSD:0x0 | N: … the CPU is in non-secure mode. S: … the CPU is in supervisor mode. D: … data is viewed (not code). |
Data.dump Z:0x0 | ZSD:0x0 | S: … the CPU is in supervisor mode. D: … data is viewed (not code). |
E '和' A '不会自动添加,因为调试器无法知道用户是否打算使用运行时或物理访问。