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系统最一般执行过程中,用户态进程总要依次中断,保存现