使用data breakpoint 追踪地址寄存器被修改的问题_register_user_hw_breakpoint_hjg__的博客-程序员秘密

一. 介绍

data breakpoint是一种特殊的断电,在处理检查到预设地址的值发生R/W操作时,发生断点中断。

二. 使用方法1

kernel有示例代码,在data_breakpoint.c中,在这里,kernel检查的是symbol的值发生变化,但是实际上测试发现直接使用寄存器地址也是可以的。
  
  看看.config里面,CONFIG_SAMPLES是否选中。
位置在Kernel Hacking/Sample kernel code。

samples目录好像不在缺省编译的范围内,自己手动编译就行了。
make M=samples即可。

aarch32 linux4.9

kernel 有breakpoint的编码实例data_breakpoint.c

相关函数:

register_wide_hw_breakpoint //kernel space 地址

register_user_hw_breakpoint //user space 地址

breakpoint 与 watchpoint 的原理需要查阅armv7_architecture_reference_manual

watchpoint:If the cause of the debug exception is a Watchpoint debug event, then a Data Abort exception is generated
————————————————
版权声明:本文为CSDN博主「shenhuxi_yu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shenhuxi_yu/article/details/83155106
/*

  • data_breakpoint.c - Sample HW Breakpoint file to watch kernel data address
  • This program is free software; you can redistribute it and/or modify
  • it under the terms of the GNU General Public License as published by
  • the Free Software Foundation; either version 2 of the License, or
  • (at your option) any later version.
  • This program is distributed in the hope that it will be useful,
  • but WITHOUT ANY WARRANTY; without even the implied warranty of
  • MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  • GNU General Public License for more details.
  • You should have received a copy of the GNU General Public License
  • along with this program; if not, write to the Free Software
  • Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  • usage: insmod data_breakpoint.ko ksym=<ksym_name>
  • This file is a kernel module that places a breakpoint over ksym_name kernel
  • variable using Hardware Breakpoint register. The corresponding handler which
  • prints a backtrace is invoked every time a write operation is performed on
  • that variable.
  • Copyright IBM Corporation, 2009
  • Author: K.Prasad [email protected]
    /
    #include <linux/module.h> /
    Needed by all modules /
    #include <linux/kernel.h> /
    Needed for KERN_INFO /
    #include <linux/init.h> /
    Needed for the macros */
    #include <linux/kallsyms.h>

#include <linux/perf_event.h>
#include <linux/hw_breakpoint.h>

struct perf_event * __percpu *sample_hbp;

static char ksym_name[KSYM_NAME_LEN] = “pid_max”;
module_param_string(ksym, ksym_name, KSYM_NAME_LEN, S_IRUGO);
MODULE_PARM_DESC(ksym, “Kernel symbol to monitor; this module will report any”
" write operations on the kernel symbol");

static void sample_hbp_handler(struct perf_event *bp,
struct perf_sample_data *data,
struct pt_regs *regs)
{
printk(KERN_INFO “%s value is changed\n”, ksym_name);
dump_stack();
printk(KERN_INFO “Dump stack from sample_hbp_handler\n”);
}

static int __init hw_break_module_init(void)
{
int ret;
struct perf_event_attr attr;

hw_breakpoint_init(&attr);
attr.bp_addr = kallsyms_lookup_name(ksym_name);
attr.bp_len = HW_BREAKPOINT_LEN_4;
attr.bp_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R;

sample_hbp = register_wide_hw_breakpoint(&attr, sample_hbp_handler, NULL);
if (IS_ERR((void __force *)sample_hbp)) {
    ret = PTR_ERR((void __force *)sample_hbp);
    goto fail;
}

printk(KERN_INFO "HW Breakpoint for %s write installed\n", ksym_name);

return 0;

fail:
printk(KERN_INFO “Breakpoint registration failed\n”);

return ret;

}

