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_" というプレフィックスが付けられるようになったため、mkdir だけでなく sys_mkdir を使用する必要があります。

正確な変更セットは次のとおりです。

r225617 | キマシー | 2011-09-16 06:58:51 -0700 (金曜日、2011 年 9 月 16 日) | 12行

ユーザー空間でのカーネル コードの再利用性を最大化するために、このパッチは makesyscalls.sh を変更して、互換性のないすべての呼び出し (例: linux_、freebsd32_ ではない) の前に sys_ を付け、カーネル エントリ ポイントとコード内のすべての場所を更新します。それらを使用します。また、カーネル psignal kern_psignal() の名前を変更することにより、カーネル関数 psignal と同じ名前の libc 関数との間の追加の名前空間衝突を修正します。この変更を導入することで、syscall を変更する将来の MFC が容易になります。

于 2013-02-22T06:32:05.153 に答える