前些天有些讨论提到了安装硬件断点的相关操作,会出现用户进程出错退出的情况,所以这里从源码里复习一下怎么在arm64机器上注册硬件断点。用户态空间安装硬件断点最常使用的是PTRACE_SETREGSET,指定寄存器集合为NT_ARM_HW_BREAK的一系列读写,从源码kernel/ptrace.c中可以观察到,实际PTRACE_SETREGSET时候只是调用到了跨平台写法
ptrace_regset其中task_user_regset_view会返回架构相关信息。这里内部使用的是arch/arm64/ptrace.c中定义的user_aarch64_view,内含aarch64_regsets其中对dbg系列寄存器定义了hw_break_get/hw_break_set来注册断点回调,核心调用流程为ptrace_hbp_set_addrptrace_hbp_set_ctrl那么这样一个硬件断点在ptrace的流程中就安装完成了,实际用户进程触发时便会自动调用ptrace_hbptriggered处理信号,接下来看这个回调怎么触发ptrace_hbptriggered回调的起始与完结点:可以看到ptrace这套接口其实很方便地把指令集中的同步异常转化为了被trace进程中的信号,被tracer异步唤醒处理。挺优雅的,具备很强的跨平台通用性,就是整体效率上不算很高。如果直接在处理同步异常时刻不挂起信号,而是直接进入到同线程用户态或内核态的handler处理动作,可以有更好的效率。目前为了解决这个handler的灵活度可以用内核lua接口绑定常用的寄存器读取与内核读取的c接口来实现,感兴趣的朋友可以关注更新。const struct user_regset_view *view = task_user_regset_view(task);
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287975.htm
[原创]复习arm64指令架构上通过ptrace安装硬件断点的源码流程
421 浏览
13 回复
牛逼
感谢分享
过来瞧瞧
感谢分享
分享一张很久之前记录硬断调用的流程图
zhuzhu_biu
分享一张很久之前记录硬断调用的流程图
图好糊。有无高清大图?
分享一张很久之前记录硬断调用的流程图
图好糊。有无高清大图?
zhuzhu_biu
分享一张很久之前记录硬断调用的流程图
你这个也太糊了不过看几个关键节点应该总结蛮好的
分享一张很久之前记录硬断调用的流程图
你这个也太糊了不过看几个关键节点应该总结蛮好的
sk97
图好糊。有无高清大图?
看雪压缩了,我没注意
图好糊。有无高清大图?
看雪压缩了,我没注意
zhuzhu_biu
sk97
图好糊。有无高清大图?
看雪压缩了,我没注意
赞,挺全面了
sk97
图好糊。有无高清大图?
看雪压缩了,我没注意
赞,挺全面了
学习学习
看看
круто
感谢