カーネルモジュールからLinuxカーネルメソッドを呼び出す

カーネルモジュールからLinuxカーネルメソッドを呼び出す

LinuxのカーネルモジュールでCファイルのカーネル関数を呼び出す正しい方法は何ですか?

最初のカーネルモジュールからexit_task_namespaces呼び出したいです。linux/nsproxy.c

私はこれをやっています:

#include <linux/nsproxy.h>

static ssize_t device_read(struct file *flip, char *buffer, size_t len, loff_t *offset)
{
    struct task_struct *task = current;
    exit_task_namespaces(task);
}

しようとすると、make次のエラーが発生します。

ERROR: "exit_task_namespaces" [/home/.../lkm_example.ko] undefined!
make[2]: *** [scripts/Makefile.modpost:94: __modpost] Error 1
make[1]: *** [Makefile:1673: modules] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-73-generic'
make: *** [Makefile:3: all] Error 2

/usr/src/linux-headers-5.4.0-73-generic/include/linux/nsproxy.hファイルにメソッドが存在することがわかります。

これは私のMakefileです。

obj-m += lkm_example.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

答え1

モジュールはアクセスのみ可能エクスポートしたシンボルで、exit_task_namespacesエクスポートされません。したがって、ヘッダファイルに表示されてもモジュールでは使用できません。

エクスポートされたシンボルには、特別なアクションなしに予期した方法でアクセスできます。

関連情報