• ARM硬件断点


    hw_breakpoint 是由处理器提供专门断点寄存器来保存一个地址,是需要处理器支持的。处理器在执行过程中会不断去匹配,当匹配上后则会产生中断。

    内核自带了硬件断点的样例linux-3.16\samples\hw_breakpoint\data_breakpoint.c

    1. static void sample_hbp_handler(struct perf_event *bp,
    2. struct perf_sample_data *data,
    3. struct pt_regs *regs)
    4. {
    5. printk(KERN_INFO "%s value is changed\n", ksym_name);
    6. dump_stack();
    7. printk(KERN_INFO "Dump stack from sample_hbp_handler\n");
    8. }
    9. static int __init hw_break_module_init(void* addr)
    10. {
    11. int ret;
    12. struct perf_event_attr attr;
    13. hw_breakpoint_init(&attr);
    14. attr.bp_addr = addr;
    15. attr.bp_len = HW_BREAKPOINT_LEN_4;//监控addr开始的4字节
    16. attr.bp_type = HW_BREAKPOINT_W | HW_BREAKPOINT_R;//读写该地址都能触发
    17. sample_hbp = register_wide_hw_breakpoint(&attr, sample_hbp_handler, NULL);
    18. if (IS_ERR((void __force *)sample_hbp)) {
    19. ret = PTR_ERR((void __force *)sample_hbp);
    20. goto fail;
    21. }
    22. printk(KERN_INFO "HW Breakpoint for write installed\n");
    23. return 0;
    24. fail:
    25. printk(KERN_INFO "Breakpoint registration failed\n");
    26. return ret;

     看网上说ARM Architecture Reference Manual Supplement ARMv8.1, for ARMv8-A architecture profile这些文档的degug register里面有。文档可以在这个网站下载

    https://developer.arm.com/documentation

    Documentation – Arm Developer

    样例代码

    1. #include <linux/perf_event.h>
    2. #include <linux/hw_breakpoint.h>
    3. struct perf_event * __percpu *sample_hbp;
    4. static void sample_hbp_handler(struct perf_event *bp,
    5. struct perf_sample_data *data,
    6. struct pt_regs *regs)
    7. {
    8. printk(KERN_INFO "value is changed\n");
    9. dump_stack();
    10. printk(KERN_INFO "Dump stack from sample_hbp_handler\n");
    11. unregister_wide_hw_breakpoint(sample_hbp);
    12. }
    13. static int hw_break_module_init(void* addr)
    14. {
    15. int ret;
    16. struct perf_event_attr attr;
    17. hw_breakpoint_init(&attr);
    18. attr.bp_addr = addr;
    19. attr.bp_len = HW_BREAKPOINT_LEN_4;
    20. attr.bp_type = HW_BREAKPOINT_W;
    21. sample_hbp = register_wide_hw_breakpoint(&attr, sample_hbp_handler, NULL);
    22. if (IS_ERR((void __force *)sample_hbp)) {
    23. ret = PTR_ERR((void __force *)sample_hbp);
    24. goto fail;
    25. }
    26. printk(KERN_INFO "HW Breakpoint for write installed\n");
    27. return 0;
    28. fail:
    29. printk(KERN_INFO "Breakpoint registration failed\n");
    30. return ret;
    31. }
    32. int arr[10] = {0};
    33. int hw_bp_test = 0;
    34. static int __init msm_serial_init(void)
    35. {
    36. ..............................
    37. pr_info("xxx msm_serial: driver initialized\n");
    38. //arr[10] = local_var_test[5];
    39. hw_break_module_init(&hw_bp_test);
    40. hw_bp_test = 1;
    41. return ret;
    42. }

    实际效果展示

    此次实验是用qemu模拟一个aarm64环境,可以看到支持6个断点 

    可以看到应该是每个cpu都注册了一个。感觉应该是在一个cpu上注册,所有cpu都会去检查(原理不清楚,上面的文档没有看明白,猜测的)

    1. struct perf_event * __percpu *
    2. register_wide_hw_breakpoint(struct perf_event_attr *attr,
    3. perf_overflow_handler_t triggered,
    4. void *context)
    5. {
    6. struct perf_event * __percpu *cpu_events, *bp;
    7. ........................................
    8. for_each_online_cpu(cpu) {
    9. bp = perf_event_create_kernel_counter(attr, cpu, NULL,
    10. triggered, context);
    11. ...................................................
    12. }

    暂时不写了

  • 相关阅读:
    Nginx配置反向代理
    高速缓冲存储器Cache的映射方式
    计算机毕业设计Java电子存证系统(源码+系统+mysql数据库+lw文档)
    2022年最新江西建筑施工物料提升(建筑特种作业)模拟题库及答案
    模拟实现atoi函数,将字符型转换成整型输出
    VMware vCenter Server 7 升级
    软件测试面试题:黑盒测试、白盒测试以及单元测试、集成测试、系统测试、验收测试的区别与联系?
    项目导入Flowable依赖会导致mybatis依赖报错
    【吴恩达】prompt engineering(原则 迭代 文本概括 推断、订餐机器人)
    AWR1843+DCA1000+mmwave_studio 采集原始数据
  • 原文地址:https://blog.csdn.net/qq_42693685/article/details/133659848