从 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
不会被导出——所以即使它在头文件中可见,它也不能在模块中使用。
导出的符号可以按照您期望的方式进行访问,无需执行任何特殊操作。