对于类分配,我们正在编写一个自定义系统调用,它可以获取有关现有进程树的某些信息。系统调用大部分工作正常,并获得适当的信息。但是,有一些进程在崩溃时显示错误消息“无法处理虚拟地址[地址]处的内核NULL指针取消引用”。我不明白的是,我正在测试指针是否为NULL,然后它仍然失败。Linux内核编程:“无法在虚拟地址[地址]处理内核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(再次尝试几次后),它给了我一个“无法处理虚拟地址的内核分页请求”错误。据我所知,我有正确的锁定来读取这些数据。但是,在我访问内容之前还有什么需要检查内存吗?
你有没有见过'parent_process'为NULL的情况?我怀疑NULL指针不是明显的指针访问,但需要更多的代码来告诉。 – nategoose 2010-10-01 20:24:41
是的,我看到了parent_process为NULL的情况。例如,init进程(进程1)有一个NULL real_parent,并将进入else情况。 – achinda99 2010-10-01 20:36:13
请问我们能否看到parent_process的结构声明/定义? – 2010-10-02 05:31:20