2020-2021-1 20209328 《Linux内核原理与分析》第九周作业

作业信息

这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业>
这个作业的目标 <理解进程调度的时机和进程切换的过程>
作业正文 ...https://www.cnblogs.com/matahh/p/14076658.html
1.实验目的
(1)理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule()。
(2)使用gdb跟踪分析一个schedule()函数 ,验证您对Linux系统进程调度与进程切换过程的理解;
(3)特别关注并仔细分析switch_to中的汇编代码,理解进程上下文的切换机制,以及与中断上下文切换的关系;
2.实验内容
配置运行MenuOS系统
配置gdb远程调试和设置断点
使用gbd跟踪分析了schedule()函数,pick-next-task函数是schedule函数中重要的函数,负责根据调度策略和调度算法选择下一个进程。
context-switch是schedule函数中实现进程切换的函数,context_switch函数中进行进程关键上下文切换的函数。
3.实验分析
分析switch_to中的汇编代码:
1 把prev和next分别保存在寄存器中,即寄存器传参
movl prev,%eax
movl next,%edx
2 把eflags和ebp保存在当前的堆栈中
pushfl
pushl %ebp
3 把esp的内容保存到prev->thread.esp中,以使该字段指向prev内核栈的栈顶
ovl %esp,484(%eax)
注:484(%eax) ,表示内存但愿的地址=(%eax) + 484
4 把next->thread.sp装入esp,内核开始在next的指令空间中操作,这条指令完成了进程之间的切换。
可以会想thread_info数据结构,内核栈和进程描述符组成的8K的数据结构
movl 484(%edx),%esp
5 把标记为1f的地址存入prev->thread.eip,即被替换出的进程在下次被schedule()选择执行时,从这条指令开始执行
movl $1f,480(%eax)
6 把next->thread.eip(绝大多数情况是一个被标记为1的地址)的值压入next的内核栈
pushl 480(%edx)
7 跳到__swtich_to() c语言函数开始执行
jmp __swtich_to
8 这里被进程next替换的进程prev再次获得CPU:它执行一些保存eflags和ebp的寄存器内容指令,这两条指令的第一条指令被标记为1
参考文章(https://blog.csdn.net/ustc_dylan/article/details/4064627)
posted @ 2020-12-02 21:52  matahh  阅读(97)  评论(0编辑  收藏  举报