2012-03-06 44 views
1

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

我可以加载它没有问题与“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) 

还有什么应该怎么办?

+0

在您的示例代码中,您没有检查modstat()调用的结果。它可能会以一些有趣的方式失败 - 你应该检查它的结果,如果它不是0,就调用err()。如果有错误信息,可能会帮助你弄清楚结果。 – 2013-07-22 18:07:41

回答

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是“该模块未找到(可能未加载)”。