这个作业要求在哪里 |
<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) |
|