【问题标题】:Error compiling Linux kernel module using custom system calls使用自定义系统调用编译 Linux 内核模块时出错
【发布时间】:2014-10-16 18:23:43
【问题描述】:

我会一步一步地引导你完成

首先我在我的 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/

这就是我遇到问题的地方。在LINUX_DIRECTORY/my_system_call_directory 中,我添加了一个C 文件,其中包含我的自定义系统调用定义及其对应的Makefile。我将定义留空,因为在内核模块的 C 文件中,我声明了一个外部函数(我的自定义系统调用)并定义了一个单独的函数,该函数设置为我的外部函数:

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 错误。

这是因为我在my_system_call_directory 中将start_shuttle 的定义留空了吗?它应该完全匹配我在内核模块中定义的my_start_shuttle,还是我应该添加一些特别的东西?我提前问了一些愚蠢的问题,因为我的机器重新编译 Linux 需要很长时间,而且我不确定要更改什么。谢谢

【问题讨论】:

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


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2015-01-13
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多