【ARM Coresight Debug 系列 1 -- ARM Debug 技术概述】


请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】


下篇文章:ARM Coresight 系列文章 2 - ARM Coresight 介绍

1.1 ARM Debug 概述

在过去的系统中,开发人员可能使用昂贵的硬件工具,如逻辑分析仪或示波器来观察程序的行为。但现代处理器是一个复杂的SOC,通常包含内存、缓存、和许多其他逻辑单元。可能没有芯片外可见的处理器信号,因此无法通过连接逻辑分析器(或类似的)来监控行为。因此ARM系统通常包括专门的硬件,以提供广泛的控制和观察设施的调试。经常遇到的debug方式有以下几种:

  • external debug;
  • self-hosted debug;
  • invasive debug;
  • non-invasive debug;
  • semihosting debug。

下面会分别进行介绍。

1.1.1 External debug

外部调试是指调试器位于Target 外部。例如,主机通过调试器连接独立开发板上的Armv8-A处理器,这就是外部调试。外部调试的另一个示例是一个调试器运行在一个处理器上,调试位于同一SoC上的另一个处理器。

外部调试通常在进行芯片验证和bringup时使用。通常,外部调试依赖于正在调试的Target上的物理连接器,例如JTAG或Serial Wire debug (SWD)。外部调试还需要在Target和运行调试器的主机之间连接一个调试探针probe。

下图显示了调试探针在主机和调试目标之间的连接关系:
在这里插入图片描述

1.1.2 Self-hosted debug

当调试器和被调试的软件在同一个处理器上运行时,就会发生Self-hosted debug。gdbserver 就是一个很好的例子,它用于Linux应用程序调试。Gdbserver 是一个程序,它与Linux应用程序一起运行,并允许像GDB或Arm调试器这样的调试环境来调试应用程序。

自调试通常用于调试在操作系统下运行的应用程序,或者在物理调试连接器不可用时使用。
在这里插入图片描述

1.1.3 Invasive debug

侵入式调试会修改处理器的状态。例如,当使用调试器设置断点时,处理器会在命中断点时停止。侵入式的调试主要有:

  • 停机以及单步执行程序
  • 硬件断点
  • 断点指令(BKPT)
  • 数据观察点,作用于单一地址、一个范围的地址,以及数据的值。
  • 访问寄存器的值(既包括读,也包括写)
  • 调试监视器异常
  • 基于 ROM 的调试(闪存地址重载(flash patching) )

通常,使用侵入式调试技术引入的细微变化不会影响程序的执行。但是,一些 bug,例如与时间相关的问题,可能对这些细微的更改非常敏感。这意味着侵入式调试技术不适合此类bug。

1.1.4 Non-invasive debug

相对于侵入式调试,非侵入式调试始终不会修改处理器状态。例如,生成和收集trace数据通常不会影响处理器,所以trace被归类为非侵入式调试。其他非侵入式调试操作还有:

  • PMU和采样PC指针;
  • 软件跟踪(通过 ITM(指令跟踪单元));

1.1.5 Semihosting debug

半宿主是一种机制,使在嵌入式系统(也称为目标)上运行的代码能够与主机的I/O通信并使用主机的I/O,例如键盘输入和显示输出等。其实最简单的就是在host PC侧使用串口工具进入显示和命令输入。

1.2 Target 连接

1.2.1 Debugger 连接失败常见情况

  • Is Core PowerDown
    Debugger连不上下电状态的core。如果target是SMP系统,包含bootcode、firmware、os等软件阶段,当用不到某些core时,这些软件可能会让这些core处于下电状态,那么在这种情况下debugger是连不上core的debug逻辑部分的。

  • Is Core Reset
    Debugger连不上复位状态的core。在如果某些core还没有被master core解复位的话,debugger也是控制不了core的。

  • Different security state
    ARMv8 v9是支持安全和非安全状态的。如果安全态被硬件lock,那么debugger是访问不了的。

  • Different exception level
    如果 EL3 的exception level被 lock 住,debugger 也是访问不了的。

1.2.2 Target 与 Debugger 连接注意事项

