Linux内核 - 红/黑树

时间:2010-04-20 10:28:28

标签: linux-kernel kernel red-black-tree

我正在尝试使用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_structtask_struct->files_struct中,我就得到SEGFAULT。可以在这些结构中添加根节点吗?

非常感谢任何提示。我几乎尝试了所有我能想到的东西。


修改

在尝试打印以及访问树的任何行时,我在以下行中获得SEGFAULT。有了这一行,您应该了解我如何处理指针。 rb_entryrb_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);

1 个答案:

答案 0 :(得分:0)

可能是根和/或数据的指针值不是您所期望的吗?添加

可能很有用
printk("%s: root=%p data=%p\n", __func__, root, data);

while()循环之前。