static void __exit hw_break_module_exit(void)
{
unregister_wide_hw_breakpoint(sample_hbp);
printk(KERN_INFO “HW Breakpoint for %s write uninstalled\n”, ksym_name);
}

module_init(hw_break_module_init);
module_exit(hw_break_module_exit);

MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“K.Prasad”);
MODULE_DESCRIPTION(“ksym breakpoint”);

三. 使用方法2

上面是使用kernel的hw_breakpoint走watchpoint来注册的,实际上这里有一层封装,我们直接使用arch/arm下面的hw_breakpoint也是可以的。

这里直接给代码链接了:https://elixir.bootlin.com/linux/v4.6/source/arch/arm/kernel/hw_breakpoint.c

有很多操作寄存器的地方,比较底层了,不过便于理解。

三. 使用方法2

上面是使用kernel的hw_breakpoint走watchpoint来注册的,实际上这里有一层封装,我们直接使用arch/arm下面的hw_breakpoint也是可以的。

这里直接给代码链接了:https://elixir.bootlin.com/linux/v4.6/source/arch/arm/kernel/hw_breakpoint.c

有很多操作寄存器的地方,比较底层了,不过便于理解。
四. 第一种方法的结果

pid_max value is changed
CPU: 2 PID: 439 Comm: kworker/u8:3 Tainted: P W O 4.19.166 #2
Hardware name: xxxx (DT)
Workqueue: events_unbound call_usermodehelper_exec_work
Call trace:
dump_backtrace+0x0/0x164
show_stack+0x20/0x2c
dump_stack+0xb8/0xf0
sample_hbp_handler+0x28/0x3c [data_breakpoint]
__perf_event_overflow+0x94/0xe0
perf_swevent_event+0x98/0x104
perf_bp_event+0x6c/0x98
watchpoint_report+0x80/0x94
watchpoint_handler+0x100/0x208
do_debug_exception+0xe8/0x174
el1_dbg+0x18/0xa8
alloc_pid+0x80/0x284
copy_process+0xb48/0x1960
_do_fork+0xa0/0x434
kernel_thread+0x40/0x50
call_usermodehelper_exec_work+0x40/0xd8
process_one_work+0x210/0x3e8
worker_thread+0x228/0x3c4
kthread+0x13c/0x14c
ret_from_fork+0x10/0x18
Dump stack from sample_hbp_handler

六. 注意的地方

data breakpoint不同于breakpoint,发生异常后,因为寄存器中的值不会被清除,所以会一直循环中断
  
一般的,我们通过调用单步执行,并且清掉异常寄存器的值,让程序可以继续执行,这样在下次发生异常的时候还可以继续进入data watchpoint

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012787604/article/details/118112582

智能推荐

软件测试面试(1)_weixin_30338481的博客-程序员秘密

 一、软通动力面试笔答  1.白箱测试和黑箱测试是什么?什么是回归测试?  2.单元测试、集成测试、系统测试的侧重点是什么?  单元测试的重点是系统的模块,包括子程序的正确性验证等。  集成测试的重点是模块间的衔接以及参数的传递等。  系统测试的重点是整个系统的运行以及与其他软件的兼容性。  3.设计用例的方法、依据有那些?  白盒测试用例设计有如下方法:基本路径测试\...

每日练习9_Jason Statham_jeb的博客-程序员秘密

程序中每隔3秒读取文件内容,显示并写入另一个文件,同时,写入时间戳!#include &lt;stdio.h&gt;#include &lt;time.h&gt;#include &lt;unistd.h&gt;#include &lt;errno.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;#include &lt;windows.h&gt;#define N 64int main(int argc, char **arg

Docker的安装配置及使用详解_docker bashrc_凌_风的博客-程序员秘密

基本概念Docker 包括三个基本概念镜像(Image)容器(Container)仓库(Repository)先理解了这三个概念,就理解了 Docker 的整个生命周期。1、docker安装与启动yum install -y epel-releaseyum install docker-io # 安装docker# 配置文件 /etc/sysconfig/dockerchkconfig

