实验二:完成一个简单的时间片轮转多道程序内核代码

  1. 搭建实验环境
    1. 下载内核文件和补丁
      wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.9.4.tar.xz
      在实验楼中的环境下内核源码文件已经下载并编译完毕,但由于实验楼的环境升级,需要重新编译
      wget https://raw.github.com/mengning/mykernel/master/mykernel_for_linux3.9.4sc.patch # download mykernel_for_linux3.9.4sc.patch
      删除mykernel文件夹中全部内容,安装补丁文件,并用make allnoconfig复位

      make指令进行编译,等候编译结束
    2. 使用qemu查看内核状态
      安装qemu 并使用qemu查看内核状态
      qemu -kernel arch/x86/boot/bzImage
    3. 查看mymain.c和myinterupt.c理解上述运行情况
      mymain.c

      myinterupt.c
  2. 修改mymain.c 和myinterrupt.c代码 重新编译实现时间偏轮转
    构建构建PCB。有进程号,运行状态,预先开辟的stack空间 线程的ip和sp 还有运行程序的入口地址task_entry
    另外此处PCBl类型为tPCB,stack的size为1024*8

    在mymain.c的主程序下,有进程序列task,还有一个当前运行task的链表

    内核启动,设置序列内的第一个进程的进程号为0
    修改状态为启动运行
    把入口地址和线程的ip都改成从函数my_process开始启动。
    把线程的sp更新为进程stack的末端地址
    形成环状进程链表

    创建更多的进程,把入口地址都更新为my_process
    修改进程号 设置运行状态为阻塞 加入环状链表

    设置从0号进程开始启动,当前执行程序指向环形链表第一个程序
    把1号程序的sp装载esp 1号程序的bp装载ebp 启动运行(先把esp指向stack空间高位,载入eip载入ebp)

    此时eip地址为my_process函数地址,所以开始执行myprocess函数
    每隔10000000周期进程号。主动询问是否需要调度,如果需要调度启动调度函数

    切换到myinterupt.c代码中,中断调用的程序会进行计数,当1000周期时将启用调度

    调度函数,有记录上一个进程和下一个进程,如果当前进程后面没有进程了则返回,如果当前进程环中空了,也返回,如果有则更新两个记录值

    判断当前情况,如果下一个可以运行,切换下一个进程,装载寄存器
    如果下一个目前状态不能运行,则让他运行并且换到他
posted @ 2017-02-24 15:36  小饭勺  阅读(191)  评论(0)    收藏  举报