ARM 调试架构
architecture/arm/ 是核心库里最大的目录,2.37 万行。本卷只讲 Cortex-M 这条线:ARM 调试接口 ADIv5(兼顾 ADIv6)、Armv6-M / v7-M / v8-M 内核、调试序列。Cortex-A / R(armv7ar.rs、armv8a.rs,合计约 6800 行)、ITM / TPIU 等 trace 组件不讲。访问主线的中段和调试主线的前半段都在这里。
四章按「从线上往上」排:
- DP、AP 与 SELECT:ADI 的模型,一个 DP 后面挂若干 AP;
ArmCommunicationInterface怎么在第一次访问某个 DP 时跑 setup / start 序列、怎么用一份 SELECT 缓存省掉重复的 bank 切换;ADIv6 的 64 位 AP 地址;0.30 去掉 typestate 的取舍。模拟目标上看 attach 时 DP 一侧的 3 个 SWJ 序列和 15 次寄存器访问。 - MEM-AP 与 ROM table:访问主线中段,写 TAR、读 DRW、按 1 KiB 切块;7 种 MEM-AP 变体共用一个
MemoryAp枚举;每次session.core(i)都会重建 MEM-AP 状态(8 次访问);ROM table 怎么一层层找到 SCS、DWT、FPB、ITM。 - Cortex-M 内核:halt、寄存器、断点、单步:调试主线前半段,DHCSR、DFSR、DCRSR / DCRDR、DEMCR、FP_CTRL / FP_COMPn;
halt、run(先单步一次)、step(关断点、屏蔽中断、停在BKPT上手动跳过)、set_hw_breakpoint的两种 FPB 编码;Armv6-M、Armv8-M 的不同。 - 调试序列与 vendor:
ArmDebugSequence的 18 个钩子,Vendor按芯片名选序列;STM32 写DBGMCU_CR、nRF 读 CTRL-AP;Session::new的 attach 顺序,用模拟目标记下完整的 142 次访问。
flowchart TB dpap["DP、AP 与 SELECT"] --> memap["MEM-AP 与 ROM table"] memap --> core["Cortex-M 内核"] seq["调试序列与 vendor"] -.-> dpap seq -.-> core core --> debug["08 调试信息"]
本部分的实验大多用自己写的模拟目标:它实现 RawDapAccess,背后是一个 SW-DP(DPIDR 0x1BA01477)、一个 AHB-AP(IDR 0x24770011)、一块稀疏内存,加上 DHCSR、DFSR、DCRSR / DCRDR、FP_CTRL、FP_COMPn 和一张 Cortex-M3 式的 ROM table;硬件断点比较器个数可以设,默认 6 个。probe-rs 自己的代码跑在上面,每次 DP / AP 访问记一行。模拟目标的寄存器值是照规范填的,不代表任何一颗具体芯片。
主要文件(行数含文件内测试):
| 文件 | 行数 | 管什么 | 章 |
|---|---|---|---|
communication_interface.rs、dp/、ap/ | 约 4 100 | DP / AP、SELECT、MEM-AP 寄存器 | 1、2 |
memory/adi_memory_interface.rs、memory/romtable.rs | 1 756 | 内存访问、ROM table | 2 |
core/armv6m.rs、armv7m.rs、armv8m.rs、cortex_m.rs、core/mod.rs | 3 892 | Cortex-M 内核 | 3 |
sequences.rs | 1 180 | 调试序列 trait 与默认实现 | 4 |
traits.rs、traits/polyfill.rs | 2 433 | RawDapAccess、DapAccess,位级探针的 polyfill | 02 探针层 |
💬 关联讨论
发起讨论加载中...