作业二:操作系统是如何工作的进行
2016-03-02 13:36
148 查看
作业二:操作系统是如何工作的进行
mykernel实验指导(操作系统是如何工作的)运行并分析一个精简的操作系统内核,理解操作系统是如何工作的
打开shell
cd LinuxKernel/linux-3.9.4
qemu -kernel arch/x86/boot/bzImage
然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c
一、实验截图
二、分析进程的启动和进程的切换机制
一个小的内核源代码
mypcb.h:1.#define KERNEL_STACK_SIZE 1024*28 定义一个进程控制块 实际内存里叫TASK_STRUCK(视频是好像是这么写) 2.ip,sp 用于保存eip,esp 3.PCB(定义进程管理相关的数据结构) 定义了pid进程名,进程状态,堆栈...task_entry入口 pcb*next 使用链表 4.my_schedule函数---调度器
mymain.c-----------------内核初始化和0号进程启动
1.#include "mypcb.h" 2.申明了一个PCBtask数组,当前task的一个指针,是否需要调度(标识) 3 **怎样标识初始化** (1)从my_start_kernel(void)开始,初始化当前0号进程,pid=0,状态是正在运行,入口是my_process(实际上是my_start_kernel,只是在这初始化一下) (2)堆栈的栈顶定义了一个stack (3)next指向它自己,启动时,整个系统只有0号进程 (4)创建更多的进程for(i=1;i<MAX_TASK_NUM;i++), 用memcpy()把进程初始状态复制过来;状态,用自己的堆栈,每个进程都有自己的堆栈, task[i].next=task[i-1].next;指向下一个进程, task[i-1].next=&task[i];将新创建的进程加入进程链表的尾部,创建多个进程(MAX_STASK_NUM个) (5)start process 0 by task[0],0号进程开始执行 (6)图:汇编代码----%1表示ESP C----表示ECX 建立环境,从0号进程的堆栈与入口,构建CPU的构建环境,此时内核初始化完成,0号进程也启动。 (7)my_process()所有进程都用这个,10000000万次,打印,调度一次(**my_schedule()**),切换,主动调度的机制。
myinterrupt.c
1.#include "mypcb.h" , extern一些全局的东西。time_count计数
2.设置时间片的大小,时间片用完时,设置一下调度标识。 if(timecount%1000==0&&myneedsched!=1) 当进程执行到的时候,发现needsched==1,就执行myschedule
3.myschedule() *prev---当前进程 将当前进程赋给next 情况一:如果下一个进程的状态是0的话,正在执行的话,用图进行切换两个正在运行的进程上下文切换 $1f接下来的标号1:的位置
情况二:进程从未执行过,执行起来特殊点,将状态转成运行时状态,作为当前执行的进程,esp,ebp指向同一位置,
操作系统两把剑:中断上下文和进程上下文切换
三、总结部分需要阐明自己对“操作系统是如何工作的”理解
通过内核源代码了解,从环境搭建起来,mystartkernerl开始初始化至完成,启动0号进程,利用时间片,每个进程每隔1000万次,判断是否需要调度,调度使用myshedule()进行调度.设置时间片的大小,时间片用完时,设置一下调度标识。 if(timecount%1000==0&&myneedsched!=1) 当进程执行到的时候,发现needsched==1,就执行myschedule,调度分两种情况,一种是下一个进程正在进行的,另一种是从未调度过的,进程从未执行过,执行起来特殊点,将状态转成运行时状态,作为当前执行的进程,esp,ebp指向同一位置两种汇编代码略有不同,是关键。
注明:郑伟 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
相关文章推荐
- mysqldump: Got error: 1142: SELECT, LOCK TABLES command denied to user 'root'@'localhost' for table
- android内存泄露
- Gpg4Win 加密
- phpcms上传到服务器后台登录验证码无法显示的问题
- 利用MFC和OpenCV构建GUI程序读取摄像头视频
- 2016蓝桥杯算法提高——上帝造题五分钟
- linux编程之mkdir() rmdir() remove()函数
- 解决VC6.0出现“ Microsoft(R)Developer Studio已停止工作”的问题
- 一个性能较好的JVM参数配置(转)
- UITextField右侧小圆叉
- java判断一个字符串是否可以转成日期(严格的日期转换)
- poj--1258--Agri-Net(最小生成树)
- 反转排序
- Educational Codeforces Round 9 C. The Smallest String Concatenation(字符串排序)
- Android Selector用法小记
- 初学java
- 《AngularJS》5个实例详解Directive(指令)机制
- 【iOS】使用Xib自定义tableViewCell 获取数据
- redis的主从配置
- apache commons-pool的配置参数