一个简单的时间片轮转多道程序内核代码分析--20135334赵阳林

实验目的:

运行并分析一个精简的操作系统内核,理解操作系统是如何工作的

实验过程:

登陆实验楼虚拟机http://www.shiyanlou.com/courses/195

打开终端shell,输入以下命令:

cd LinuxKernel/linux-3.9.4

qemu -kernel arch/x86/boot/bzImage

会弹出一个QEMU终端窗口


mykernel

里面会不停的交错输出“my_start_kernel here”和“my_timer_handler here”

这其实分别来自两个不程序产生的进程,一个来自程序mymain.c,另一个来自myinterrupt.c

mymain.c源码如下(省略了引用头部分,下同):

void __init my_start_kernel(void)

{

int i = 0;

while(1)

{

i++;

if(i%100000 == 0)

printk(KERN_NOTICE "my_start_kernel here  %d ",i);

}

}

可以看出在做一个无限循环,每100000次循环向终端输出1次“my_start_kernel here”+累计循环次数。

myinterrupt.c源码如下:

void my_timer_handler(void)

{

printk(KERN_NOTICE " >>>>>>>>>>>>>>>>>my_timer_handler here<<<<<<<<<<<<<<<<<< ");

}

当时钟中断被调用时,该程序向终端输出“>>>>>>>>>>>>>>>>>my_timer_handler here<<<<<<<<<<<<<<<<<<”信息。

实验分析:

当mykernel自制操作系统启动后,即qemu命令执行后,系统会首先调用mymain产生一个进程,该进程内while循环条件恒为1所以永远执行输出“my_start_kernel here”+累计循环次数,没有结束的时候。此时由系统时钟中断触发调用myinterrupt产生一个新进程,并输出“my_timer_handler here”,结束后返回mymain产生的进程继续执行,等待下一次系统时钟中断触发调用myinterrupt产生一个新进程,myinterrupt产生的新进程和上一次的属于不同的进程,而mymain由于循环没有终止的时候,所以永远是原来的那个进程。

通过观察可以发现,当执行myinterrupt后返回mymain时,终端输出的累计循环次数是连续的,并没有中断或重置,说明CPU和内核代码共同实现了保存现场和恢复现场的功能,会将一些重要的寄存器,比如eip、ebp、esp等保存下来,等待切换回来的时候继续执行。

实验总结:

通过该实验操作,成功实现了一个简单的时间片轮转多道程序,通过一个精简的操作系统内核,完成了一个简单的操作系统功能。

计算机有三个法宝:存储程序计算机、函数调用堆栈、中断

操作系统有两把宝剑:中断上下文、进程上下文切换

由于CPU只有一套寄存器,同一时间只能处理一个进程(暂且只考虑单核CPU),所以理论上只能单任务顺序执行,但基于三个法宝和两把宝剑,操作系统得以实现多任务操作。

 

原文地址:https://www.cnblogs.com/EliteDci/p/5247040.html