繁体   English   中英

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

[英]My system call is not working properly

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

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

运行get系统调用时,可以看到默认的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();
}

您对copy_from_user调用没有任何意义。 没有指向用户空间内存的指针。 user_value是一个值,而不是指针。 (如果您打算将其用作指针,则需要修复涉及的类型,但看起来您好像是通过值将此int传递给syscall。)只需分配p->z_value = user_value;

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

对这个:

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

我希望您也能注意init_task ,这是一个常见错误。

两个建议:

1)在源文件中引入故意错误,例如一些随机字符,并确保您的内核构建失败。 令人惊讶的是,归因于您添加的未构建代码的问题数量。

假设不是

2)用很多printk加载代码,这样您就可以通过查看控制台窗口或在运行它后调用dmesg来查看其试图执行的操作。 将它们放到各处检查每个假设-代码是否运行,变量是否符合您的想法等等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM