我最近正在阅读linux内核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中定义,我认为有一个include或者“tell”rt_sched_class什么是fair_sched_class。
但是,我搜索了整个文件,但根本找不到sched_rt.c中的“include”。所以我想知道它是如何工作的,为什么我们可以在sched_rt.c中获得fair_sched_class的值? 谢谢!
答案 0 :(得分:1)
$LINUX/kernel/sched/rt.c
包含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文件)上。
此外还没有进行通信,这只是一个链接列表,在编译时定义了初始化器。
答案 1 :(得分:0)
更好地了解kernelnewbies或查看LWN对调度程序开发的报道。它是非常复杂区域,代码快速变化。即,与专家交谈,而不是我们血腥的业余爱好者。