Kprobe和debugfs

来源:互联网 发布:php代码保护 编辑:程序博客网 时间:2024/05/21 08:54

最新发现linux有个巨好用的工具--kprobes.几乎可以在任何指令上probe,这样对kernel的性能分析和调试都有很大的帮助。关键这和bdi3000这样的调试工具相比可以不需要中断cpu操作,代价是多些指令消耗。

在读kprobes源码的时候又研究了下debugfs接口,这也是个在用户态下观察内核信息的好方法。debugfs从名称上看是个文件系统,里面的接口是文件的file operations. 使用debugfs_create_file将file operations同debugfs特定文件链接起来。使用seq file接口来管理file operations时,仅需要定制file_open接口,这里引入一个 seq_operations 结构。

debugfs, procfs一度让我十分迷惑,二者功能上如功类似,为什么这个关键的特性都会在内核里存在呢?IBM documents 中的这篇文章给我了答案:[[

在 Linux 下用户空间与内核空间数据交换的方式,第 2 部分: procfs、seq_file、debugfs和relayfs

][http://www.ibm.com/developerworks/cn/linux/l-kerns-usrs2/index.html]]


procfs

procfs是比较老的一种用户态与内核态的数据交换方式,内核的很多数据都是通过这种方式出口给用户的,内核的很多参数也是通过这种方式来让用户方便设置的。除了sysctl出口到/proc下的参数,procfs提供的大部分内核参数是只读的。实际上,很多应用严重地依赖于procfs,因此它几乎是必不可少的组件。前面部分的几个例子实际上已经使用它来出口内核数据,但是并没有讲解如何使用,本节将讲解如何使用procfs。

seq_file

一般地,内核通过在procfs文件系统下建立文件来向用户空间提供输出信息,用户空间可以通过任何文本阅读应用查看该文件信息,但是procfs有一个缺陷,如果输出内容大于1个内存页,需要多次读,因此处理起来很难,另外,如果输出太大,速度比较慢,有时会出现一些意想不到的情况,Alexander Viro实现了一套新的功能,使得内核输出大文件信息更容易,该功能出现在2.4.15(包括2.4.15)以后的所有2.4内核以及2.6内核中,尤其是在2.6内核中,已经大量地使用了该功能。

debugfs

内核开发者经常需要向用户空间应用输出一些调试信息,在稳定的系统中可能根本不需要这些调试信息,但是在开发过程中,为了搞清楚内核的行为,调试信息非常必要,printk可能是用的最多的,但它并不是最好的,调试信息只是在开发中用于调试,而printk将一直输出,因此开发完毕后需要清除不必要的printk语句,另外如果开发者希望用户空间应用能够改变内核行为时,printk就无法实现。因此,需要一种新的机制,那只有在需要的时候使用,它在需要时通过在一个虚拟文件系统中创建一个或多个文件来向用户空间应用提供调试信息。


原创粉丝点击