对于类赋值,我们编写了一个自定义的syscall,它提取有关现有进程树的某些信息。syscall在很大程度上工作正常,并获得了适当的信息。但是,有几个进程会崩溃,并显示错误消息"Unable to handle kernel NULL pointer dereference at virtual address address“。我不明白的是,在访问指针之前,我正在测试指针是否为空,然而,它仍然失败。
示例:在下面的代码中,current_process是指向task_struct的有效指针,k_buf是有效的
printk("Setting parent process\n");
parent_process = current_process->real_parent;
printk("Parent process set\n");
if (parent_process != NULL) {
printk("Parent process is not null and getting pid\n");
k_buf[i].parent_pid = parent_process->pid;
} else {
k_buf[i].parent_pid = 0;
}
printk("Done with parent process\n");运行时,程序打印:
Setting parent process
Parent process set
Parent process is not null and getting pid
Done with parent process几次,然后
Setting parent process
Parent process set
Parent process is not null and getting pid在抛出错误并进入内核恐慌之前。
我做错了什么?有什么想法吗?
编辑:
目前,我注释掉了上面的代码,这样我就可以继续处理系统调用的其余部分。当我试图访问子进程的pid时(在两次成功的尝试之后),它给我一个"Unable to handle kernel paging request at virtual address“错误。据我所知,我有正确的锁来读取这些数据。但是,在访问内存之前,是否还需要执行其他操作来检查内存?
发布于 2010-10-02 04:26:23
我在这里推测,parent_process->pid被NULL会不会是你“内核恐慌”的原因呢?如果是这样的话,你也可以检查一下。
要么是这样,要么是访问k_buf数组ie的第i个元素时出现问题。*(k_buf+i)
发布于 2010-10-03 23:47:20
在访问之前,您似乎没有测试kbuf[i]的kbuf。此外,您还可以对这些指针执行printk操作,这样就可以捕获非空但明显无效的地址(如0xbfff0c3a)
发布于 2020-08-21 22:21:34
我编写了一个system 调用来列出所有进程,并得到了这个错误
260.613411错误:无法在0000000000000040 260.613416 PGD 0 P4D 0 260.613422 Oops: 0000 #1 SMP PTI 260.613427 CPU: 3 PID: 1793通信: a.out污染:p OE 4.19.5 #2处处理内核NULL指针取消引用
我正在检查,如果( process->parent)然后打印它的PID,
现在,我想我应该尝试if(
->parent !=NULL)
回答问题:亲爱的兄弟,你可以尝试,ppid =task_pid_nr(子进程->父进程)来获取父进程的pid ...!
https://stackoverflow.com/questions/3842711
复制相似问题