当前位置: 首页 > news >正文

【ARM Coresight Debug 系列 -- ARMv8/v9 Watchpoint 软件实现地址监控详细介绍】


请阅读【嵌入式开发学习必备专栏 】


文章目录

    • ARMv8/v9 Watchpoint exceptions
      • Watchpoint 配置信息读取
      • Execution conditions
      • Watchpoint data address comparisons
      • Size of the data access
      • Watchpoint 软件配置流程
      • Watchpoint Type 使用介绍
        • WT, Bit [20]: Watchpoint Type
        • LBN, Bits [19:16]
        • Watchpoint Type 使用场景
      • Watchpoint 注意事项

ARMv8/v9 Watchpoint exceptions

在ARMv8/v9架构中,可以通过配置 DBGWVR0_EL1 调试寄存器设置硬件观察点(Watchpoint)。这个寄存器是一系列观察点值寄存器(DBGWVRn_EL1,其中n代表寄存器的编号)中的第一个:

• DBGWCR0_EL1 and DBGWVR0_EL1 are for watchpoint number zero.
• DBGWCR1_EL1 and DBGWVR1_EL1 are for watchpoint number one.
• DBGWCR2_EL1 and DBGWVR2_EL1 are for watchpoint number two.
• …
• …
• DBGWCR<n-1>_EL1 and DBGWVR<n-1>_EL1 are for watchpoint number (n-1)

通过设置DBGWVR0_EL1,开发人员可以指定特定的内存地址,当处理器访问这个地址时(无论是读取还是写入),就会触发一个调试异常,从而允许开发者中断程序的执行来调查程序的当前状态。

Watchpoint 配置信息读取

在这里插入图片描述
可以通过系统寄存器 ID_AA64DFR0_EL1, AArch64 Debug Feature Register 0 来获取芯片上watch point 及其它debug 组件的实现情况:

  • WRPs, bits [23:20]: 存储watch point的个数;
  • Bits [19:16]: 存放实现breakpoint 实现的个数;
  • PMUVer, bits [11:8]: 显示 PMU的版本;
  • TraceVer, bits [7:4]: 展示trace 某块是否实现;
  • DebugVer, bits [3:0]: 显示 Debug 版本:
    • 0b0110 Armv8 debug architecture.
    • 0b0111 Armv8 debug architecture with Virtualization Host Extensions.
    • 0b1000 Armv8.2 debug architecture, FEAT_Debugv8p2.
    • 0b1001 Armv8.4 debug architecture, FEAT_Debugv8p4.
    • 0b1010 Armv8.8 debug architecture, FEAT_Debugv8p8.

DBGWVR0_EL1寄存器通常在需要密切监视程序对特定内存位置的访问时使用,这对于调试复杂的内存问题,如缓冲区溢出、意外的内存修改、追踪变量的变化等情况,都非常有用。

一个 Watchpoint 可以监控一个地址上的1到多个字节,当访问到正在监控的字节后,watchpoint 会产生一个 watchpoint debug event。watchpoint 监控的字节数可以配置为下面两种情况:

  • 监控1-8个字节,通过配置DBGWCR<n>_EL1.BAS选择要监控的字节数;
  • 监控8字节-2G地址范围,在这种情况下需要满足下面两个条件:
    • 监控的字节数是2的幂次方:2bytes
    • 要监控的起始地址要为地址size的N倍

通过配置 DBGWCR<n>_EL1.MASK 来设置要监控的8字节到2G的范围。

watchpoint debug event 可以触发 watchpoint exception 或者是让CPU进入Debug state,如果配置了EDSCR.HDE那么当产生watchpoint debug event 的时候系统将会进入 Debug state,否者是产生watchpoint exception。

Execution conditions

可以控制watchpoint在特定的条件下产生,比如只在Non-secure EL2 条件下产生。在哪种条件下可以产生watchpoint exception是通过配置DBGWCR<n>_EL1.{SSC, HMC, PAC} 决定的,如下表所示:
在这里插入图片描述

注意:本篇文章是在EL3异常等级下测试的

Watchpoint data address comparisons

我们知道ARMv8/v9 下 虚拟地址默认最大为48bit,但是也可以配置为52bit的使用场景。
在这里插入图片描述
关于ARMv8/v9 MMU 配置推荐阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】

Size of the data access

