我需要创建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();
}
答案 0 :(得分:6)
您对copy_from_user
的来电毫无意义。没有涉及用户空间内存的指针。 user_value
是一个值,而不是指针。 (如果您打算将它作为指针,则需要修复所涉及的类型,但看起来您正在将此int
值传递给系统调用。)只需指定p->z_value = user_value;
。
答案 1 :(得分:2)
long
类型。SYSCALL_DEFINE2()
宏。p
类型将触发警告)p
变量将为NULL
,您应该返回-ESRCH
关于这个:
我还设法为每个创建的进程设置默认的z_value(200)。
我希望你也照顾init_task
,这是一个常见的错误。
答案 2 :(得分:0)
两个建议:
1)像源文件中的一些随机字符一样引入故意错误,并确保内核构建失败。令人惊讶的是,您添加的代码中没有构建的问题数量很多。
假设不是它
2)使用大量printk加载代码,这样你就可以通过观察控制台窗口或在运行后调用dmesg来查看它正在尝试做什么。把它们放在一起来检查每个假设 - 代码运行,变量是你的想法等等。