Chinaunix首页 | 论坛 | 博客
  • 博客访问: 325010
  • 博文数量: 100
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 665
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-02 12:43
文章分类

全部博文(100)

文章存档

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_count1

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

}

阅读(1462) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~