在FreeBSD中写一个kld

时间:2012-03-06 14:08:32

标签: freebsd

我正在FreeBSD上写一个新的KLD。 我有一个像这样的C文件: Question about writing my own system call in FreeBSD - 但我的代码的功能有点不同。我正在初始化内核空间中的变量,我的函数名是my_KLD

我可以使用“kldload”加载它而没有问题,但是我有一个问题:我将通过另一个C文件使用这个kld。

文件结构如下:

int
main(int argc, char **argv)
{

 f ( atoi(argv[1]) ;

}

f ( int x) { 
       printf("hi\n");
       int syscall_num ; 
       struct module_stat stat ; 
       stat.version = sizeof(stat) ;
       modstat (modfind("my_KLD") , &stat) ; 
       syscall_num = stat.data.intval ; 
       return syscall (syscall_num , x ) ;
}

但是当我用参数x调用这个文件时 结果是:

hi 
Bad System call (core dumped) 

我还应该做些什么?

1 个答案:

答案 0 :(得分:1)

除了Srh BlueOcean的评论之外,您还应该检查modfind()返回的值。你假设它可以找到你的KLD,这是一个很大的假设。无论出于何种原因,都不得加载KLD。

我发现较小的步骤更好,所以调用modfind并打印出整数ID以查看它是正还是负(-1是错误)。

这样的事情:

int modid;

if ((modid = modfind("my_KLD")) < 0) {
    perror("modfind failed");
    exit(1);
}
if (modstat(modid, &stat) < 0) {
    perror("modstat failed");
    exit(1);
}

perror()函数将为您提供错误消息,您可以检查手册页以确定导致错误的原因。例如,ENOENT是“找不到模块(可能没有加载)。”