一个基于mykernel简单内核的时间片轮转多道程序
学号末尾三位:210
本实验来源于—— https://github.com/mengning/linuxkernel/
一.Mykernel
这个是由孟老师建立的基于Linux Kernel 3.9.4 source code的linux内核操作系统。可以使用实验楼http://www.shiyanlou.com/courses/195提供的虚拟机运行。也可以在 https://github.com/mengning/mykernel 上找到mykernel的源代码并按照上面的步骤来运行。
二.实验
本实验在实验楼平台进行。
使用实验楼的虚拟机打开shell。
输入:cd LinuxKernel/linux-3.9.4
rm -rf mykernel
patch -p1 <../mykerne_for_linux3.9.4sc.patch
make allnoconfig
make
等待编译
qemu -kernel arch/x86/boot/bzImage
实验结果如图所示:my_start_kernel here 与my_timer_handler here 交替出现。
打开mykernel文件夹可以看到my interrupter.c和my main.c的c代码。
可以看到当my_start_kernel 运行时,my_timer_handler函数周期性被时钟中断所调用。
更改my_start_kernel 和my_timer_handler函数就可以实现简单的多道程序调度。
三.简单的多道程序操作系统
在操作系统中最为重要的是进程调度。本次实验能帮做我们更好的掌握进程调度的原理。
在my_start_kernel 和my_timer_handler函数的基础上拓展了实验代码。
实验源码来源:https://github.com/mengning/mykernel
在实验楼的实验平台上,打开mykernel文件夹修改my_start_kernel 和my_timer_handler函数,建立mypcb.h文件。
修改代码后重新编译make后,输入qemu -kernel arch/x86/boot/bzImage。
可以看到进程从2切换到3的过程。
四.代码分析
1.mypcb.h中定义了进程控制块pcb的结构。
pid 为进程的序号
state 为进程的状态
stack 为进程内部所用的堆栈
thread结构记录着进程的ip和sp(指令指针和堆栈指针)。
task_entry为进程的入口
next为指向下一个进程。
2.mymain.c
先执行my_start_kernel函数,初始化进程号为0的进程,并依次创建其余的进程。并把0号进程标记为当前正在运行的进程,内嵌汇编代码实现:esp和eip中的值为当前正在执行进程的sp和ip,表明当前正在运行0号进程。
my_process()根据全局变量my_need_sched来主动调度,进行进程之间的切换。
3.myinterrupt.c
my_timer_handler不断被时钟中断所调度,每调度1000次就改变全局变量my_need_sched的值,来让my_process()主动进行进程之间的切换。
my_schedule()函数来进行进程之间的调度。内嵌汇编代码实现:保存上一个进程的ip和sp,把下个进程的ip和sp放入eip和ebp中。这就完成了进程切换。
五.总结
通过本次实验让我对操作系统最重要的进程管理和进程切换的机理有了一个较为清晰的认识。