基于时间片轮转多道程序内核代码分析操作系统的工作过程
2016-03-06 15:28
337 查看
一、计算机利用堆栈实现函数调用时堆栈的变化:
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是用于查看程序的指令。
三、实验的结果和其截图:
四、实验总结:
通过该实验,理解了计算机在工作的时候是如何调用堆栈以及堆栈的具体变化过程;对于一个简单的时间片轮转多道程序内核的代码有了深刻的理解,对于进程的启动和切换有了更深的理解。
&nb
4000
sp;
庄华健
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
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是用于查看程序的指令。
三、实验的结果和其截图:
四、实验总结:
通过该实验,理解了计算机在工作的时候是如何调用堆栈以及堆栈的具体变化过程;对于一个简单的时间片轮转多道程序内核的代码有了深刻的理解,对于进程的启动和切换有了更深的理解。
&nb
4000
sp;
庄华健
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
相关文章推荐
- Java 自己补充知识(2)变量 数据类型
- 二叉树反转
- Eclipse快捷键功能
- Java 自己补充一些知识(1)jre&jdk
- 学习C++反汇编-多继承
- python学习笔记-Day6(3)
- java笔记--设计模式之模版方法模式
- 2016蓝桥杯假期任务之《01背包 》
- C++中const修饰二级指针(从类型‘int**’到类型‘const int**’的转换无效)
- 安装php时,configure: error: xml2-config not found. Please check your libxml2 installation
- java简单操作word实例
- java中hashCode方法与equals方法的用法总结
- java 线程学习-课前须知
- C语言实现使用动态数组来构造栈结构
- CAF(C++ actor framework)使用随笔(延迟发送,消息转发,消息优先级)(四)
- 随机生成三十个二年级的加减乘除法的题目代码
- AMH4.2面板PHP升级5.6.9
- Igor In the Museum(搜搜搜151515151515******************************************************1515151515151515151515)
- C/C++基础-001
- 一个简单的有限状态机例子