首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核调试技术——kprobe使用与实现

Linux kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。...内核源码:Linux-4.1.15 实验环境:CentOS(x86_64)、树莓派1b 2022年嵌入式开发想进互联网大厂,你技术过硬吗?...腾讯T6-9首发“Linux内核源码嵌入式开发进阶笔记”,差距不止一点点哦 一、kprobes技术背景 开发人员在内核或者模块的调试过程中,往往会需要要知道其中的一些函数有无被调用、何时被调用、执行是否正确以及函数的入参和返回值是什么等等...内核学习网站: Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈 二、kprobe原理 下面来介绍一下kprobe是如何工作的。...涉及的API函数接口如下: int register_kprobe(struct kprobe *kp) //向内核注册kprobe探测点 void unregister_kprobe(struct

2.6K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux内核调试技术——kprobe使用与实现

    Linux kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。...内核源码:Linux-4.1.15 实验环境:CentOS(x86_64)、树莓派1b 一、kprobes技术背景 开发人员在内核或者模块的调试过程中,往往会需要要知道其中的一些函数有无被调用、何时被调用...2、注册一个kprobe实例 kprobe探测模块调用register_kprobe向kprobe子系统注册一个kprobe探测点实例,代码路径kernel/kprobes.c int register_kprobe...函数设置当前正在处理的kprobe并更新kprobe状态标识为KPROBE_HIT_ACTIVE,表明开始处理该kprobe。...当然这只是其中一个简单的例子,对于其他一些复杂的多周期指令其模拟函数会实现的比较复杂,甚至有一些无法模拟的指令在注册时probes_decode_insn函数就会返回INSN_REJECTED了。

    6K21

    Linux内核调试技术——kprobe使用与实现(四)

    Linux内核调试技术——kprobe使用与实现(一) Linux内核调试技术——kprobe使用与实现(二) Linux内核调试技术——kprobe使用与实现(三) Linux内核调试技术——kprobe...使用与实现(四)--kprobe内核注册过程 kprobe探测模块调用register_kprobe向kprobe子系统注册一个kprobe探测点实例,代码路径kernel/kprobes.c ?...回到register_kprobe函数中,下面调用check_kprobe_rereg函数防止同一个kprobe实例被重复注册,其中check_kprobe_rereg->__get_valid_kprobe...回到register_aggr_kprobe函数中,如果本次是第二次以上向同一地址注册kprobe实例,则此时的orig_p已经是aggr kprobe了,则会调用kprobe_unused函数判断该kprobe...接下来调用再次copy_kprobe将aggr kprobe中保存的指令opcode和ainsn字段拷贝到本次要注册的kprobe的对应字段中,然后调用add_new_kprobe函数将新注册的kprobe

    2.7K20

    Linux内核调试利器|kprobe 原理与实现

    在《Linux 内核调试利器 | kprobe 的使用》一文中,我们介绍过怎么使用 kprobe 来追踪内核函数,而本文将会介绍 kprobe 的原理和实现。...下图展示了 kprobe 的执行流程: (图4) kprobe 实现 了解了 kprobe 的原理后,现在我们开始分析 kprobe 的代码实现。...kprobe模块哈希表 我们在《Linux 内核调试利器 | kprobe 的使用》一文中介绍过,一个 kprobe 模块是由一个 struct kprobe 结构来描述的。...注册 kprobe 实例 在《Linux 内核调试利器 | kprobe 的使用》一文中介绍过,编写好的 kprobe 模块需要通过调用 register_kprobe() 函数来注册到内核。...为了解决这个问题,Linux 内核使用单步调试模式来处理这种情况。

    3.5K40

    Linux内核调试技术——kprobe使用与实现(三)

    Linux内核调试技术——kprobe使用与实现(一) Linux内核调试技术——kprobe使用与实现(二) 对于kprobe功能的实现主要利用了内核中的两个功能特性:异常(尤其是int 3),单步执行...主要包括kprobes的初始化、注册kprobe和触发kprobe(包括arm结构和x86_64架构的回调函数和single-step单步执行) 本篇文章首先介绍kprobe的初始化过程。 ?...接下来调用populate_kprobe_blacklist函数将kprobe实现相关的代码函数保存到kprobe_blacklist这个链表中去,用于后面注册探测点时判断使用,注意这里的__start_kprobe_blacklist...例如其中的get_kprobe函数: ?...再次回到init_kprobes函数,接下来分别注册die和module的内核通知链kprobe_exceptions_nb和kprobe_module_nb: ? ?

    1.9K10

    Linux内核调试技术——kprobe使用与实现(五)

    Linux内核调试技术——kprobe使用与实现(一) Linux内核调试技术——kprobe使用与实现(二) Linux内核调试技术——kprobe使用与实现(三) Linux内核调试技术——kprobe...使用与实现(四) Linux内核调试技术——kprobe使用与实现(五)-触发kprobe探测和回调 前文中,从register_kprobe函数注册kprobe的流程已经看到,用户指定的被探测函数入口地址处的指令已经被替换成架构相关的...1,针对reenter的情况会将kprobe_status状态设置为KPROBE_REENTER并调用save_previous_kprobe执行保存当前kprobe的操作)。...2、p存在但curent_kprobe不存在 ? 这是一般最通用的kprobe执行流程,首先调用set_current_kprobe绑定p为当前正在处理的kprobe: ?...并设置kprobe_status为KPROBE_REENTER;对于非重入的情况则设置kprobe_status为KPROBE_HIT_SS。

    2.4K60

    kprobe 和 kretprobe 隐藏的秘密

    我总劝人不要用 kretprobe 耍技巧,会脱手, Linux kernel 的 kretprobe 机制和 kprobe 完全不同,本质原因在于,函数的入口地址是固定的,但函数的返回地址不固定,由于返回位置不固定...因此,kprobe 在register 时即可将 hook 挂载,与 kprobe 不同,kretprobe 需在函数每次被调用时才能将 hook 挂载。...同一个 kretprobe hook,不同 kretprobe instance,Linux kernel 预分配了若干(与 CPU 数量相关) kretprobe instance,挂接在 kretprobe...该函数的注释是:This kprobe pre handler is registered with every kretprobe....经理知道 kprobe/kretprobe,但并不真懂,仅科普水平,或做过 demo,但也仅此。对技术细节非常感兴趣又亲自指挥细节的经理不是合格经理。

    51010

    这才是kprobe工作的本质

    kprobe的工作过程大致如下: 注册kprobe。...注册的每个kprobe对应一个kprobe结构体,该结构体记录着插入点(位置),以及该插入点本来对应的指令original_opcode; 替换原有指令。...步骤2,3,4便是一次kprobe工作的过程,它的一个基本思路就是将本来执行一条指令扩展成执行kprobe->pre_handler--->指令--->kprobe-->post_handler这样三个过程...在异常态中,内核通过BRK指令的错误码判断这是一个kprobe异常,于是进入了kprobe处理函数。...kprobe异常处理函数会根据发生异常的地址来找到对应的kprobe(kprobe的addr域记录着地址),执行kprobe的pre_handler函数,然后设置single-step相关的寄存器,为下一步执行原指令时发生

    75920

    eBPF 入门开发实践指南二:在 eBPF 中使用 kprobe 监测捕获 unlink 系统调用

    eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。...kprobes的特点与使用限制: kprobes允许在同一个被被探测位置注册多个kprobe,但是目前jprobe却不可以;同时也不允许以其他的jprobe回调函数和kprobe的post_handler...> char LICENSE[] SEC("license") = "Dual BSD/GPL"; SEC("kprobe/do_unlinkat") int BPF_KPROBE(do_unlinkat...)的一个例子。...更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:https://github.com/eunomia-bpf/eunomia-bpf 本文是 eBPF 入门开发实践指南的第二篇。

    85520

    使用 BPF 记录 TCP 重传和丢包记录

    在 BPF 出现之前 在 BPF 出现之前,在 Linux 上我们也是可以解决这个问题的,只不过比较繁琐,需要对内核、调试器、编译器等许多基础知识有较深理解,参见这里。...这是一个庞大且复杂的结构体,而且对于 kprobe 来说,我们只能使用寄存器以及偏移来输出其值。...有了这些背景知识后,我们可以使用 kprobe 来达成这一目标,记录 TCP 重传的例子如下: $ echo 'p:kprobes/tcp_retransmit tcp_retransmit_skb port...对于上面的例子,一个等价的 BPF 程序如下: #include linux/ptrace.h> #include int log_tcp_retransmit(...与传统的 kprobe 方式相比, BPF 带来的可编程性极大地提升了开发效率,既没有增加系统的复杂度,也不会牺牲执行效率和安全性。

    3.5K90
    领券