通常我们在做内核编程的时候,会用到内核的数据结构,比如说textsearch提供了几种算法用于支付串查找。在用于正式的项目前,我们会希望考察下他的用法以及想体验下。最通常的做法是自己写个module,写个makefile,编译,运行,然后去dmesg里面看printk的结果。这个过程没啥问题,就是太罗嗦。好了,现在我们有更方便的方法了:systemtap.
Systemtap是个脚本,先翻译成c kernel模块代码,然后编译,插入到内核运行,同时提供最基本的内核和应用模块的通讯管道,在应用模块这里收集信息。 它还支持guru模式,让用户直接插入c代码。 这样我们就可以利用stap的这一特性来做我们的实验。
底下我们来演示下:
function test_textsearch:long (algo:string) %{ /* pure */ /* unprivileged */ |
ts = textsearch_prepare(THIS->algo, "world" , 5, GFP_KERNEL, TS_AUTOLOAD); |
_stp_printf( "%s\n" , "prepare ok!" ); |
if (UINT_MAX==textsearch_find_continuous(ts, &state, "hello world" , 11)) goto err; |
_stp_printf( "%s\n" , "find ok!" ); |
_stp_printf( "%s\n" , "init error!" ); |
printf ( "result:%d\n" , test_textsearch(@1)); |
%%请注意我们上面用到了 _stp_printf,代替printk, 这个是stap的runtime的基础服务。 |
cool吧! 把c语言当脚本编写啦。
但是这个stap有个缺点,就是头文件必须是内核include路径里面的,如果我们用到了其他头文件,编译的时候就出错。
--- ts.stp 2010-11-08 12:04:54.000000000 +0800 |
+++ ts1.stp 2010-11-10 14:19:47.000000000 +0800 |
/tmp/stapKuLo9R/stap_90d03f83d4d4a8efa7b721a6ff0093fe_2503.c:169:17: error: xyz.h: No such file or directory |
make [1]: *** [/tmp/stapKuLo9R/stap_90d03f83d4d4a8efa7b721a6ff0093fe_2503.o] Error 1 |
make : *** [_module_/tmp/stapKuLo9R] Error 2 |
Pass 4: compilation failed. Try again with another '--vp 0001' option. |
这个问题挺烦人的,但是我们有探索精神,不怕的,我们来crack下吧
> o << "EXTRA_CFLAGS += $(STAP_CFLAGS)" << endl; |
到现在为止 stap是crack过的. 我们再来实验下吧!首先把我们的头文件所在的路径通知到systemtap,它会在让编译模块的时候加上我们的头文件路径。
哈哈,成功了。
大家可以这样的方式用stap写很多好玩的东西,祝玩的开心。