系统相关
首页 > 系统相关> > 基于mykernel完成多进程的简单内核

基于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,也就是进程控制块,结构体中定义的变量意义如下:

 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函数主要使判断下一个进程的状态,如果是就绪的状态就切换进程并执行。

四、总结

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

 

。 

 

标签:基于,myinterrupt,mymain,qemu,内核,进程,mykernel,my
来源: https://www.cnblogs.com/xctspring/p/10518633.html