2014-10-16 89 views
2

我会一步引导您一步错误使用自定义的系统编译Linux内核模块调用

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

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

  2. 这里声明它们:LINUX_DIRECTORY/include/linux/syscalls.h - 使用适当的格式:

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

    核心-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,而我不知道要改变什么。谢谢

回答

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; 
}