我正在玩内核模块来学习接口,因此我想在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 * node
和struct 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");
}
答案 0 :(得分:2)
“不完整类型”是具有未指定数量的元素的数组类型或具有未指定成员的struct
或union
类型。您可以声明并使用指向不完整类型的指针(通常为struct
或union
类型)但您不能取消引用它,因为编译器不知道指向的对象的任何细节。在需要struct
和union
类型的前向声明的情况下,此功能非常重要,但它对于实现抽象和不透明类型也很有用。
如果struct rb_node
是不完整的类型,那么如果您希望能够执行更多操作而不是声明并传递指向实例的指针,则需要完成它。这意味着提供指定其成员的struct rb_node
声明。也许这可以从另一个头文件中获得。如果没有,那么这就表明你并不是要在创建和使用它们的代码之外深入研究这些东西的细节(与处理指针的代码不同)。