我在Linux内核模块内调用系统调用时遇到一些困难.系统调用已经过测试,并且可以从标准的c用户空间程序中正常工作,但我似乎无法获得内核模块来编译和运行它们.
在我的用户程序中,我包含以下代码,系统调用有效:
#include <linux/unistd.h>
#define __NR_sys_mycall 343
extern long int _syscall(long int_sysno,...)__THROW;
//and then a simple call is done as such
long value = syscall(__NR_sys_mycall);
printf("The value is %ld\n",value);
Run Code Online (Sandbox Code Playgroud)
但是当我在我的Linux内核模块中尝试相同的事情时,我得到了一堆错误,或者说错误:隐式声明函数'syscall'(如果我不包括_syscall定义)或一长串关于语法的错误if我...所以我的假设是我需要内核空间版本来调用系统调用.我是对还是错?
//My LKM code
#include <linux/module.h>
#include <linux/unistd.h>
#define __NR_sys_mycall 343
static int start_init(void)
{
long value = syscall(__NR_sys_mycall);
printk("The value is %ld\n",value);
return 0;
}
static void finish_exit(void)
{
printk("Done!\n");
}
module_init(start_init);
module_exit(finish_exit);
Run Code Online (Sandbox Code Playgroud) 符号machine_power_off在"T"中标记为/proc/kallsyms:
$ grep -w machine_power_off /proc/kallsyms
ffffffff8102391b T machine_power_off
Run Code Online (Sandbox Code Playgroud)
但它没有出口.kallsyms中的"T"是否必要且足以导出符号?出口是否必要且足以在其他模块中使用?
我使用它的模块编译时带有警告:
WARNING: "machine_power_off" [/path/to/module.ko] undefined!
Run Code Online (Sandbox Code Playgroud)
在主机(3.2.0-4-amd64)上我可以加载这个模块,但是在VirtualBox(3.16.0-4-amd64)上它产生以下消息:
insmod: ERROR: could not insert module module.ko: Unknown symbol in module
Run Code Online (Sandbox Code Playgroud)
为什么这个模块加载在我的主机系统中,而不是在VirtualBox中?