可以通过配置DBGWCR<n>_EL1.MASK 来设置监控的地址范围,需要注意的是在使用Mask 方式配置地址监控范围时需要将DBGWCR<n>_EL1.BAS全部配置为1,因为需要将地址上的所有字节都进行监控。
在这里插入图片描述

  • 如果配置监控0x80bytes的地址范围,bit[28:14] = 0b00111
  • 如果配置监控1M的地址范围,bit[28:14] = 0b10100
  • 如果配置监控1G的地址范围,bit[28:14] = 0b11110
  • 如果配置监控2G的地址范围,bit[28:14] = 0b11111

Watchpoint 软件配置流程

  1. 访问权限:首先,确保你有权限访问DBGWVR0_EL1寄存器。这通常要求你处于EL1或更高的异常级别,并且可能需要确保适当的调试权限已经被设置,本文测试代码是运行在EL3异常等级上的。
  2. 设置内存地址:将你希望监视的内存地址写入DBGWVR0_EL1。当处理器尝试访问这个地址时,就会触发调试异常。
  3. 配置观察点控制寄存器(DBGWCR0_EL1):与DBGWVR0_EL1一起使用的还有相应的控制寄存器(例如DBGWCR0_EL1),它用于配置观察点的行为,比如访问类型:读、写或执行和条件。
    • DBGWCR<n>_EL1.LSC来配置监控读写的行为;
    • DBGWCR<n>_EL1.E 来使能 watchpoint;
  4. 启用观察能力:通过适当配置相关的控制寄存器,确保观察点被启用。
  5. 运行调试会话:当程序执行过程中访问到DBGWVR0_EL1指定的地址时,将触发观察点,此时可以通过调试器查看程序状态,包括寄存器、内存和其他有用的调试信息。
  6. 处理观察点触发:一旦观察点触发,你可以使用调试器来检查程序的状态、修改变量或寄存器的值,或是单步执行程序来进一步调试。

Watchpoint Type 使用介绍

DBGWCR<n>_EL1寄存器中,DBGWCR<n>_EL1.WT字段和DBGWCR<n>_EL1.LBN分别控制观察点的类型和与其他断点的链接方式。

WT, Bit [20]: Watchpoint Type

WT位用于指定观察点的类型。这里有两种可能的值:

  • 0b0: Unlinked Data Address Match 当设置为0b0时,表示这个观察点为非链接的数据地址匹配类型。这意味着当处理器访问一个与观察点设置匹配的内存地址时,将会触发一个调试事件,不管当前的执行上下文是否与某个特定的断点相关联。
  • 0b1: Linked Data Address Match 当设置为0b1时,观察点为链接的数据地址匹配类型。这种类型的观察点将会与一个断点(Breakpoint)相关联,只有当该断点的条件(例如,特定的PC值或上下文匹配)被满足时,对于匹配的数据地址的访问才会触发调试事件。
LBN, Bits [19:16]

Linked Breakpoint Number LBN字段用于指定与观察点链接的断点的编号。这对于设置链接的数据地址匹配观察点(即WT位设置为0b1时)尤其重要。LBN字段允许你指定一个断点寄存器的索引号,只有当该断点被触发时,链接的观察点才会激活。

Watchpoint Type 使用场景

将观察点(Watchpoint)和断点(Breakpoint)链接起来使用,可以使调试过程更加精细和灵活。例如,你可以设置一个断点来监视特定函数的入口,然后通过设置链接的观察点来监视该函数中特定变量的读写操作。这样,只有当执行流达到特定函数时,对于变量的访问才会触发调试事件,从而帮助开发者更加准确地诊断和调试软件问题。

实例:
假设有一个场景,你希望监视在达到某个函数地址(由断点监视)时,某个特定全局变量(由观察点监视)的写操作。你可以这样配置:

  1. 设置一个断点(Breakpoint),指定其地址为函数的地址。
  2. 设置一个观察点(Watchpoint),指定其地址为全局变量的地址,设置WT位为0b1(Linked Data Address Match),并将LBN设置为步骤1中断点的编号。

