【问题标题】:error: dereferencing pointer to incomplete type - in a kernel module错误:取消引用指向不完整类型的指针 - 在内核模块中
【发布时间】:2014-11-08 01:46:22
【问题描述】:

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

  • 我可以定义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");
}

【问题讨论】:

    标签: c linux-kernel kernel-module


    【解决方案1】:

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

    如果struct rb_node 是有问题的不完整类型,那么如果您希望能够做的不仅仅是声明和传递指向实例的指针,那么您将需要完成它。这意味着提供struct rb_node 的声明来指定其成员。也许这可以从另一个头文件中获得。如果不是,那么这表明您不打算在创建和使用它们的代码之外探究这些事物的细节(区别于处理指向它们的指针的代码)。

    【讨论】:

    • 其实不完整的类型是cfs_rq,它指向rb_root。反正我是想戳它,怎么办?
    • 好的,我将结构的定义复制粘贴到我的模块中并且它可以工作。看起来像糟糕的代码,但有效:)
    猜你喜欢
    • 2023-03-12
    • 2011-04-06
    • 1970-01-01
    • 2018-05-31
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多