Arm的Debug机制

Arm的Debug机制
一、调试类型Debug按侵入性invasive可以分为两大类侵入式调试Invasive Debug暂停处理器执行干预程序运行包括停机调试Halting Debug和调试监控异常DebugMonitor Exception两种模式。非侵入式调试Non-invasive Debug不中断程序运行仅采集运行数据包括指令跟踪、数据跟踪、性能统计三类。Halting Debug会使PE进入halt状态也就是处于Debug state。当PE没有处于halt状态它就处于Non-debug state。Halting Debug下调试器可通过调试接口读写通用寄存器、特殊寄存器、内存与外部资源支持断点、单步、变量查看等经典在线调试操作是常规IDE调试的底层基础。当PE处于Debug state时PE停止从PC指示的位置执行指令而是由外部调试接口控制PE不会服务任何中断以下几个行为可以使PE退出debug state当调试器将0写入DHCSR.C_HALT接收到外部restart请求Warm resetDebugMonitor Exception会进入异常由软件异常处理程序完成调试交互适合实时性要求高、外设不能暂停的场景在不冻结系统的前提下完成调试动作。Embedded Trace Macrocell (ETM)、Instrumentation Trace Macrocell (ITM)、Data Watchpoint and Trace (DWT) Unit、Performance Monitoring Unit (PMU)可用于生成trace数据。二、调试资源在System Address Map中debug资源位于Private Peripheral Bus (PPB)区域。除了SCS中的资源外每个debug组件占用固定的4KB地址区域。SCS中的debug资源有Debug Control Block (DCB)在System Control Block (SCB)中的Debug controlsSCB的debug功能包括两个处理程序相关的标志位ICSR.ISRPREEMPT和ICSR.ISRPENDINGDFSR寄存器Debug资源的地址分布如下上图中最后一个是ROM table的地址空间调试器通过读取 ROM 表自动识别芯片内所有调试模块DWT/ITM/ETM/CTI 等的基地址与类型实现通用工具适配。ROM table是一个表项它提供了一种机制来标识实现所支持的debug基础结构。ROM table指示实现的调试组件有哪些以及这些组件在内存映射中的位置。ROM table的格式如下三、调试安全认证Debug authentication interface提供了4个伪函数ExternalInvasiveDebugEnabled().ExternalSecureInvasiveDebugEnabled().ExternalNoninvasiveDebugEnabled().ExternalSecureNoninvasiveDebugEnabled().对于使用CoreSight信号DBGEN、NIDEN、SPIDEN和SPNIDEN的实现来说如果ExternalInvasiveDebugEnabled()为真那么DBGEN为1如果ExternalSecureInvasiveDebugEnabled()为真那么DBGEN和SPIDEN都为1如果ExternalNoninvasiveDebugEnabled()为真那么NIDEN或DBGEN为1如果ExternalSecureNoninvasiveDebugEnabled()为真那么以下使用以下两者条件NIDEN或DBGEN为1SPNIDEN或SPIDEN为1配合 TrustZone 安全扩展对调试权限做分级管控防止非授权调试泄露安全域数据Halting debug认证控制外部调试器能否让内核进入hating状态Non-invasive debug认证控制trace、profiling等non-invasive功能的访问权限DebugMonitor exception认证控制DebugMonitor exception的触发权限DAP access权限配置调试访问端口DAP对安全 / 非安全地址空间的访问边界。当HaltingDebugAllowed()为TRUE时外部调试器可以通过DAP向整个物理地址空间发出请求。DAUTHCTRL.UIDAPEN指示软件允许外部调试器通过DAP对所选PPB寄存器进行非特权访问。四、调试事件由于调试原因而触发的事件称为debug event它们定义所有可触发debug行为的硬件事件是断点、单步等功能的底层依据。Debug event会使PE发生以下情况之一如果Halting debug实现且启用了那么会进入Debug stateDebugMonitor exception发生产生HardFault exceptionLockup上面两种通常是debug event想要触发来进行调试PE的。下面两种是可能debug event无法正常处理而产生的比如当PE既不能进入Halting debug也不能产生DebugMonitor exception时这时候执行BKPT指令就会进入下面两种情况的了。debug event如下所示这些event导致PE halt或产生DebugMonitor exception时会更新DFSR寄存器中对应的bit这些bit是通过写1来清理的。下表显示了为每个debug event设置的位。Debug events可以是synchronous或是asynchronous。Synchronous的debug events有由BKPT指令的执行或FPB中的匹配引起的breakpoint debug events。Vector catch debug events由一个或多个DEMCRVC_*位被设置为1引起的PE进入相应的异常。Step debug events由DHCSR.C_STEP或DEMCR.MON_STEP引起。一条指令可以生成多个synchronous debug events。synchronous debug events与生成它们的指令相关联并被采用而不是执行该指令。PE不会生成任何其他可能由于执行指令而发生的synchronous exception或debug event。4.1 Debug steppingArmv8-M体系结构在halting debug和DebugMonitor exception中都支持debug stepping。Halting debug stepping调试器可以使用halting debug stepping退出调试状态执行单个指令然后重新进入调试状态。debug monitor stepping调试器可以使用debug monitor stepping从DebugMonitor异常处理程序返回执行单个指令然后重新进入DebugMonitor异常处理程序。Step debug event发生在被stepped的指令之后的指令上。这意味着event的优先级适用于后续指令的任何其他exception或debug events而不是正在执行的指令。4.2 Vector catchVector catch是生成debug event并在进入特定exception处理程序或复位时进入debug状态的机制。Vector catching只支持halting debug用于异常入口调试4.3 Breakpoint instructionsBKPT指令软件断点指令执行 BKPT 时触发调试事件是软件断点的硬件基础。4.4 External debug request当PE处于non-debug state时外部agent可以发出外部debug请求的信号。外部调试请求可能触发debug event导致以下两种情况进入debug state。如果Main extension被实现DebugMonitor异常。PE处于debug state时忽略外部调试请求。五、调试与跟踪功能组件调试与跟踪功能组件Debug and Trace Components是实现breakpoint、watchpoint、trace输出的实体模块全部为内存映射寄存器可通过 DAP 或特权软件配置。5.1 ITMInstrumentation Trace Macrocell定位软件插入式跟踪轻量级非侵入调试核心功能支持 32 个stimulus端口软件通过写寄存器输出调试数据实现类似 printf 的打印调试如果ITM实现支持超过32个stimulus端口则使用分页来指示stimulus端口号。硬件事件跟踪可上报异常进入 / 退出、PC 采样、数据观察点匹配等硬件事件时间戳功能为跟踪数据包添加时间标记支持时序分析同步包机制周期性插入同步帧保证跟踪数据解析的准确性。特点软件可控、开销低适合应用层日志输出与事件打点。5.2 DWTData Watchpoint and Trace定位数据访问监控 基础性能统计核心功能地址比较器实现数据观察点可配置为监控指令取指、内存读、内存写三类访问地址匹配时触发调试事件或跟踪包支持地址范围匹配、数据值匹配部分实现满足条件断点、变量监控需求性能计数器内置多个硬件计数器可统计时钟周期、指令执行数、休眠周期、异常次数等用于代码性能分析可生成跟踪数据包将观察点命中事件、采样信息输出到跟踪链路。特点通用比较器资源兼顾数据断点和性能统计。5.3 ETMEmbedded Trace Macrocell定位全量指令流跟踪non-invasive程序路径trace它是Armv8-M架构可选的non-invasive调试特性。核心功能实时记录内核执行的全部指令流支持压缩编码输出调试器可重构完整程序执行路径支持触发控制可配置开始 / 停止跟踪的条件如地址匹配、外部触发只捕获关注的代码段带时间戳标记支持指令级时序分析完全non-invasive不影响程序正常运行时序。特点适合排查偶发异常、时序相关问题是高端调试的核心组件。5.4 FPBFlash Patch and Breakpoint定位硬件指令断点 Flash 在线热补丁核心功能硬件指令断点比较取指地址匹配时触发断点无需修改指令适合 Flash 代码调试Flash 补丁重定向将指定 Flash 地址的取指 / 读操作硬件重定向到 RAM 中的替代代码 / 数据实现不擦写 Flash 的在线补丁该功能已废弃特点是 IDE 硬件断点的底层实现也是 Flash 在线升级 / 修复的硬件基础。5.5 TPUTrace Port Interface UnitArmv8-M的跟踪端口接口单元TPIU支持为来自DWT、ITM和ETM的trace data提供输出路径。TPIU是一个跟踪接收器。TPIU是否支持并行跟踪端口输出是由IMPLEMENTATION定义的。Arm建议TPIU同时提供并行和异步串行端口以获得与外部捕获设备的最大灵活性。5.6 PMUPerformance Monitor Unit性能监视器扩展描述了一个可选的非侵入性调试组件它允许识别和计数性能事件。性能监视器扩展的一个实现称为性能监视单元PMU。定位系统级硬件事件统计面向性能优化与调优核心功能提供多个可编程计数器可选择统计不同的硬件事件最多可容纳31个IMPLEMENTATION DEFINED事件计数器event counter。每个性能事件计数器是一个16位的通用计数器。通过成对链接计数器计数器范围可以通过将计数器数量减半来增加。如果实现了PMU则至少需要2个16位的性能事件计数器和1个32位的cycle计数器。标准化事件编号规范定义了必选事件和可选事件包括指令执行类指令提交数、分支指令数、异常次数缓存类指令缓存命中 / 失效、数据缓存命中 / 失效、缓存写回总线类总线访问周期、内存访问等待周期调试类DWT 比较器匹配事件、跟踪外部事件支持计数器溢出中断可实现事件阈值告警、周期采样。意义为代码性能分析、瓶颈定位提供硬件级准确数据无需软件插桩。PMU提供广泛准确和统计上有用的计数信息。为了保持较低的实现和验证成本计数中的合理程度的不准确性是可以接受的。PMU的常见事件列表如下。event类型有两大类ArchArchitecture event。这些事件在所有实现中都是相同的。uArchMicroarchitecture event。这些事件在不同的实现中可能有所不同。