Linux 内核分析第八周学习笔记

Linux 内核分析第八周学习笔记

zl + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

进程调度的时机

直接调用:中断处理过程(包括时钟中断,I/O中断,系统调用和异常)

返回用户态时调用:根据need_resched标记调用

内核线程可以主动调用也可以被动调用

用户态线程仅能在陷入内核态后,即在中断处理过程中调度

进程上下文

用户地址空间:代码,数据,堆栈等

控制信息:进程描述符,内核堆栈

硬件上下文

pick_next_task(rq,prev);进程调度算法封装

context_switch(rq,prec,next);进程上下文切换

switch_to中prev指向当前进程,next指向被调度进程

42	asm volatile("pushfl
	"		/* 保存    flags */	
43		     "pushl %%ebp
	"		/* 保存    EBP   */	
44		     "movl %%esp,%[prev_sp]
	"	/* 保存    ESP   */ 
45		     "movl %[next_sp],%%esp
	"	/* 恢复 ESP   */ 
46		     "movl $1f,%[prev_ip]
	"	/* 保存    EIP   */	
47		     "pushl %[next_ip]
	"	/* 恢复 EIP   */	
48		     __switch_canary					
49		     "jmp __switch_to
"	/* 寄存器参数 调用  */	
50		     "1:	"						
51		     "popl %%ebp
	"		/* 保存 EBP   */	
52		     "popfl
"			/* 恢复 flags */	
53									
54		     /* 输出参数 */				
55		     : [prev_sp] "=m" (prev->thread.sp),		
56		       [prev_ip] "=m" (prev->thread.ip),		
57		       "=a" (last),					
58									
59		       /* 被破坏的输出寄存器 */		
60		       "=b" (ebx), "=c" (ecx), "=d" (edx),		
61		       "=S" (esi), "=D" (edi)				
62		       							
63		       __switch_canary_oparam				
64									
65		       /* 输入参数: */				
66		     : [next_sp]  "m" (next->thread.sp),		
67		       [next_ip]  "m" (next->thread.ip),		
68		       							
69		       /*  __switch_to()的寄存器参数 */	
70		       [prev]     "a" (prev),				
71		       [next]     "d" (next)				
72									
73		       __switch_canary_iparam				
74									
75		     : /* 重装段寄存器 */			
76			"memory");					
77} while (0)

实验使用gdb跟踪分析一个schedule()函数




总结:

个人认为,Linux系统最一般执行过程中,用户态进程总要依次中断,保存现

原文地址:https://www.cnblogs.com/20135319zl/p/5398875.html