一些target需要特殊步骤才能建立debug连接。这时候就要问设计者或者用户手册来寻找建立debugger连接的前置条件。下面是一些可能的通用操作:

  • 上电并且解复位core(Powering up or taking a core or processor out of reset);
  • 一些设计者会增加开关来开启debug功能(Unlocking scan chains or devices);
  • 一些设计者可能会通过跳帽来控制GPIO作为debug引脚(Multiplexed signals);
  • 一些设计者仅提供了连线,没有预留debug口(Missing connectors)。

1.3 Debug Event

在 Coretex-M 中,用于debug 目的而触发的事件叫做 debug event:
在这里插入图片描述
debug event 的触发可以导致以下事件的发生:

  • 进入 Debug state,如果Halting debug 功能使能之后,debug event 可以 halt processor 在 debug state 状态下,通过设置DHCSR.C_DEBUGEN 位可以使能 halting debug 功能。
  • 当halting debug 功能被关闭的情况下,可以触发 DebugMonitor 中断,可以通过设置 DHCSR.C_DEBUGEN位为0来关闭 halting debug 功能,或者通过来通过debug 认证接口来关闭 halting debug 功能, DebugMonitor exception 需要通过配置DEMCR.MON_EN为1,才能使能。

1.3.1 debug event 分类

Event 触发原因异常支持的功能DFSR bitNotes
Internal halt requestHalt and DebugMonitorHALTEDStep command, processor halt request, and similar
BreakpointHalt and DebugMonitorBKPTBreakpoint from BKPT instruction or match in FPB
WatchpointHalt and DebugMonitorDWTTRAPWatchpoint match in DWT, including PC match watchpoint
Vector catchHalt onlyVCATCHOne or more DEMCR.VC_* bits set to 1, and the processor took the corresponding exception
ExternalHalt and DebugMonitorEXTERNALExternal Debug Request asserted
FPB的指令断点匹配Halt and DebugMonitorFor Cortex-M3

1.3.2 debug mode

在 Cortex-M 中的调试操作模式分为两种:

  • 第一种称为“halt”(停机模式),在进入此模式时,处理器完全停止程序的执行。
  • 第二种则称为“debug monitor exception”(调试监视器模式),此时处理器执行相应的调试监视器异常服务例程,由它来执行调试任务,并且依然允许更高优先级的异常抢占它。调试监视器的异常号为 12,优先级可编程。除了调试事件可以触发异常外,手工设置其悬起位也可以触发本异常。

1.4 断点类型

ARM 提供了多种类型的断点,包括硬件断点、软件断点和数据断点。
在这里插入图片描述

  • 硬件断点(hardware breakpoint)是由处理器内部的调试逻辑实现的,比如 FPB中的比较器可以配置一些寄存器来监视PC的地址。当执行到被监视的地址或满足条件时,处理器会触发硬件断点中断。但是硬件断点的数量通常有限。

  • 软件断点(software breakpoint)是通过在代码中插入特殊的指令来实现的。当执行到该指令时,处理器会触发断点中断。软件断点的数量通常没有明确限制,但在实际使用中可能会受到处理器性能和调试工具的限制。ARM 中常用断点指令:

    • 在 T32 (ARM的16位指令集架构,也被称为Thumb-2)中 breakpoint instruction 也是 BKPT #<immediate>
    • 在 A32 (ARM的32位指令集架构,也被称为ARMv7-A)中 breakpoint instruction 是 BKPT #<immediate>
    • 在 A64 (ARM的64位指令集架构)中 breakpoint instruction 是 BRK #<immediate>在这里插入图片描述

ARM CoreSight 还支持多种断点条件和触发条件的设置,以满足不同的调试需求。例如,可以设置断点只在特定的处理器核心上触发,或者只在特定的条件满足时触发。

1.4.1 断点指令 BKPT 介绍

以 Cortex-M 为例,断点指令的格式为 BKPT #im8,它是一个16位的 Thumb指令,编码为0xBExx——其低8位就是指令中#im8的值。

当该指令执行时,会产生一个调试事件。当 C_DBGEN 置位时可以用于喊停处理器内核;或者当调试监视器使能时,触发调试监视器异常。对于后者,因为调试监视器异常也是一种优先级可编程的普通异常,所以也可以因为其优先级不够高而不能立即响应。可见,因为 NMI 和硬 fault 的优先级总是比它的高,所以不能在它们的服务例程中使用 BKPT 指令来启动调试——只有在它们返回时才能响应调试监视器异常。

