• 一个简单的时间片轮转多道程序内核代码分析--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),所以理论上只能单任务顺序执行,但基于三个法宝和两把宝剑,操作系统得以实现多任务操作。

     

  • 相关阅读:
    常用操作之增、删、改、查
    文本编辑器相关操作
    关于Secondary NameNode
    hive基础概念总结(1)
    Shell 十三问[转]
    《SQL Server 2012 Tutorials Analysis Services Multidimensional Modeling》读后感
    HDFS随笔(1)
    Hue for Apache Hadoop
    大数据面试题总结
    关于数据倾斜
  • 原文地址:https://www.cnblogs.com/EliteDci/p/5247040.html
Copyright © 2020-2023  润新知