• 作业二:操作系统是如何工作的进行


    作业二:操作系统是如何工作的进行

    mykernel实验指导(操作系统是如何工作的)

    运行并分析一个精简的操作系统内核,理解操作系统是如何工作的

    打开shell

    1. cd LinuxKernel/linux-3.9.4
    2. 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

  • 相关阅读:
    HDU 逃离迷宫 (bfs)
    HDU 2588 GCD (欧拉函数)
    HDU 诡异的楼梯 (bfs)
    oj 二叉树相关
    AVL树代码实现
    用栈实现队列
    redis学习
    15. 三数之和 (思维)
    889. 根据前序和后序遍历构造二叉树(非递归)
    寻找重复的子树(dfs)
  • 原文地址:https://www.cnblogs.com/zhengwei0712/p/5234622.html
Copyright © 2020-2023  润新知