2

我像 1 年前写了一些 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,还是没有头绪。似乎不再支持从内核模块中调用另一个系统调用,或者它需要额外的配置?

请帮忙,非常感谢。

4

1 回答 1

4

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

确切的变更集是:

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

为了最大限度地提高内核代码在用户空间中的可重用性,此补丁修改了 makesyscalls.sh 以在所有不兼容调用(例如非 linux_、freebsd32_)前加上 sys_ 并更新内核入口点和代码中的所有位置使用它们。它还通过重命名内核 psignal kern_psignal() 修复了内核函数 psignal 和同名 libc 函数之间的额外名称空间冲突。通过现在引入此更改,我们将简化未来更改系统调用的 MFC。

于 2013-02-22T06:32:05.153 回答