我将逐步引导您
首先,我在Linux内核目录中编辑3个文件
LINUX_DIRECTORY/arch/x86/syscalls/syscall_64.tbl
使用适当的格式打开并添加我正在实施的自定义调用
在此处声明它们:LINUX_DIRECTORY/include/linux/syscalls.h
–使用适当的格式:
打开LINUX_DIRECTORY/Makefile
并将要存储新系统调用的目录添加到该core-y
行:
core-y:= usr / my_system_call_directory /
这是我遇到问题的地方。在内部,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,而且我不确定要更改什么。谢谢
弄清楚了。对于像我这样慢的任何人,您都必须使用包装器和存根。
所以,在这个例子中,在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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句