Где run_node определен в sched_fair. c из Linux 2.6.33? - PullRequest
1 голос
/ 06 мая 2020

Я читаю Книгу Роберта Лава Linux Разработка ядра .

Он использует ядро ​​2.6.33 для демонстрации.

Я просматривал определенные части исходного кода и не могу понять, где находится исходное определение многих вещей. Многие вещи просто используются, например, «magi c», и я не могу найти определение.

Один пример:

static struct sched_entity *__pick_next_entity(struct cfs_rq *cfs_rq)
{
    struct rb_node *left = cfs_rq->rb_leftmost;

    if (!left)
        return NULL;

    return rb_entry(left, struct sched_entity, run_node);
}

static struct sched_entity *__pick_last_entity(struct cfs_rq *cfs_rq)
{
    struct rb_node *last = rb_last(&cfs_rq->tasks_timeline);

    if (!last)
        return NULL;

    return rb_entry(last, struct sched_entity, run_node);
}

Это находится в kernel/sched_fair.c строках 384 и 394 в ядре 2.6.33.

Откуда run_node?

Я использовал grep для всей исходной базы поверх здесь , и я не нашел никакого определения run_node, которое позволило бы использовать его таким образом.

В структуре sched_entity есть объявление , но за его пределами нет ничего, что позволило бы использовать его вот так.

Я не могу понять, как все устроено, это действительно сбивает с толку.

Что происходит?

1 Ответ

1 голос
/ 06 мая 2020

run_node, которое вы видите, не является переменной, это поле .run_node структуры sched_entity.

rb_entry() - это макрос, который по сути является псевдонимом для container_of():

#define rb_entry(ptr, type, member) container_of(ptr, type, member)

Используется макрос container_of() чтобы получить указатель на структуру с учетом указателя на известное поле (ptr), типа структуры (type) и имени поля (member). В вашем случае left - это указатель на поле run_node некоторого struct sched_entity, поэтому container_of() в основном используется для получения указателя на соответствующий sched_entity.

См. Также: Понимание макроса container_of в Linux ядре .

...