【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架构和操作系统的权限模型有深入的理解。

测试代码见后续文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/704256.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

字符串反转巧妙处理、拼接、空格的跳跃处理-151. 反转字符串中的单词

题目链接及描述 151. 反转字符串中的单词 - 力扣&#xff08;LeetCode&#xff09; 题目分析 今天又遇到了曾经做过的题目&#xff0c;对于这道题目&#xff0c;曾经做过几遍了&#xff0c;即使之前做过&#xff0c;今天又遇到这道题目时&#xff0c;对于边界的处理仍然不够完…

pikachu靶场(命令执行(RCE)通关教程)

第1关 exec "ping" 1.打开网站 看到一个ping的字样&#xff0c;想到这里应该是要写一个IP地址&#xff0c;这里用本地回环地址 可以看到返回了&#xff0c;根据返回的TTL值&#xff0c;猜想到这里应该是Windows 使用命令可以观看之前写的博客。 所以直接写入127.…

Ubuntu20.04.6操作系统安装教程

一、VMware Workstation16安装 选择安装VMware Workstation&#xff0c;登录其官网下载安装包&#xff0c;链接如下&#xff1a; 下载 VMware Workstation Pro 下载后运行安装向导&#xff0c;一直Next即可。 二、Ubuntu镜像下载 ubuntu20.04 选择需要下载的镜像类型下载即…

git 如何撤销已经 push 的 merge

今天在合并代码时, 发现自己失误把另外一个分支 B 的代码合并到了自己分支 C, 于是想到要撤销这次 merge 一般地, 如果我们想要撤销某次 commit 可以 git revert <commit-id>. 然而, 对于 merge 类型的 commit 不能直接 git revert <commit-id> 这里举个例子: 我…

[vue2]深入理解vuex

本节内容 概述初始化仓库定义数据访问数据修改数据处理异步派生数据模块拆分案例-购物车 概述 vuex是一个vue的状态管理工具, 状态就是数据 场景 某个状态在很多个组件使用 (个人信息)多个组件 共同维护 一份数据 (购物车) 优势 数据集中式管理数据响应式变化 初始化仓库 …

如何降低pcdn的延迟?

要降低P2P CDN的延迟&#xff0c;可以采取以下操作&#xff1a; 一&#xff0e;优化网络连接&#xff1a; 1、使用有线网络连接替代无线连接&#xff0c;因为有线连接通常提供更稳定的数据传输。 2、升级家庭或企业路由器&#xff0c;选择性能更好的路由器以提高网络传输速度…

ant-design-vue 的modal.confirm突然无法自动关闭

这个是我当前的版本 &#xff0c;点击不能 关闭&#xff0c; 版本的问题 修改 &#xff1a; "vue": "~3.2.0", 重新下包就ok了 参考 &#xff1a; antdesign的modal.confirm突然无法自动关闭_antdesign confirm点击后不关闭-CSDN博客

基于WPF技术的换热站智能监控系统03--实现左侧加载动画

1、左侧布局规划 左侧分5行&#xff0c;每行的高度通过height属性来指定&#xff0c;1.2*表示占1.2倍的宽度 2、创建用户控件 在WPF中想要进行个性化处理&#xff0c;主要可以通过三个方面来实现&#xff1a;控件模板&#xff08;控件模板、数据模板、数据容器模板&#xff09…

python学习 -You-Get视频下载使用案例

You-Get 是一个命令行程序&#xff0c;提供便利的方式来下载网络上的媒体信息。 You-Get 是一个用于从网页下载媒体内容&#xff08;如视频、音频、图片&#xff09;的Python库。它支持多种网站&#xff0c;能够捕获并下载这些网站中直接或间接提供的媒体资源。You-Get 的设计…

2024年金融、贸易与创意产业国际会议(ICFTCI 2024)

2024 International Conference on Financial Trade and Creative Industries 【1】大会信息 会议简称&#xff1a;ICFTCI 2024 大会地点&#xff1a;中国西安 投稿邮箱&#xff1a;icftcisub-paper.com 【2】会议简介 2024年金融贸易与创意产业国际会议即将召开&#xff…

