我正在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)
我还应该做些什么?
答案 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是“找不到模块(可能没有加载)。”