我会一步一步地带你走过
首先,我在Linux内核目录中编辑了3个文件。
LINUX_DIRECTORY/arch/x86/syscalls/syscall_64.tbl并添加我正在实现的自定义调用--使用适当的格式LINUX_DIRECTORY/include/linux/syscalls.h -使用适当的格式:LINUX_DIRECTORY/Makefile并将存储新系统调用的目录添加到core-y行:
核心-y := usr/ my_system_call_:=/这是我遇到麻烦的地方。在LINUX_DIRECTORY/my_system_call_directory内部,我添加了一个C文件,其中包含我的自定义系统调用定义及其相应的Makefile。我将定义保留为空,因为在内核模块的C文件中,我声明了一个extern函数(我的自定义系统调用),并定义了一个单独的函数,该函数设置为extern函数:
extern long (*start_shuttle)(void);
long my_start_shuttle(void) {
// stuff here
}
int init_module(void) {
// stuff here
start_shuttle = my_start_shuttle;
// more stuff
}在重新编译内核之后,我尝试make内核模块并获得一个no definition for start_shuttle错误。
这是因为我将start_shuttle的定义留空在my_system_call_directory中吗?它应该与我在内核模块中定义的my_start_shuttle完全匹配,还是应该添加一些特殊的内容?我提前问了一些愚蠢的问题,因为我的机器需要很长时间才能重新编译Linux,而且我不知道该修改什么。谢谢
发布于 2014-10-17 16:16:59
弄明白了。对于像我这样慢吞吞的人,你必须使用包装器和存根。
因此,在本例中,在my_system_call_directory中,在新的系统调用定义的c文件中,您需要如下所示:
#include <linux/linkage.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/export.h>
// initialize the stub function to be NULL
long (*start_shuttle)(void) = NULL;
EXPORT_SYMBOL(start_shuttle);
// wrapper
asmlinkage long sys_start_shuttle(void)
{
if (start_shuttle)
return start_shuttle();
else
return -ENOSYS;
}https://stackoverflow.com/questions/26411341
复制相似问题