如何使用Linux内核模块中的Linux系统调用

从Linux内核模块内部调用系统调用时遇到一些困难。 系统调用已经过测试,并且可以从标准的c用户空间程序中正常工作,但我似乎无法获得内核模块来编译和运行它们。

在我的用户程序中,我包含以下代码,系统调用有效:

#include  #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); 

但是当我在我的Linux内核模块中尝试相同的事情时,我得到了一堆错误,或者说错误:隐式声明函数’syscall’(如果我不包括_syscall定义)或一长串关于语法的错误if我这样做…所以我的假设是我需要内核空间版本来调用系统调用。 我是对还是错?

 //My LKM code #include  #include  #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); 

您可以直接调用sys_mycall

 #include  #include  static int start_init(void) { long value = sys_mycall (pass_arguments) 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); 

大多数系统调用都使用asmlinkage,这意味着在堆栈上查找参数而不是寄存器。 确保在调用系统调用时,在堆栈上传递参数。

许多系统调用也只使用copy_from_user。 如果将内核地址传递给此类系统调用,则它们会失败。