一个简单的时间片轮转多道程序内核代码分析--20135334赵阳林
运行并分析一个精简的操作系统内核,理解操作系统是如何工作的
实验过程:
登陆实验楼虚拟机http://www.shiyanlou.com/courses/195
打开终端shell,输入以下命令:
cd LinuxKernel/linux-3.9.4
qemu -kernel arch/x86/boot/bzImage
会弹出一个QEMU终端窗口
![](http://upload-images.jianshu.io/upload_images/134428-d07fc8a0572acb88.png?imageView2/2/w/1240/q/100)
里面会不停的交错输出“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 \n",i);
}
}
可以看出在做一个无限循环,每100000次循环向终端输出1次“my_start_kernel here”+累计循环次数。
myinterrupt.c源码如下:
void my_timer_handler(void)
{
printk(KERN_NOTICE "\n>>>>>>>>>>>>>>>>>my_timer_handler here<<<<<<<<<<<<<<<<<<\n\n");
}
当时钟中断被调用时,该程序向终端输出“>>>>>>>>>>>>>>>>>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),所以理论上只能单任务顺序执行,但基于三个法宝和两把宝剑,操作系统得以实现多任务操作。