2011-05-14 56 views
14

我已经下载了内核2.6.38-5并且想要添加系统调用。 我做了以下内容:添加系统调用时的错误地址

  1. 我已经加入我的系统调用系统调用表;

    <src folder>/arc/x86/kernel/syscall_table_32.S 
    
    .long sys_mycall 
    
  2. 我已经添加了系统呼叫号码;

    <src folder>/include/asm-generic/unistd.h 
    
    #define __NR_mycall 244 
    __SYSCALL(__NR_mycall, sys_mycall) 
    
  3. 我已经加入了原型syscalls.h;

    <src follder>/include/linux/syscalls.h 
    
    asmlinkage long sys_mycall(long input); 
    
  4. 而且,这里是我的系统调用;

    asmlinkage long sys_mycall(long input) { 
        return (input * 2); 
    } 
    
  5. 我也编辑了Makefiles。

现在编译之后,当我通过syscall()使用它,它给了我BAD ADDRESS并将errno设置为14

我应该怎么办?

+4

+1,祝贺您对问题有一个令人满意的完整描述和最低限度的知识。你不会想象这些新来的人会问很多关于非常低层次问题的问题。 – zneak 2011-05-14 16:32:34

回答

5

在x86上,系统调用号244已经采取get_thread_area(),这需要作为第一个参数指针struct user_desc

int get_thread_area(struct user_desc *u_info); 

你传递一个数字,而不是一个指针,内核试图将其解释为指针,它将确定它指向您的过程之外,并返回-EFAULT

+0

你说得对。根据这个文件'/ usr/include/asm/unistd_32.h',范围244-259中唯一可用的系统呼叫号码是251.所以我将我的系统呼叫号码改为251.但是这一次它说:'功能没有实现'用'errno = 38' – 2011-05-14 23:33:10

0

系统调用查询运行内核。该函数被映射到内核中的地址空间。如果您不安装此内核并重新启动机器,该地址将无效。

+1

听起来不像我的答案 – Dani 2011-05-14 17:50:40

+0

好的,详细说明。 – Mel 2011-05-14 17:51:55

+0

是的,我已经安装了新的内核映像和内核头文件。 但它不起作用! – 2011-05-14 18:02:11