错误:在内核模块中解除引用指向不完整类型的指针

时间:2014-11-07 17:30:21

标签: c linux-kernel kernel-module

我正在玩内核模块来学习接口,因此我想在CFS调度程序的Red Black树中打印进程。所以我想通过current->se.cfs_rq->tasks_timeline访问它,但这在这一行上给了我一个error: dereferencing pointer to incomplete type。我尝试通过访问(current->se.cfs_rq)->nr_running来进行smiplification,但得到了同样的错误。

  • 我可以定义struct rb_node * nodestruct rb_root * root,所以这不是问题。

整个代码:

#include <linux/module.h>   /* Needed by all modules */
#include <linux/kernel.h>   /* Needed for KERN_INFO */
#include <linux/rbtree.h>
#include <linux/rbtree_augmented.h>
#include <linux/slab.h>
#include <linux/sched.h>

MODULE_LICENSE("GPL");


int init_module(void)
{
    printk("%d\n", (current->se.cfs_rq)->nr_running);
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world proc.\n");
}

1 个答案:

答案 0 :(得分:2)

“不完整类型”是具有未指定数量的元素的数组类型或具有未指定成员的structunion类型。您可以声明并使用指向不完整类型的指针(通常为structunion类型)但您不能取消引用它,因为编译器不知道指向的对象的任何细节。在需要structunion类型的前向声明的情况下,此功能非常重要,但它对于实现抽象和不透明类型也很有用。

如果struct rb_node是不完整的类型,那么如果您希望能够执行更多操作而不是声明并传递指向实例的指针,则需要完成它。这意味着提供指定其成员的struct rb_node声明。也许这可以从另一个头文件中获得。如果没有,那么这就表明你并不是要在创建和使用它们的代码之外深入研究这些东西的细节(与处理指针的代码不同)。