我正在尝试使用linux/rbtree.h
中的代码在Linux每个task_struct中实现一个红/黑树。我可以在内核中的独立空间(例如模块)中正确插入红/黑树,但是当我尝试使用rb_root
或{{task_struct
中声明的task_struct->files_struct
来获取相同的代码时1}},每次尝试插入时,我都会得SEGFAULT
。
以下是一些代码:
在task_struct中,我为我的树(不是指针)创建了一个rb_root
结构。
在init_task.h
,宏INIT_TASK(tsk)
中,我将其设置为RB_ROOT
。
要进行插入,我使用以下代码:
rb_insert(&(current->fd_tree), &rbnode);
这就是问题发生的地方。
我的insert命令是内核的所有RBTree文档中记录的标准插入:
int my_insert(struct rb_root *root, struct mytype *data)
{
struct rb_node **new = &(root->rb_node), *parent = NULL;
/* Figure out where to put new node */
while (*new) {
struct mytype *this = container_of(*new, struct mytype, node);
int result = strcmp(data->keystring, this->keystring);
parent = *new;
if (result < 0)
new = &((*new)->rb_left);
else if (result > 0)
new = &((*new)->rb_right);
else
return FALSE;
}
/* Add new node and rebalance tree. */
rb_link_node(&data->node, parent, new);
rb_insert_color(&data->node, root);
return TRUE;
}
我有什么遗失的吗?
如果我在task_struct
之外创建了一个树根,那么这可以正常工作吗?如果我在模块内部rb_root
,这个插入工作正常。但是,一旦我将实际的树根放在task_struct
或task_struct->files_struct
中,我就得到SEGFAULT
。可以在这些结构中添加根节点吗?
非常感谢任何提示。我几乎尝试了所有我能想到的东西。
修改
在尝试打印以及访问树的任何行时,我在以下行中获得SEGFAULT
。有了这一行,您应该了解我如何处理指针。 rb_entry
和rb_first
是内核中已有的方法。 current
是指向任务结构(当前工作进程)的指针,而树是我的根节点(不是指针),它是任务结构的成员(我添加了)。 rb_first
需要传递指针*rb_root
。我做错了。
printk(KERN_CRIT "node=%d\n", rb_entry(rb_first(&(current->tree)), struct rb_tree_struct, node)->fd_key);
答案 0 :(得分:0)
可能是根和/或数据的指针值不是您所期望的吗?添加
可能很有用printk("%s: root=%p data=%p\n", __func__, root, data);
在while()
循环之前。