Chinaunix首页 | 论坛 | 博客
  • 博客访问: 325261
  • 博文数量: 81
  • 博客积分: 1810
  • 博客等级: 上尉
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-25 17:38
文章分类

全部博文(81)

文章存档

2016年(4)

2015年(11)

2014年(16)

2013年(37)

2012年(11)

2011年(2)

我的朋友

分类: LINUX

2013-08-12 16:27:16

网上一些经验总结和技术文档,收录起来.
内核调试,真是坑爹~
-------------------------
  • 用Kprobe和retprobe注册的handler运行于原子(atomic)上下文,因为它们都是运行在int3的异常处理函数或调试(debug)中断的处理函数中,并且两者都是在关闭当前cpu中断的前提下执行的。相比之下,Jprobe就灵活得多了,用它注册的handler的执行环境和原始的执行环境并没有两样,堆栈环境和cpu寄存器都是相同的。

  • 因为Jprobe执行用户注册的handler之前有保存现场(主要是int3之前的CPU寄存器的值)的工作,所以Jprobe的handler是没有办法破坏寄存器的值的,但是可以改变堆栈中的变量的值,Kprobe将没有这些限制,它对系统具有完全的访问权限,另一方面,Kprobe也比Jprobe危险得多,如果只是简单的打印一些系统信息,推荐用Jprobe,不要冒险!

  • Jprobe机制和用户空间的setjmp和longjmp的实现比较类似,事实上,它的内核代码的注释部分也是如此作类比的,所以用register_jprobe注册的代码段,最后必须要用jprobe_return进行返回,当然,如果你想让它一去不复返除外。这点就象用kprobe注册的handler必须是可以返回的函数一样。目前,能想到的就这么多了。
    BTW: 看kprobe的内核代码的时侯,发现有的地方还是有些缺陷的,比如说某些地方用preempt_disable()关闭了抢占,但是当函数出错返回的时侯,并没有打开抢占。不知道最新的内核有没有修复这些细节,懒得去看了,应该没有哪个正式的发型版会打开这个选项的。所以文章标题中所提到的注入的可能性也就比较小了,本来这个东西出现的背景就是为了方便内核开发者的调试工作!
  • ---------------------------
    http://www-128.ibm.com/developerworks/cn/linux/l-kprobes.html

    ---------------------------------
    1. IBM开发者网站: 
    使用 Kprobes 调试内核
    http://www.ibm.com/developerworks/cn/linux/l-kprobes.html
    Linux 下的一个全新的性能测量和调式诊断工具 Systemtap,第 1 部分: kprobe
    http://www.ibm.com/developerworks/cn/linux/l-cn-systemtap1
    2. 国外大学的kprobes tutorial 
    3. 《Essential Linux Device Driver》中"调试设备驱动"之kernel probes章节
    4. 《Linux Debugging and Performance Tuning: Tips and Techniques》中"Dynamic probes"一章
阅读(1701) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~