我的系统调用无法正常工作

时间:2010-11-21 14:54:09

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

我需要创建2个新的系统调用来设置并通过给定的pid从进程获取属性。我更改了task_struct,添加了int z_value(这是我需要设置/获取的)

我还设法为每个创建的进程设置默认的z_value(200)。

当我运行get system call时,我可以看到默认的z_value正确。但是当我尝试设置z_value时没有任何反应。

没有编译错误,没有分段错误等。

这是我的系统调用。

#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/uaccess.h>

asmlinkage void sys_set_z_value ( int user_value , pid_t pid )
{


    rcu_read_lock();

    struct task_struct *p = find_task_by_vpid(pid);  

    p->z_value = user_value;

    rcu_read_unlock();
}

3 个答案:

答案 0 :(得分:6)

您对copy_from_user的来电毫无意义。没有涉及用户空间内存的指针。 user_value是一个值,而不是指针。 (如果您打算将它作为指针,则需要修复所涉及的类型,但看起来您正在将此int值传递给系统调用。)只需指定p->z_value = user_value;

答案 1 :(得分:2)

  • 您的系统调用应返回long类型。
  • 您应该使用SYSCALL_DEFINE2()宏。
  • 您的代码不应在没有警告的情况下编译(并且在函数中间声明p类型将触发警告)
  • 如果您的pid无效,则p变量将为NULL,您应该返回-ESRCH

关于这个:

  

我还设法为每个创建的进程设置默认的z_value(200)。

我希望你也照顾init_task,这是一个常见的错误。

答案 2 :(得分:0)

两个建议:

1)像源文件中的一些随机字符一样引入故意错误,并确保内核构建失败。令人惊讶的是,您添加的代码中没有构建的问题数量很多。

假设不是它

2)使用大量printk加载代码,这样你就可以通过观察控制台窗口或在运行后调用dmesg来查看它正在尝试做什么。把它们放在一起来检查每个假设 - 代码运行,变量是你的想法等等。