2024年中国移动游戏市场研究报告

来源&#xff1a;点点数据&#xff1a; 近期历史回顾&#xff1a; 面向水泥行业的5G虚拟专网技术要求&#xff08;2024&#xff09;.pdf 2024年F5G-A绿色万兆全光园区白皮书.pdf 2024年全球废物管理展望报告.pdf 内容管理系统 2024-2025中国羊奶粉市场消费趋势洞察报告.pdf 20…

Spring Boot + EasyExcel + SqlServer 进行批量处理数据

前言 在日常开发和工作中&#xff0c;我们可能要根据用户上传的文件做一系列的处理&#xff0c;本篇文章就以Excel表格文件为例&#xff0c;模拟用户上传Excel文件&#xff0c;讲述后端如何高效的进行数据的处理。 一.引入 EasyExcel 依赖 <!-- https://mvnrepository.com/…

centos下创建raid6磁盘阵列

在CentOS系统中创建RAID 6阵列&#xff0c;可以使用mdadm工具。 以下是创建RAID 6阵列的基本步骤和示例代码&#xff1a; 安装mdadm工具&#xff08;如果尚未安装&#xff09;&#xff1a; sudo yum install mdadm 假设你有至少四个以上的磁盘设备&#xff08;例如 /dev/sdi…

Visual Studio Code的安装与配置

Visual Studio Code&#xff08;简称 VS Code&#xff09;是 Microsoft 在2015年4月30日 Build 开发者大会上正式宣布一个运行于 Mac OS X、Windows和 Linux 之上的&#xff0c;针对于编写现代 Web 和云应用的跨平台源代码编辑器&#xff0c;可在桌面上运行&#xff0c;并且可用…

golang函数

【1】函数&#xff1a; 对特定的功能进行提取&#xff0c;形成一个代码片段&#xff0c;这个代码片段就是我们所说的函数 【2】函数的作用&#xff1a;提高代码的复用性 【3】函数和函数是并列的关系&#xff0c;所以我们定义的函数不能写到main函数中 【4】基本语法 func 函…

Redis高并发高可用

1. 复制机制 在分布式系统中&#xff0c;为了解决单点问题&#xff0c;通常会将数据复制多个副本部署到其他机器&#xff0c;以满足故障恢复和负载均衡等需求。Redis提供了复制功能&#xff0c;实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础&#xff0c;后面的…

DeepSpeed Monitoring Comm. Logging

Monitoring 支持多种后端&#xff1a;Tensorboard、WandB、Comet、CSV文件&#xff1b; TensorBoard例子&#xff1a; 自动监控&#xff1a;DeepSpeed自动把重要metric记录下来。只需在配置文件里enable相应的看板后端即可&#xff1a; {"tensorboard": {"enabl…

HTML+CSS+JS 自定义下拉菜单

效果演示 实现了一个下拉菜单的动画效果&#xff0c;包括一个主按钮和一个下拉菜单列表。点击主按钮会展开下拉菜单列表&#xff0c;同时箭头会旋转&#xff0c;列表项会逐渐显示出来。鼠标悬停在列表上时&#xff0c;会出现一个浮动图标。整个下拉菜单的样式比较简洁&#xff…

vue3第三十九节(TS中的高级类型,分类以及使用注意事项)

前言&#xff1a;为什么需要使用高级类型&#xff0c;正常的类型不能满足日常的业务需求&#xff0c;对于复杂的数据结构、函数签名、类型转换&#xff0c;我们需要使用高级类型来处理&#xff0c;常用的高级类型包含以下几种&#xff1a; 常用的类型定义&#xff1a; 基本类…

理解 GPIO 的推挽与开漏

在日常的嵌入式开发过程当中&#xff0c;GPIO可以说是接触最多的外设了。小到点亮一个LED灯&#xff0c;大到模拟总线通讯&#xff0c;都必不可少地需要用到GPIO资源。而对于GPIO的两大输出模式 ——推挽输出和开漏输出&#xff0c;你是否真正理解了呢&#xff1f; 首先我们看…