对于类赋值,我们正在编写一个自定义系统调用,它提取有关现有进程树的某些信息。系统调用大部分工作正常,并获取适当的信息。但是,有几个进程在崩溃时出现错误消息“无法在虚拟地址[地址]处理内核空指针解除引用”。我不明白的是,我正在测试指针在访问之前是否为NULL,但它仍然失败。
示例:在下面的代码中,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时(再次成功尝试几次)后,它给出了“无法在虚拟地址处理内核分页请求”错误。据我所知,我有正确的锁定来读取这些数据。但是,在我访问它之前,还需要做些什么来检查内存吗?
答案 0 :(得分:1)
我在这里推测但是parent_process->pid
NULL
可能导致你的“内核恐慌”?如果是这样,你也可以检查一下。
它或者是访问i
数组的k_buf
元素的一些问题,即。 *(k_buf+i)
答案 1 :(得分:1)
在访问之前,您似乎没有对kbuf
的{{1}}进行测试。此外,您可以kbuf[i]
这些指针,这样您就可以捕获非空但明显无效的地址(例如printk
)
答案 2 :(得分:0)
我有两个问题。 real_parent有哪些可能的值?它可能不是NULL吗?你可以打印这个值并在内核恐慌之前检查它是什么吗?
另外,你确定k_buf [i]正确引用了吗?我不确定,只想尝试一些想法。
编辑:我同意加密 parent_process-> pid可能为null。
答案 3 :(得分:0)
我写了一个系统 电话以列出所有进程 并收到此错误:
[260.613411]错误:无法处理0000000000000040处的内核NULL指针取消引用 [260.613416] PGD 0 P4D 0 [260.613422]糟糕:0000 [#1] SMP PTI [260.613427] CPU:3 PID:1793 Comm:a.out污染:P OE 4.19.5#2
我正在检查, 如果(过程->父) 然后打印其PID,
现在我想我应该尝试if(process-> parent!= NULL)
问题的答案: 亲爱的兄弟, 您可以尝试,ppid = task_pid_nr(child_process-> parent) 获取父母的pid。...!