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\n\t"		/* 保存    flags */	\
43		     "pushl %%ebp\n\t"		/* 保存    EBP   */	\
44		     "movl %%esp,%[prev_sp]\n\t"	/* 保存    ESP   */ \
45		     "movl %[next_sp],%%esp\n\t"	/* 恢复 ESP   */ \
46		     "movl $1f,%[prev_ip]\n\t"	/* 保存    EIP   */	\
47		     "pushl %[next_ip]\n\t"	/* 恢复 EIP   */	\
48		     __switch_canary					\
49		     "jmp __switch_to\n"	/* 寄存器参数 调用  */	\
50		     "1:\t"						\
51		     "popl %%ebp\n\t"		/* 保存 EBP   */	\
52		     "popfl\n"			/* 恢复 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系统最一般执行过程中,用户态进程总要依次中断,保存现

posted on 2016-04-16 17:31  5319zl  阅读(177)  评论(0编辑  收藏  举报

导航