首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自定义系统调用编译Linux内核模块时出错

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

Stack Overflow用户
提问于 2014-10-16 18:23:43
回答 1查看 426关注 0票数 2

我会一步一步地带你走过

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

  1. 打开LINUX_DIRECTORY/arch/x86/syscalls/syscall_64.tbl并添加我正在实现的自定义调用--使用适当的格式
  2. 在这里声明它们:LINUX_DIRECTORY/include/linux/syscalls.h -使用适当的格式:
  3. 打开LINUX_DIRECTORY/Makefile并将存储新系统调用的目录添加到core-y行: 核心-y := usr/ my_system_call_:=/

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

代码语言:javascript
复制
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,而且我不知道该修改什么。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-17 16:16:59

弄明白了。对于像我这样慢吞吞的人,你必须使用包装器和存根。

因此,在本例中,在my_system_call_directory中,在新的系统调用定义的c文件中,您需要如下所示:

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26411341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档