一、实验过程
1.打开终端,与前几次实验相同,输入命令cd Linux/menu进入到menu目录下,然后输入命令qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S启动MENUOS ,然后打开gdb,输入命令file ../linux-3.18.6/vmlinux加载符号表,然后如何命令target remote :1234连接MENUOS,并在schedule、context_switch、switch_to三个函数处设置断点。实验结果如图1所示。
图 1
2. 然后利用gdb的命令c、n、s、l等进行调试,我们可以看到,首先执行了函数schedult(),实验结果如下图所示。
图 2
输入命令c进行继续调试,我们可以看到进程在context_switch()函数处停止,实验结果如图3所示。
图 3继续进行调试,我们从图4可以看到进程在schedule()处暂停,实验结果如图4所示。
图 4
继续调试。
图 5利用命令s进行单步调试。
图 6
二、进程的调度时机与进程的切换分析
1. 进程调度的时机有如下可能
1. 中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();