【问题标题】:Bad address when adding a system call添加系统调用时地址错误
【发布时间】:2011-08-25 13:54:02
【问题描述】:

我已经下载了内核 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. 我也编辑了 Makefile。

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

我该怎么办?

【问题讨论】:

  • +1,恭喜您获得了令人满意的完整描述和对您问题的最少了解。你无法想象新来的人会就非常低级的东西提出非常广泛的问题。

标签: c kernel system-calls


【解决方案1】:

在 x86 上,系统调用号 244 已被 get_thread_area() 占用,它的第一个参数是指向 struct user_desc 的指针:

int get_thread_area(struct user_desc *u_info);

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

【讨论】:

  • 你是对的。根据此文件/usr/include/asm/unistd_32.h,244 - 259 范围内唯一可用的系统调用号是 251。所以我将系统调用号更改为 251。但这次它说:Function not implementederrno = 38
【解决方案2】:

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

【讨论】:

  • 听起来不像是我的答案
  • 是的,我已经安装了新的内核映像和内核头文件。但它不起作用!
猜你喜欢
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多