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

时间:2013-02-22 05:21:39

标签: kernel hook freebsd

我写了一些像一年前一样的freebsd内核模块,当时它们运行正常。但现在我无法编译。

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

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,仍然没有线索。似乎不再支持从内核模块中调用另一个系统调用,或者它需要额外的配置?

请帮助,非常感谢。

1 个答案:

答案 0 :(得分:3)

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

确切的变更集是:

  

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

     

为了最大化内核代码在用户空间中的可重用性   patch修改makeyscalls.sh以前缀所有不兼容性   使用sys_调用(例如,不是linux_,freebsd32_)并更新内核   入口点以及使用它们的代码中的所有位置。它也是   修复了内核函数之间的额外名称空间冲突   psignal和重命名内核的同名libc函数   psignal kern_psignal()。通过引入这一变化,我们将简化未来   改变系统调用的MFC。