Родительский указатель в ядре Linux RBTree

Мне интересно узнать, как поддерживается родительский указатель? Насколько я понимаю, в linux rbtree есть одна переменная unsigned long, в которой хранится адрес родительского указателя и цветовой узел? Я не могу понять, как это возможно без изменения родительского указателя, даже если его 1-битное поле цвета.

Пример использования, как в rbtree.h

struct rb_node
{ 
        unsigned long  rb_parent_color;
#define RB_RED          0
#define RB_BLACK        1
        struct rb_node *rb_right;
        struct rb_node *rb_left;
} __attribute__((aligned(sizeof(long))));

static void __rb_rotate_left(struct rb_node *node, struct rb_root *root)
{
        struct rb_node *right = node->rb_right;
        struct rb_node *parent = rb_parent(node);
        ...
        ...
        ...
}



The macros are defined as 
#define rb_parent(r)   ((struct rb_node *)((r)->rb_parent_color & ~3))
#define rb_color(r)   ((r)->rb_parent_color & 1)

Я не могу понять оба макроса, что связано с моим предыдущим вопросом. rb_parent_color длинный, который содержит адрес родительского указателя и цвет узла (очевидно из макроса rb_color. Все, что я спрашиваю, это как работает эта логика маскировки указателя?


person Rishabh Puri    schedule 24.12.2013    source источник
comment
Лучше спросить на kernelnewbies.org...   -  person Basile Starynkevitch    schedule 24.12.2013
comment
отредактировал мой вопрос. надеюсь, что это сделает его менее запутанным и более конкретным.   -  person Rishabh Puri    schedule 26.12.2013


Ответы (2)


Получите мой ответ как предположение, мне лень проверять его сейчас :-) На самом деле младший бит не используется, потому что адрес всегда выровнен, поэтому младший бит ДОЛЖЕН быть 0;

Точно так же они используют младший бит в некоторых ситуациях при управлении страницами памяти - они просто используют младший бит в предположении, что он всегда выровнен и должен быть равен 0; поэтому установка его как 1 ничего не меняет.

Удачи.

person Sebastian Mountaniol    schedule 26.12.2013

Я не знал, что это было задано ранее.

Выравнивание структуры красного черного узла в ядре Linux

Это именно то подробное описание, которое мне было нужно.

person Rishabh Puri    schedule 27.12.2013