Watchpoint 注意事项

  • 实现依赖性:不同的ARMv8实现可能支持不同数量的观察点和断点寄存器。DBGWVR0_EL1是系列中的第一个寄存器,但总体数量和具体支持的特性可能因具体的ARMv8处理器而异。
  • 安全和权限控制:对DBGWVR0_EL1寄存器的访问可能受到安全和权限控制的限制,确保在合适的安全上下文中使用这些寄存器,尤其是在多用户或安全敏感的环境中。
  • 性能影响:使用硬件观察点可能影响程序的执行性能。在性能敏感的代码区域使用时要特别注意。
    DBGWVR0_EL1等寄存器的使用是ARMv8架构提供的强大调试功能之一,使得开发者能够更有效地监控和调试软件,特别是在处理复杂的内存相关错误时。正确使用这些工具需要对ARM架构和操作系统的权限模型有深入的理解。

watchpoint 代码实现地址监控见:【ARM Coresight Debug 系列 – ARMv8/v9 Watchpoint 代码实现2G地址范围监控】

相关文章:

【ARM Coresight Debug 系列 -- ARMv8/v9 Watchpoint 软件实现地址监控详细介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 ARMv8/v9 Watchpoint exceptionsWatchpoint 配置信息读取Execution conditionsWatchpoint data address comparisonsSize of the data accessWatchpoint 软件配置流程Watchpoint Type 使用介绍WT, Bit [20]: Watchpoint TypeLBN, B…...

jvm工具-jps、jstat、jmap、jstack

一、jps jps -v 【输出进程启动参数】 [rootVM-8-2-centos ~]# jps -v 12401 Jps -Dapplication.home/usr/local/jdk1.8.0_241 -Xms8m 16964 jar 其他参考 Java八股文必看&#xff0c;入门到深入理解jvm虚拟机之基础故障指令【jps&#xff0c;jstate...】-CSDN博客 二、j…...

LVS负载均衡群集+NAT部署

目录 一、企业群集应用概述 1.1 群集的含义 1.2 企业群集分类 二、负载均衡群集架构和工作模式 2.1负载均衡的结构 2.2负载均衡群集工作模式分析 三、LVS虚拟服务器 3.1Linux Virtual Server 3.2LVS必要的工具 3.3LVS的负载调度算法 一、企业群集应用概述 1.1 群集的…...

使用 Oracle SQL Developer 导入数据

使用 Oracle SQL Developer 导入数据 1. 导入过程 1. 导入过程 选择要导入数据的表&#xff0c; 然后单击右键&#xff0c;选择"导入数据"&#xff0c; 浏览本地文件&#xff0c;选择正确的工作表&#xff0c; 按默认&#xff0c; 按默认&#xff0c; 根据情况修改&…...

品质主管的面试题目

在品质主管的面试中,面试官可能会提出一系列问题来评估应聘者的经验、技能和专业知识。以下是一些常见的品质主管面试题,你可以提前准备,以更好地展示自己的能力和适应性。 一、自我介绍与背景了解 请简单介绍一下自己,包括教育背景、工作经验等。你在过去的工作经历中,主…...

算法专题总结链接地址

刷力扣的时候会遇到一些总结类型的题解&#xff0c;在此记录&#xff0c;方便自己以后找 前缀和 前缀和https://leetcode.cn/problems/unique-substrings-in-wraparound-string/solutions/432752/xi-fa-dai-ni-xue-suan-fa-yi-ci-gao-ding-qian-zhui-/ 单调栈 单调栈https:…...

Oracle--存储结构

总览 一、逻辑存储结构 二、物理存储结构 1.数据文件 2.控制文件 3.日志文件 4.服务器参数文件 5.密码文件 总览 一、逻辑存储结构 数据块是Oracle逻辑存储结构中的最小的逻辑单位&#xff0c;一个数据库块对应一个或者多个物理块&#xff0c;大小由参数DB_BLOCK_SIZE决…...

【计算机毕业设计】259基于微信小程序的医院综合服务平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

HP惠普暗影精灵10 OMEN Gaming Laptop 16-wf1xxx原厂Win11系统镜像下载

惠普hp暗影精灵10笔记本电脑16-wf1000TX原装出厂Windows11&#xff0c;恢复开箱状态oem预装系统安装包&#xff0c;带恢复重置还原 适用型号:16-wf1xxx 16-wf1000TX,16-wf1023TX,16-wf1024TX,16-wf1025TX, 16-wf1026TX,16-wf1027TX,16-wf1028TX,16-wf1029TX, 16-wf1030TX,16-…...

