最近用KMDB跟踪FireEngine的代码时,总觉得不方便,但究竟是哪里不方便,我自己也说不清楚。第一反应是也许可以写一个kmod来让某些复杂的调试步骤简单化一点。出于这个目的,开始着手写kmod。
然而网上资料虽然很丰富,竟然Google不到kmod的资料!就算能找到的也只是关于MDB的——Google上没有的,我就认为它不存在了——因此我把编写kmod的基本步骤写在这里,当作一个小小的Hello World教程。
程序的代码如下,它只提供了一个很简单的dcmd,因为我的目的在于演示如何编译生成kmod:
$ cat simple_trace.c
#include <sys/mdb_modapi.h>
static int
simple_trace(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
{
/* do nothing */
mdb_printf("Hello KMDB");
return DCMD_OK;
}
static const mdb_dcmd_t dcmds[] = {
{"simple_trace", "wait...", "Hello world", simple_trace },
{ NULL }
};
static const mdb_modinfo_t modinfo = {
MDB_API_VERSION, dcmds, NULL
};
const mdb_modinfo_t *
_mdb_init(void)
{
return &modinfo;
}
通过下面的Makefile来编译:
$ cat Makefile
OBJS = simple_trace.o
KMODULE = simple_trace
CFLAGS += -D_KERNEL -D_KMDB
CC=cc
LD=ld
all: $(OBJS)
$(LD) -dy -r -Nmisc/kmdbmod -o $(KMODULE) $(OBJS)
.KEEP_STATE:
%.o: %.c
$(CC) $(CFLAGS) -c $<
clean:
rm -f $(OBJS)
明眼人一看就明白,其实最后的差别很简单,在kmod中对.dynamic做了一些特殊处理。当然,在Solaris内核里还有一些其他的操作,但不是必须的,所以略过了。
$ elfdump simple_trace
......
Dynamic Section: .dynamic
index tag value
[0] NEEDED 0x1 misc/kmdbmod
[1] FLAGS 0x4 [ TEXTREL ]
[2] FLAGS_1 0 0
Sign,原来就这么简单,还害得我一直读到了IP kmod的Makefile里才搞明白。好了,废话少说,接着看intern的简历。
Update:运行结果:
# mdb -K Welcome to kmdb Loaded modules: [ crypto ptm ufs unix krtld sppp nca uhci lofs genunix ip logindmux usba specfs nfs random sctp ] [1]> ::load /tmp/simple_trace Loaded modules: [ simple_trace ] [0]> ::simple_trace Hello KMDB [0]>发表于 yu [Solaris] ( 六月 08, 2005 02:24 下午 ) Permalink | 评论 [3]
反向跟踪 URL: http://blogs.sun.com/yu/entry/hello_world_in_kmdb_module1
发表一条评论:



发表于 Tao 在 2005年06月08日, 02:36 下午 CST #
发表于 GaoFeng 在 2005年06月23日, 10:51 上午 CST #
发表于 yxn 在 2005年07月12日, 09:20 下午 CST #