基于mykernel完成多进程的简单内核

学号:404,原创作品转载请注明出处

实验来源https://github.com/mengning/linuxkernel/

一、mykernel简介

 mykerkel是孟宁老师在github上发布的简单自由,可以用于开发自己的操作系统的平台,它基于linux3.9.4 内核,源代码级具体说明可以从https://github.com/mengning/mykernel获取。

二、搭建实验环境

实验楼打开实验2,打开终端,输入如下指令:

1 cd LinuxKernel/linux-3.9.4
2 rm -rf mykernel
3 patch -p1 < ../mykernel_for_linux3.9.4sc.patch
4 make allnoconfig
5 make #编译内核请耐心等待
6 qemu -kernel arch/x86/boot/bzImage

全部执行完成后可以在qemu窗口看到如下图所示的运行结果,这是编译运行mykernel的结果。可以看到的是,>>>>>my_timer_handler here <<<<< 和my_start_kernel here *****不停的循环运行着。

 

 

关闭qemu窗口,在mykernel中打开mymain.c 和myinterrupt.c。

先打开 mymain.c,其中的 my_start_kernel函数中不断循环,输出my_start_here,周期性的产生时钟中断信号,这个信号会触发myinterrupt.c.

打开 myinterrupt.c ,my_time_handler here 就是不断被时钟中断的函数。

 

 

这两个函数就可以组成一个最简单的操作系统,完成进程的轮转调度。

三、时间片轮转多道程序

主要通过三个文件(mypcb.h,myinterrupt.c和mymain.c)来完成时间片轮转多道程序,源代码的地址为:https://github.com/mengning/mykernel。

下载后,复制到将mykernel中,输入如下指令执行:

1 make allonoconfig
2 make
3 qemu -kernel arch/x86/boot/bzImage

执行后有显示如下:

四、代码分析

1. mypcb.h

mypcb.h 定义了结构体PCB,也就是进程控制块,结构体中定义的变量意义如下:

  • pid :进程编号,用于唯一标志一个进程。
  • state:表示进程当前的状态,1 -- 运行,0 -- 就绪,-1 -- 阻塞。
  • stack:进程的堆栈。
  • thread:一个结构体,保存着ip和sp的指针
  • task_entry:  进程的入口,保存的在内存的存储地址。
  • *next : 一个指针,指向下一个PCB结构体。

 2. mymain.c  

这个函数主要是完成了0号进程的初始化,对PCB结构体中涉及的变量进行了赋值,并通过for循环完成i号进程的初始化,并将i号进程加入一个链表,最终创建一个具有MAX_TASK_NUM个进程的链表。

 

my_process  函数是通过判断my_need_sched 来决定是否执行 my_schedule()来进一步判断是否执行进程。

3. myinterrupt.c

通过时间片的轮转,不断更新my_need_sched = 1,使myprocess能够执行。

myschedule函数主要使判断下一个进程的状态,如果是就绪的状态就切换进程并执行。

四、总结

通过本次实验,我对操作系统中进程的调度和切换有了更深的理解,了解了进程切换调度的具体实现,特别是如何保护现场和恢复现场。

 

。 

 

posted on 2019-03-12 18:37  xctspring  阅读(197)  评论(0编辑  收藏  举报

导航