Trace32使用教程-访问类型(Access Class)

本文详细介绍了Trace32工具中访问类型(AccessClass)的概念及其在程序内存和数据内存中的应用。访问类型包括ProgramMemoryClasses(如P, R, T, V)和DataMemoryClasses(如D, X),用于指定如何访问内存、外设寄存器等资源。此外,还提到了处理器访问类型的特定访问模式,如ICache, DCache和NCache,并解释了访问类型属性如E(运行时访问)、A(物理地址访问)等。最后,文章阐述了Trace32如何根据上下文自动扩展访问类型。

Trace32使用教程-访问类型(Access Class)

访问类型(Access Class)被 Trace32的PowerView用于指定访问内存、外设的寄存器、可寻址的core资源、协处理寄存器以及Trace32的虚拟内存等。

在Trace32中,寻址包括两部分:访问类型+地址,比如:

Data.Dump A:0x123456

其中 A为访问类型,0x123456为访问的地址,二者之间用冒号 连接。

访问类型可以是:

  • 程序内存类型(program memory class)
  • 数据内存类型( data memory class)

程序内存类型Program Memory Classes

通常使用字母 P(Program)来表示程序内存类型(可省略),比如以下命令:

List P:0x4568

List 0x4568

P可以省略,上述两个命令都是在程序地址为 0x4568的地方,打开源代码窗口。

除了 P类型之外,还有 R, TV等程序内存类型,这些类型是处理器架构用来指定不同指令集的编码格式:

R针对ARM架构,表示ARM指令集编码
T针对ARM架构,表示THUMB指令集编码
V针对POWER架构,表示VLE指令集编码

可用的程序内存类型取决于当前所使用的处理器架构,详细内容可以参考Processor Architecture Manual

数据内存类型Data Memory Classes

通常使用字母 D(Data)来表示程序内存类型(可省略),比如以下命令:

Data.dump D:0x6770

Data.dump 0x6770

D可以省略,所以上述两个命令都是同一个操作。

此外,对于一些特殊场景,还可以使用其他的字母来表示内存类型,比如 X表示针对MMDSP架构,使用 X总线来访问数据内存。

在Trace32中总是以如下的窗口显示Data.dump的信息:

在这里插入图片描述

比如其中修饰内存地址的 SD就代表“Supervisor Data ”。

如果访问类型被忽略,Trace32将会使用默认的访问类型。比如直接对内存地址 0x40080000进行 Data.dump,则可以发现默认使用了 ZSD的访问类型进行修饰,关于 ZSD代表何种类型,将在下文中解释。

处理器访问类型Access Classes for Core Resources

以下是一些处理器资源常用的缓存访问类型:

ICInstruction Cache指令缓存
DCData Cache数据缓存
L2Level 2 Cache 二级缓存
NCNo Cache (access with caching inhibited)限制缓存的访问

比如下面这些指令

Data.dump DC:0x6770 ; 显示地址0x6770处的16进制数据转存,DC表面数据从Data cache上获得的
Data.dump NC:0x6770 ;NC表示不经过缓存,数据是从物理内存physical memory上读取的

访问类型属性Access Class Attributes

E运行时访问,优先采用非侵入性访问,如果不支持,就是侵入性访问。
A物理地址的访问,绕过MMU(MMU可以将虚拟地址和物理地址进行转换)
SSupervisor 内存,特权访问
U用户内存,非特权访问
Z安全访问(比如ARM的TrustZone)
N非安全访问

比如以下命令:

Data.dump A:0x29876

解释:dump物理地址为0x29876上的数据

Data.dump AD:0x29876

解释:D表示Data,代表数据内存,所以同上命令

Data.dump ADC:0x29876

解释:A同上,DC表示Data Cache,表示dump物理地址为0x29876上的数据,数据的来源为Data Cache

访问类型扩展

如果用户忽略指定访问类型,Trace32将根据经验进行填充,填充的规则基于:

  • 当前CPU的上下文context(架构特有的)
  • 使用的窗口类型(比如Data.dump是显示数据内存,List.Mix窗口是显示代码内存)
  • 所加载应用的符号信息(比如代码和数据的结合)
  • 使用不同的指令集的段segments
  • 特殊的调试设置(比如SYStem.Option.*)

比如通过CPU访问,假设CPU处于非安全的supervisor模式,执行32bits代码。Trace32会根据当前处理器上下文自动将A扩展成 ANSD或者 AZSD,将Z扩展成ZSD。比如当前处理器处于secure模式下:

以下是Trace32自动进行的访问模式扩展:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在构建 GraalVM 原生镜像时,出现 `unintentional class initialization of LogFactory and UnsafeAccess` 错误通常是由于 GraalVM Native Image 在构建过程中意外地初始化了某些类,而这些类在构建时不应被初始化。GraalVM 的原生镜像构建过程依赖于静态分析,若某些类在构建时被错误地初始化,可能会导致运行时行为与预期不符,甚至引发错误。 ### 原因分析 1. **LogFactory 初始化问题** `LogFactory` 是 Apache Commons Logging 或 SLF4J 等日志框架中用于动态加载日志实现的工厂类。在 GraalVM Native Image 构建过程中,该类可能会被提前初始化,导致日志系统在构建阶段就尝试加载运行时所需的类,从而引发错误[^1]。 2. **UnsafeAccess 初始化问题** `UnsafeAccess` 通常用于直接操作内存或绕过 Java 安全机制的类,常见于某些高性能库(如 Netty、Jackson 等)。该类的提前初始化可能触发 GraalVM 对底层资源的不恰当访问,进而导致构建失败。 ### 解决方案 #### 1. 使用 `--initialize-at-build-time` 明确控制类初始化时机 可以通过 GraalVM 的命令行参数指定某些类在构建时初始化,从而避免意外初始化。例如: ```bash --initialize-at-build-time=org.apache.commons.logging.LogFactory,com.example.UnsafeAccess ``` 此参数告知 GraalVM 在构建阶段明确初始化这些类,避免其在运行时因提前初始化而出现问题。 #### 2. 使用 `--report-unsupported-class-initialization` 查看初始化警告 启用该参数可以报告哪些类在构建时被意外初始化: ```bash --report-unsupported-class-initialization ``` 该选项有助于识别潜在的类初始化问题,并进行针对性修复[^1]。 #### 3. 使用配置文件排除类初始化 通过 `native-image.properties` 或手动创建 `reflect-config.json`、`resource-config.json` 文件,配置哪些类应延迟到运行时初始化。例如,在 `reflect-config.json` 中添加: ```json [ { "name": "org.apache.commons.logging.LogFactory", "allDeclaredConstructors": true, "allPublicConstructors": true, "allDeclaredMethods": true, "allPublicMethods": true }, { "name": "com.example.UnsafeAccess", "allDeclaredConstructors": true } ] ``` 此配置确保 GraalVM 在构建过程中不会提前初始化这些类,而是将其推迟到运行时[^1]。 #### 4. 使用替代日志实现 若使用的是 Apache Commons Logging,考虑改用 Log4j2 或 SLF4J + Simple Logger 等更兼容 GraalVM 的日志实现,以减少构建过程中的类初始化冲突。 #### 5. 升级 GraalVM 和依赖库版本 确保使用的是 GraalVM 的最新稳定版本,并检查项目中涉及的第三方库是否支持 GraalVM Native Image。某些旧版本的日志库或框架可能未适配 GraalVM 的构建机制,升级后可避免此类问题[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SOC罗三炮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值