[Day 9] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的主要應用場景 區塊鏈技術自2008年首次由中本聰提出以來&#xff0c;已經迅速發展並應用於各個領域。它的去中心化、透明和不可篡改等特性使其在金融、供應鏈、醫療健康、物聯網、數字身份等多個方面展現出巨大的潛力。本文將深入探討區塊鏈的主要應用場景&#xff0c;…...

van-list 遇到的问题

将公司项目H5页面重构的时候&#xff0c;有一个类似购物车的页面&#xff0c;需要上拉加载&#xff0c;下拉刷新。使用的UI组件的是vant&#xff0c;其中看起来van-list 很符合基本需求&#xff0c;就果断进行了copy 修改。但是&#xff0c;在进行具体的业务交互的时候突然发现…...

DockerCompose+Jenkins+Pipeline流水线打包Vue项目(解压安装配置Node)入门

场景 DockerComposeJenkinsPipeline流水线打包SpringBoot项目(解压安装配置JDK、Maven等)入门&#xff1a; DockerComposeJenkinsPipeline流水线打包SpringBoot项目(解压安装配置JDK、Maven等)入门-CSDN博客 以上使用流水线配置和打包springboot后台项目&#xff0c;如果要使…...

【新课程】PICO VR 交互开发指南

从PICO开始&#xff0c;迈向XR跨平台开发 Unity XR Interaction Toolkit &#xff08;简称XRI&#xff09;是一套跨平台的 XR 交互开发工具包&#xff0c;随着版本的更新与完善&#xff0c;逐渐获得了开发者的青睐。各 XR 平台逐步推荐开发者采用 XRI 作为首选的交互开发工具为…...

天童美语:为了得体退出的那一天,你一定要好好爱孩子

父母最大的成就就是孩子可以独立&#xff0c;自己完成自己的人生。为了得体退出的那一天&#xff0c;你一定要好好爱你的小孩&#xff0c;因为每一天都在过去。当我们站在孩子成长的十字路口&#xff0c;面对那个终将到来的退出时刻&#xff0c;心中总会涌起一股难以言表的情感…...

什么是JWT?为什么用JWT?JWT的实战案例

JWT学习资料 1.什么是JWT?【头部(Header)、载荷(Payload)和签名(Signature)】2.为什么要用JWT?3.JWT 使用全局变量JWT 创建JWT的应用&#xff08;token放在返回信息中&#xff09;JWT验证 4.JWT 原理 1.什么是JWT?【头部(Header)、载荷(Payload)和签名(Signature)】 JWT(JS…...

SpringBoot+Vue小区物业管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码2.查询小区信息代码3.保存缴费信息代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootVue框架开发的小区物业管理系统。首先&#xf…...

在不使用js在情况下只用css实现瀑布流效果

使用到的是grid 布局&#xff0c;需要注意的是grid-template-rows: masonry; 目前只有Firefox 浏览器支持这个效果&#xff0c;而且还是一个实验性属性需要在设置里面开发实验性选项才行。 实例 <!DOCTYPE html> <html> <head><title>Document</ti…...

AMS(ActivityManagerService)源码解析2,Android应用是如何被启动的

一个Android应用是如何被启动的 前言总结1. 启动Application1.1 拉起一个新的进程1.2 启动Application1.3 AMS阶段1.4 创建Instrumentation和Application 2. 启动Activity2.1 回到AMS&#xff0c;启动第一个Activity 参考资料 前言 基于源码API 28&#xff0c;30以后的版本启动…...

数据库事务隔离级别

前几天项目上合作公司的系统出现了一次死锁&#xff0c;突然想到由于近几年开发设计的系统并发用户比较少&#xff0c;很久没有碰到过死锁了&#xff0c;因此对死锁的概念也比较生疏了&#xff0c;需要温习一下。 事务 先从最基本的概念开始&#xff0c;事务、及其ACID特性。…...

Pytest 记录日志输出到控制台和写入文件

目录 自定义日志记录器和内置的日志记录器 项目代码 项目目录树 自定义日志记录器 函数源代码 pytest中定义和覆盖日志记录信息 使用cli定义Logging 使用pytest.ini定义Logging 修改单个测试级别的日志 日志输出的重要性不言而喻&#xff0c;不仅可以观测执行过程&…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...