使用自定义系统调用编译Linux内核模块时出错

时间:2014-10-16 18:23:44

标签: c linux linux-kernel system-calls kernel-module

我会一步一步地指导你

首先,我在Linux内核目录中编辑3个文件

  1. 打开LINUX_DIRECTORY/arch/x86/syscalls/syscall_64.tbl并添加我正在实施的自定义调用 - 使用适当的格式

  2. 在此处声明:LINUX_DIRECTORY/include/linux/syscalls.h - 使用适当的格式:

  3. 打开LINUX_DIRECTORY/Makefile并将我正在存储新系统调用的目录添加到core-y行:

    core-y:= usr / my_system_call_directory /

  4. 这是我遇到问题的地方。在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,而我不知道该改变什么。感谢

1 个答案:

答案 0 :(得分:1)

想出来。对于像我这样慢的人,你必须使用包装器和存根。

因此,对于此示例,在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;
}