预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共40页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux源代码阅读概要分布式中断处理 APIC简介 SMP结构中的中断控制硬件机构 全局APIC 本地APIC高级可编程中断控制器APICSMP结构中的中断控制硬件机构分布式中断处理硬件机制概述全局APIC全局APIC 本地APICSMP结构中的中断控制硬件机构概要中断初始化 smp相关的几个主要中断向量 设置中断门 中断响应程序的建立 相关中断处理程序代码 smp_reschedule_interrupt() smp_call_function_interrupt() smp相关的几个主要中断向量设置中断门设置中断门中断响应程序的建立中断响应程序的建立中断响应程序的建立中断响应程序的建立具体中断处理程序具体中断处理程序具体中断处理程序具体中断处理程序具体中断处理程序概述处理器间中断IPI IPI概述 IPI中断向量 IPI中断请求函数 IPI概述全局APICIPI中断向量中断请求函数send_IPI_mask函数其他相关发送函数概要相关数据结构调度函数Schedule()中相关代码staticinlinevoid__schedule_tail(structtask_struct*prev)函数staticvoidreschedule_idle(structtask_struct*p)函数oldest_idle=(cycles_t)-1; target_tsk=NULL; max_prio=1; /*查找所有可用CPU,看看能否重新调度进程p*/ for(i=0;i<smp_num_cpus;i++){//smp_num_cpus:系统中活动CPU个数 cpu=cpu_logical_map(i);//取得该CPU的逻辑号 if(!can_schedule(p,cpu)) continue; tsk=cpu_curr(cpu); if(tsk==idle_task(cpu)){//存在空闲CPU,选择运行时间最长的进程来剥夺 if(last_schedule(cpu)<oldest_idle){ oldest_idle=last_schedule(cpu); target_tsk=tsk; } }else{if(oldest_idle==-1ULL){//若没有空闲CPU intprio=preemption_goodness(tsk,p,cpu); if(prio>max_prio){//寻找一个运行资格较p最低的进程来剥夺 max_prio=prio; target_tsk=tsk; } } } }tsk=target_tsk; if(tsk){//如果存在可以剥夺的进程 if(oldest_idle!=-1ULL){//如果存在空闲CPU best_cpu=tsk->processor; gotosend_now_idle; } tsk->need_resched=1;//置need_resched标志 if(tsk->processor!=this_cpu) smp_send_reschedule(tsk->processor);//发送IPI } return; #else/*ifundefCONFIG_SMP*/ intthis_cpu=smp_processor_id(); structtask_struct*tsk; tsk=cpu_curr(this_cpu);//取得当前进程 if(preemption_goodness(tsk,p,this_cpu)>1)//运行资格高于当前进程 tsk->need_resched=1; #endif }谢谢大家!