sched_init
void __init sched_init(void)
{
unsigned long ptr = 0;
int i;
/* Make sure the linker didn't screw up */
BUG_ON(&idle_sched_class + 1 != &fair_sched_class ||
&fair_sched_class + 1 != &rt_sched_class ||
&rt_sched_class + 1 != &dl_sched_class);
#ifdef CONFIG_SMP
BUG_ON(&dl_sched_class + 1 != &stop_sched_class);
#endif
wait_bit_init();
// 初始化等待队列
...
init_rt_bandwidth(&def_rt_bandwidth, global_rt_period(), global_rt_runtime());
// 初始化(控制全局的)rt使用带宽
init_dl_bandwidth(&def_dl_bandwidth, global_rt_period(), global_rt_runtime());
// 初始化(控制全局的)dl使用带宽
...
for_each_possible_cpu(i) {
// 遍历所有可用的cpu,为每个cpu初始化相关结构
struct rq *rq;
// 每个CPU的主要运行队列数据结构
rq = cpu_rq(i);
raw_spin_lock_init(&rq->lock);
rq->nr_running = 0;
rq->calc_load_active = 0;
rq->calc_load_update = jiffies + LOAD_FREQ;
init_cfs_rq(&rq->cfs);
// 初始化cfs运行队列
init_rt_rq(&rq->rt);
// 初始化rt运行队列(Real-Time class)
init_dl_rq(&rq->dl);
// 初始化dl运行队列(Deadline class)
...
rq->rt.rt_runtime = def_rt_bandwidth.rt_runtime;
// global_rt_runtime(0.95s)
hrtic