2015年(100)
分类: LINUX
2015-05-11 23:49:38
原文地址:start_kernel之sched_init() 作者:梦来是缘
函数:sched_init()调度相关初始化
原形:
void __init sched_init(void)
参数:
无
返回值:
无
函数注释:
void __init sched_init(void) //调度相关初始化
{
runqueue_t *rq;
int i, j, k;
for (i = 0; i < NR_CPUS; i++) {
prio_array_t *array;
rq = cpu_rq(i); //获取系统第i号处理器的运行队列结构指针
//cpu_rq(cpu) 相当于(&per_cpu(runqueues, (cpu)))
//per_cpu(runqueues, (cpu))就是CPU号处理器对应的
//运行队列结构per_cpu_runqueues
spin_lock_init(&rq->lock);//初始化该处理器的运行队列锁
rq->active = rq->arrays; //该处理器运行队列的活动优先级阵列结构指针指向该
//优先级阵列结构数组的第一个组员
rq->expired = rq->arrays + 1; //该处理器运行队列的到期优先级阵列结构指针指
//向该优先级阵列结构数组的第二个组员
rq->best_expired_prio = MAX_PRIO;//该处理器运行队列的首选到期优先级号设
//置为140。优先级号越大,优先级越低。
#ifdef CONFIG_SMP //多处理器专用(先不分析)
rq->sd = &sched_domain_dummy;
rq->cpu_load = 0;
rq->active_balance = 0;
rq->push_cpu = 0;
rq->migration_thread = NULL;
INIT_LIST_HEAD(&rq->migration_queue);
#endif
atomic_set(&rq->nr_iowait, 0); //将该运行队列中等待I/O操作的进程计数器清0。
for (j = 0; j < 2; j++) { //设置该运行队列的优先级阵列数组arrays [2]的组员
array = rq->arrays + j; //找到指向优先级阵列结构的指针
for (k = 0; k < MAX_PRIO; k++) { INIT_LIST_HEAD(array->queue + k);
//初始化优先级阵列结构中每个优先级的队列链表
__clear_bit(k, array->bitmap); //优先级阵列结构中每个优先级对应位码清零
}
__set_bit(MAX_PRIO, array->bitmap); //优先级号MAX_PRIO对应位码置1
}
}
atomic_inc(&init_mm.mm_count); //将init_mm的主使用计数器init_mm.mm_count加1
enter_lazy_tlb(&init_mm, current);//此函数基本上为空
init_idle(current, smp_processor_id());//初始化当前处理器的空闲进程即系统启动过程
}
函数:init_idle()初始化当前处理器的空闲进程
原形:
void __devinit init_idle(task_t *idle, int cpu)
参数:
idle:空闲进程的task_t结构指针
cpu: idle进程运行的处理器号
返回值:
无
函数注释:
void __devinit init_idle(task_t *idle, int cpu) //初始化当前处理器的空闲进程
{
runqueue_t *rq = cpu_rq(cpu); //获取cpu对应处理器的运行队列结构指针
unsigned long flags;
idle->sleep_avg = 0; //将空闲进程的平均睡眠值设置为0.
idle->interactive_credit = 0; //将空闲进程的交互程度值设置为0.
idle->array = NULL; //将空闲进程的所属运行队列的优先级阵列指 //针设置为空
idle->prio = MAX_PRIO; //将空闲进程的优先级设置为140(优先级最低)
idle->state = TASK_RUNNING; // 将空闲进程的状态设置为运行状态
set_task_cpu(idle, cpu); //将idle->thread_info_>cpu设置为cpu
spin_lock_irqsave(&rq->lock, flags); //禁止IRQ中断,保存处理器的当前状态寄存器
//到flags中,获取cpu号处理器的运行队列锁
rq->curr = rq->idle = idle; //将该运行队列的当前进程和空闲进程的task_tji //结构指针设置为idle
set_tsk_need_resched(idle); //将idle->thread_info->flags标志字或上(|)该进 //程需要调度标志TIF_NEED_RESCHED
spin_unlock_irqrestore(&rq->lock, flags);//使能IRQ中断,f恢复flags中的值d到处理
//器的当前状态寄存器中。释放cpu号处理器的运行队列锁
#ifdef CONFIG_PREEMPT //如果系统支持抢占
idle->thread_info->preempt_count = (idle->lock_depth >= 0);
//如果idle的锁深度lock_depth >=0则将空闲进程的抢占计数器设置为1禁止抢占
//否则,设置为0,允许抢占
#else //如果系统不支持抢占
idle->thread_info->preempt_count = 0;//将空闲进程的抢占计数器设置为0
#endif
}