0

我最近正在阅读 linux kernel 2.6.26.5 的代码并尝试实现另一个调度程序类。但是,我对 linux 内核如何处理不同调度程序类之间的通信感到困惑。例如,在 sched_rt.c 中,rt_sched_class 定义为:

static const struct sched_class rt_sched_class = {
    .next               = &fair_sched_class,
    .enqueue_task       = enqueue_task_rt,
    .dequeue_task       = dequeue_task_rt,
    .yield_task         = yield_task_rt,
#ifdef CONFIG_SMP
    .select_task_rq     = select_task_rq_rt,
#endif /* CONFIG_SMP */ 
......

字段“next”指向下一个 sched_class,这里是 fair_sched_class。

我对它如何知道什么是 fair_sched_class 感到困惑。由于 fair_sched_class 在另一个文件 shed_fair.c 中定义,我想有一个包含或“告诉”rt_sched_class 什么是 fair_sched_class 的东西。

但是,我搜索了整个文件,但在 sched_rt.c 中根本找不到“包含”。所以我想知道它是如何工作的,为什么我们可以在 sched_rt.c 中获得 fair_sched_class 的值?谢谢!

4

2 回答 2

1

$LINUX/kernel/sched/rt.cincludes ,其中包含调度程序类实例变量的sched.h几个前向声明:extern

extern const struct sched_class stop_sched_class;
extern const struct sched_class rt_sched_class;
extern const struct sched_class fair_sched_class;
extern const struct sched_class idle_sched_class;

然后变量的实际定义分布在调度程序编译单元(.c 文件)中。

也没有通信发生,这只是一个带有在编译时定义的初始化程序的单链表。

于 2013-03-25T00:46:43.217 回答
0

更好地查看kernelnewbies或查看LWN对调度程序开发的报道。这是一个非常复杂的领域,代码变化很快。即,与专家交谈,而不是与我们这些该死的业余爱好者交谈。

于 2013-03-25T02:59:05.943 回答