使用 BKPT 时另一个要注意的是,当调试监视器异常返回后,它返回到的是 BKPT 指令的地址,而不是返回 BKPT 后面一条指令的地址。这与常规的异常返回是不同的,原因在于,在正常情况下使用 BKPT 指令时, BKPT用于取代一条正常的指令,并且当命中了该断点而执行了调试动作后,把该BKPT指令所占用的内存恢复为先前被BKPT取代的指令,并且让该指令是下一条即将执行的指令,而其它的部分不受影响(这其实也是软件断点的实现方式)。

如果在BKPT指令执行时却发现 C_DEBUGENMON_EN 都为0,则会因为无法进入调试而上访成硬fault,并且把硬 fault 状态寄存器(HFSR)的 DEBUGEVT 位给置 1,同时在调试fault状态寄存器(DFSR)中的 BKPT 位也置1。如果程序存储器的值不能更改,则可以通过编程FPB来产生硬件断点。但是,只支持6个指令地址和两个文字地址。

1.4.2 断点指令 BRK 介绍

在PE执行完 BRK 指令之后将会触发一个 Breakpoint Instruction exception,在 异常症状寄存器 ESR 中会记录异常的一些信息,比如记录是 BRK 指令还是 BKPT指令导致的 断点异常,记录 BRK/BKPT 指令后的立即数到 ESR.ISS的 bit[15:0] 中。
在这里插入图片描述
至于为何要记录 BRK/BKPT 指令后的立即数,是因为在实际的应用中可以根据立即数来区分不同的场景。比如linux/arch/arm64/include/asm/brk-imm.h 中定义了下面一些立即数来表示了不同功能的BRK指令。

/*
 * #imm16 values used for BRK instruction generation
 * 0x004: for installing kprobes
 * 0x005: for installing uprobes
 * 0x006: for kprobe software single-step
 * Allowed values for kgdb are 0x400 - 0x7ff
 * 0x100: for triggering a fault on purpose (reserved)
 * 0x400: for dynamic BRK instruction
 * 0x401: for compile time BRK instruction
 * 0x800: kernel-mode BUG() and WARN() traps
 * 0x9xx: tag-based KASAN trap (allowed values 0x900 - 0x9ff)
 */
#define KPROBES_BRK_IMM                 0x004
#define UPROBES_BRK_IMM                 0x005
#define KPROBES_BRK_SS_IMM              0x006
#define FAULT_BRK_IMM                   0x100
#define KGDB_DYN_DBG_BRK_IMM            0x400
#define KGDB_COMPILED_DBG_BRK_IMM       0x401
#define BUG_BRK_IMM                     0x800
#define KASAN_BRK_IMM                   0x900
#define KASAN_BRK_MASK                  0x0ff

1.4.3 FPB( Flash Patch and Breakpoint )

FPB 有两项功能:

  • 把代码地址空间中对指令或字面值(literal data)的加载,重载到SRAM的地址空间中。
  • 硬件断点支持。产生一个断点事件,从而使处理器进入调试模式(停机或调试监视器异常)

在实现FPB的时候可以将其配置为提供 4-8个比较器。可以单独的将某一个比较器配置为返回 一条BKPT指令给 processor 当指令地址发生匹配的时候。通过这种方式来提供 硬件断点的功能。FPB 模块包含一个全局使能配置和各个比较器单独使能配置。

Cortex-M7 中 FPB 的寄存器表如下
在这里插入图片描述

a. If four instruction comparators are implemented.
b. If eight instruction comparators are implemented.
c. For FP_COMP0 to FP_COMP7, bit 0 is reset to 0. Other bits in these registers are not reset.

1.4.3.1 Flash Patch Comparator Registers

用这个寄存器存放和PC地址比较的值,该寄存器的功能定义如下:
在这里插入图片描述
在这里插入图片描述

下篇文章:ARM Coresight 系列文章 2 - ARM Coresight 介绍

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

主公CodingCos

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

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

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

打赏作者

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

抵扣说明:

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

余额充值