kprobe工作原理

17 篇文章 0 订阅
17 篇文章 0 订阅

http://blog.itpub.net/15480802/viewspace-1162094/

justin 2014-05-15 16:41:49


1 是什么

Kprobes 提供了一个强行进入任何内核例程并从中断处理器无干扰地收集信息的接口。使用 Kprobes可以收集处理器寄存器和全局数据结构等调试信息。开发者甚至可以使用 Kprobes 来修改寄存器值和全局数据结构的值。

它的基本工作机制是:用户指定一个探测点,并把一个用户定义的处理函数关联到该探测点,当内核执行到该探测点时,相应的关联函数被执行,然后继续执行正常的代码路径。

kprobe实现了三种类型的探测点: kprobes,jprobes和kretprobes (也叫返回探测点)。 kprobes是可以被插入到内核的任何指令位置的探测点,jprobes则只能被插入到一个内核函数的入口,而kretprobes则是在指定的内核函数返回时才被执行。

 

 

2 如何工作

1 安装一个kprobes探测点时,kprobe首先备份被探测的指令,然后使用断点指令(即在i386和x86_64的int3指令)来取代被探测指令的头一个或几个字节。

2 当CPU执行到探测点时,将因运行断点指令而执行trap操作,那将导致保存CPU的寄存器,调用相应的trap处理函数。

3 trap处理函数将调用相应的notifier_call_chain(内核中一种异步工作机制)中注册的所有notifier函数,kprobe正是通过向trap对应的notifier_call_chain注册关联到探测点的处理函数来实现探测处理的。

4它首先执行关联到探测点的pre_handler函数,并把相应的kprobestruct和保存的寄存器作为该函数的参数,接着,kprobe单步执行被探测指令的备份,最后,kprobe执行post_handler。等所有这些运行完毕后,紧跟在被探测指令后的指令流将被正常执行。

 

 

3 内部实现

每个探测点由struct kprobe组成,kprobe的核心在于int 3软中断和单步执行

kprobes只能用作内核函数的探测,所以在注册前必须检查探测点的地址是否是在内核地址

空间中。探测点的地址要么是在内核映像中(_stext和_etext之间,如果是在系统启动阶段,要在_sinittext和_einittext之间),要么是在某个内核模块的地址空间中。

如果探测点的地址是在一个内核模块中,需要增加对该模块的引用,以免模块提前卸载。

kprobes允许在同一个探测点注册多个kprobe,如果调用get_kprobe()能找到一个kprobe实例,说明已经在当前的探测点注册了一个kprobe,这种情况下会调用register_aggr_kprobe()来处理.

 

3.1 Init_kprobes()

3.2 Register_kprobe() 将探测点的指令码修改为int3指令,注册完毕,就开始kprobe的执行流程了。对于该探测点,由于其起始指令已经被修改为int 3,因此在执行到该地址时,必然会触发3号中断向量的处理流程do_int3.

3.3 Do_int3()触发kprobe注册的通知链函数,kprobe_exceptions_notify

3.4 kprobe_handler()执行在此地址上挂载的pre_handler函数,设置单步调试模式,为post_handle函数的执行做准备。由于开启了单步调试模式,执行完指令后会继续触发异常,这次的是do_debug异常处理流程

3.5 do_debug()-->post_kprobe_handler()

 

 

4 与Systemtap的关系

它使用了kprobe提供的接口来实现探测,对于每一个探测,需要定义探测点以及相应的处理函数,探测点就是指kprobe中被探测的函数或指令地址。

但在Systemtap中,用户可以指定原文件,原代码的某一行,或者一个异步事件,探测点处理函数能够立刻输出数据,与printk很类似,它也能查看内核数据。脚本然后被一个翻译器转换成C代码并编译成一个内核模块。生成的C代码编译链接之后生成一个可加载的内核模块。

http://blog.csdn.net/justlinux2010/article/details/14450001

http://blog.chinaunix.net/uid-20321537-id-3944828.html

https://www.ibm.com/developerworks/cn/linux/l-cn-systemtap1/

http://www.ibm.com/developerworks/cn/linux/l-cn-systemtap3/index.html


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值