FreeBSD从另一个系统调用发出系统调用

问题描述:

我写了一些像1年前的freebsd内核模块,当时他们工作正常。但现在我无法编译。FreeBSD从另一个系统调用发出系统调用

我想要做的是通过修改同义表来挂钩现有的系统调用。

static int 
mkdir_hook (struct proc *p, struct mkdir_args *ua) 
{ 
printf("Making dir: %s\n", ua->path); 
return mkdir(p, ua); 
} 

static int 
load (struct module *module, int cmd, void *arg) 
{ 
int error = 0; 

switch (cmd) { 
    case MOD_LOAD : 
     sysent[SYS_mkdir]=mkdir_hook_sysent; 
     break; 
    case MOD_UNLOAD : 
     sysent[SYS_mkdir].sy_call=(sy_call_t*)mkdir; 
     break; 
    default : 
     error = EINVAL; 
     break; 
    } 
return error; 
} 

我收到以下错误

test.c:21: warning: implicit declaration of function 'mkdir' 
test.c:21: warning: nested extern declaration of 'mkdir' [-Wnested-externs] 
test.c:49: error: 'mkdir' undeclared (first use in this function) 
test.c:49: error: (Each undeclared identifier is reported only once 
test.c:49: error: for each function it appears in.) 

所以我想可能是缺少库。这里是我的包括

#include <sys/types.h> 
#include <sys/param.h> 
#include <sys/proc.h> 
#include <sys/module.h> 
#include <sys/sysent.h> 
#include <sys/kernel.h> 
#include <sys/systm.h> 
#include <sys/linker.h> 
#include <sys/sysproto.h> 
#include <sys/sysent.h> 
#include <sys/proc.h> 
#include <sys/syscall.h> 

我读man 2 mkdir,仍然没有线索。看起来,不再支持从内核模块调用另一个系统调用,或者它需要额外的配置?

请大家帮忙,非常感谢。

现在,系统调用条目的前缀为“sys_”,因此您应该使用sys_mkdir而不是现在的mkdir。

确切变更为:

r225617 | kmacy | 2011-09-16 06:58:51 -0700(星期五,2011年9月16日)| 12行

为了最大化内核代码的可重用性在用户空间这 补丁修改makesyscalls.sh前缀所有的非兼容性 呼叫以sys_(例如没有,freebsd32_ linux_),并更新内核 入口点和使用它们的代码中的所有地方。它也 通过重命名内核 psignal kern_psignal()来修复内核函数 psignal和同名的libc函数之间的额外名称空间冲突。现在通过引入这个改变,我们将会缓解未来 改变系统调用的MFC。

+0

在/usr/src/sys/sys/sysent.h中找到它, '“sys /”#name,'tyvm – bestwc 2013-02-22 06:47:42