存储-ISCSI_iscsistorage_淡若静水Summer的博客-程序员秘密

存储-ISCSI简介:由于SAN技术是基于光环境实现的存储;ISCSI是将数据块映射成以太网数据包,从而实现IP协议上运行的指令集。将SCSI数据块映射成以太网数据包。在centos7环境部署iscsi:实验1:1个导出端,1个导入端角色IPstorage172.16.0.50node1172.16.0.51准备工作要完成。1. 配置存储端[ro...

树和森林转二叉树,二叉树无右孩子(或右指针域为空)的结点个数计算思路_树对应的二叉树无右孩子_程序员班长的博客-程序员秘密

前提是知道非终端结点(分支结点)的个数,假设非终端结点的个数为n1.对于树转二叉树:因为转化规则是“左孩子右兄弟”,如果有n个分支结点,因为每个分支结点都会有孩子,这些孩子都是兄弟,然而最右边的孩子已经没有右兄弟了,没有右兄弟就意味着在转化为二叉树后这个孩子没有右孩子——即右指针域为空。又因为每个分支结点都存在一个没有右兄弟的孩子,所以n个分支结点就存在n个没有右兄弟的孩子,在转化为二叉树后这些孩子的右指针域都为空。最后,不要忘记树的根结点是没有兄弟的,所有在转化为二叉树后根结点的右指针域也

随便推点

张量(Tensor)的技术以及它在不同场景中的应用_张量应用_贪心科技的博客-程序员秘密

摘要本文主要介绍张量(Tensor)相关技术以及张量在数据恢复(missing data)、推荐中的应用。在文章的最后,简单介绍怎么通过ADMM算法吧把张量应用在大规模数据上。文章的内容来自于葛瀚骋博士、现任美国亚马逊资深科学家。我们现在所处的时代是一个信息爆炸的时代,许多现代的信息系统,比如物联网,电子健康记录,以及社交网络,每天都在不断产生着新的数据,这些数据是以指数级的方式去增长的。它的特点...

记录关于获取宽高以及距离父元素距离的方法_获取div距离父元素的距离_啦咔的博客-程序员秘密

记录关于获取宽高以及距离父元素距离的方法记录原因,在拖动的时候经常会使用到距离父元素的距离,以及宽高等一些方法。offsetWidth,offsetHeight,offsetTop,offsetLeft等相关属性。关于offsetWidth和offsetHight 、 offsetTop和offsetLeft关于clientWidth和clientHeigh 、 clientTop和clientL...

使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析_weixin_30563917的博客-程序员秘密

使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析使用搜索引擎计数构建快速、高效和可扩展的数据驱动应用程序Apache Lucene 和 Solr 是强大的开源搜索技术,使组织能够轻松地显著增强数据访问。借助 4.x 版的 Lucene 和 Solr,向数据驱动应用程序中添加可扩展的搜索功能变得比以往更加轻松。Lucene 和 Solr 提交者 G...

cocos2dx基础篇(2)——Win32移植到Android_weixin_34379433的博客-程序员秘密

【安装工具】 JDK Eclipse 或直接下一个 ADT集成开发工具 SDK NDK9r ADT CDT 安装方法自行百度。【正文】 1、由 Cocos2D-X 和 VS2010 环境配置——1 中提到的python方法,创建新项目。 然后将你开发好的win项目相应的文件Classes和R...

Docker部署springcloud微服务项目_LJiaWang的博客-程序员秘密

1. 使用Dockerfile构建微服务镜像1. 打包微服务1、使用maven把eureka服务打包为 ***.jar 包2、上传jar到linux 文件目录下 例如:/usr/local/micro2. 创建Dockerfile文件添加如下内容FROM java:8 VOLUME /usr/local/docker/microADD eurekaser...

推荐文章

热门文章

相关标签