学号后三位:077
本次实验采用的环境是https://www.shiyanlou.com/courses/195,资源来自https://github.com/mengning/mykernel。
一、实验过程
使用实验楼的虚拟机打开shell,输入如下指令:
下图是make指令编译过程截图↓
编译结束,输入qemu -kernel arch/x86/boot/bzImage
,可以看到窗口不断输出
>>>>>>my_timer_handler_here<<<<<<<<<<< my_start_kernel here
输入下面指令,查看代码(按下ESC和:,再输入wq退出vim)
mymain.c↓
myinterrupt.c↓
my_start_kernel()一直执行,是一个死循环,my_timer_handler()每个时钟周期执行一次。
从https://github.com/mengning/mykernel下载,将得到的代码覆盖原有的代码,重新编译,打开qemu窗口
二、进程的启动和进程的切换机制
mypcb.h定义了进程控制块PCB的结构体,进程数和堆栈空间大小。
mymain.c中的my_start_kernel( )初始化所有进程,运行0号进程。my_process( )输出进程编号,my_need_sched标志进程是否需要切换,进程切换时,调用myinterrupt的my_schedule( )。
myinterrupt.c中my_timer_handler()循环检查my_need_sched,当一个时间片用完(time_count%1000 == 0),将my_need_sched置1。这时进程调度函数my_schedule()就会被调用。保存当前进程的ebp,将当前进程的esp赋给prev->thread.sp保存,然后把next->thread.sp赋给esp,保存prev进程的eip,接着将next进程的指令指针信息存入eip寄存器中,运行next进程,最后又恢复之前的信息,如此循环。
三、总结
操作系统的功能是管理计算机的硬件和软件资源,其核心就是进程调度,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是资源分配的一个独立实体。进程切换指从正在运行的进程中收回处理器,让待运行进程来占有处理器运行,实质上就是被中断运行进程与待运行进程的上下文切换,主要过程是:保存被中断进程的上下文,转向进程调度,恢复待运行进程的上下文。