全部分类 | General | Music | Solaris

« 用DTrace跟踪TCP报文 | Main | OpenSolaris is alive... »
 20050608 星期三 2005年06月08日

Hello World in KMDB module

最近用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
评论:

You sure corrected "< >" fast :) Very cool, I like your blogs, keep those tips comming. Tao

发表于 Tao 在 2005年06月08日, 02:36 下午 CST #

Hi, Can gcc compile this program? I don't have cc, and /usr/ccs/bin/make can't work well for that Makefile. Reference:Solaris8,sun4u sparc SUNW,UltraAX-i2 Regards.

发表于 GaoFeng 在 2005年06月23日, 10:51 上午 CST #

gcc can compile it, but you may need some extra tools to generate the magic data in .dynamic section.

发表于 yxn 在 2005年07月12日, 09:20 下午 CST #

发表一条评论:

姓名:
电子邮件地址:
URL:

您的评论:

HTML语法: 禁用