Debug工具Trace32的ARM内存访问类型详解

关于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分配一个端口号来进行的:

  • SYStem.CONFIG DEBUGACCESSPORT <mem_ap#> -> “DAP”
  • SYStem.CONFIG AHBACCESSPORT <mem_ap#> -> “AHB”
  • SYStem.CONFIG APBACCESSPORT <mem_ap#> -> “APB”
  • SYStem.CONFIG AXIACCESSPORT <mem_ap#> -> “AXI”

用户必须给MEM-AP(比如AHB)分配一个内存访问端口号,然后就可以使用 AHB 作为访问类型。AXI和DAP也是一样。
至于DAP2, AHB2, APB2, AXI2),
SYStem.CONFIG DAP2AHBACCESSPORT <mem_ap#>)

是给可以控制两个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 '不会自动添加,因为调试器无法知道用户是否打算使用运行时或物理访问。

猜你喜欢

转载自blog.csdn.net/luolaihua2018/article/details/131739918