基于时间片轮转多道程序内核代码分析操作系统的工作过程

来源:互联网 发布:淘宝外卖网页版 编辑:程序博客网 时间:2024/05/14 02:19

一、计算机利用堆栈实现函数调用时堆栈的变化:

1.函数的堆栈框架:

建立:push %ebp

           movl %esp,%ebp

拆除:movl %ebp,%esp

           popl %ebp,%ebp

           ret

二、分析简单的时间片轮转多道程序内核代码,理解操作系统的运行:

1.一个简单的时间片轮转多道程序内核代码:

(1)mypcb.h:


代码分析:

Thread:定义ip和sp

struct PCB:定义进程的id,状态(state),堆栈,入口,链表(next),进程(my_schedule)

(2)mymain.c:




代码分析:

    1)#inclede "mypcb.h":申明了当前pcb的数组,指针;

    2)my_start_kernel:初始化了0号进程,正在运行;入口;栈顶;next是指向自己,因为此时只有0进程;

       同理建立更多的进程,并把新的进程加到进程列表的尾部;

        start process 0 by task[0]:从0进程开始运行。此处用到嵌入式汇编代码(完成了从0号进程设定的堆栈和0号进程的入口的cpu

       运行环境的构建)。

      此时my_start_kernel(内存的初始化)已经执行完毕并且将0号进程启动起来。

   3)void my_process(void):0号进程的工作——主动调度输出,实现一千万次循环之后才调度一次。

(3).myinterrupt.c:





代码分析:

    1).my_timer_handel(void):设置时间片的大小;my_need_sched不等于1000,设其为1;执行my_schedule。

    2).my_schedule:把当前进程赋给next,如果下个进程为0(正在进行),则切换到volatile。

    3).volatile:(此段代码即为进程切换的关键所在)把当前进程的ebp保存起来。把当前进程的esp赋给0,把next进程的sp放到esp里,

        把eip保存起来,把next进程的eippush到堆栈里,执行下个进程。


三、基于时间片轮转多道程序内核代码的运行实验:


代码分析: 

qemu -kernel arch/x86/boot/bzImage即为运行进程调度的指令代码。可以主观的去改动时间片的大小,从而改变调度的频率大小。

vi mymain.c ;vi myinterrupt.c是用于查看程序的指令。


三、实验的结果和其截图:


四、实验总结:

通过该实验,理解了计算机在工作的时候是如何调用堆栈以及堆栈的具体变化过程;对于一个简单的时间片轮转多道程序内核的代码有了深刻的理解,对于进程的启动和切换有了更深的理解。


                                                                                                                                                                       庄华健

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000


0 0
原创粉丝点击