基于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函数主要使判断下一个进程的状态,如果是就绪的状态就切换进程并执行。
四、总结
通过本次实验,我对操作系统中进程的调度和切换有了更深的理解,了解了进程切换调度的具体实现,特别是如何保护现场和恢复现场。
。
标签:基于,myinterrupt,mymain,qemu,内核,进程,mykernel,my 来源: https://www.cnblogs.com/xctspring/p/10518633.html