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

本文介绍如何在实验环境中下载并编译Linux内核3.9.4版本,包括应用补丁、配置及编译过程。通过修改mymain.c和myinterrupt.c文件实现了时间片轮转调度算法,构建了进程控制块(PCB)和环状进程链表。
  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复位
      785765-20170224152944257-1175810561.png
      make指令进行编译,等候编译结束
    2. 使用qemu查看内核状态
      安装qemu 并使用qemu查看内核状态
      qemu -kernel arch/x86/boot/bzImage
      785765-20170224153501460-1424928418.png
    3. 查看mymain.c和myinterupt.c理解上述运行情况
      mymain.c
      785765-20170224154451648-774161796.png
      myinterupt.c
      785765-20170224154626835-31064752.png
  2. 修改mymain.c 和myinterrupt.c代码 重新编译实现时间偏轮转
    构建构建PCB。有进程号,运行状态,预先开辟的stack空间 线程的ip和sp 还有运行程序的入口地址task_entry
    另外此处PCBl类型为tPCB,stack的size为1024*8
    785765-20170225135712413-1690601887.png
    在mymain.c的主程序下,有进程序列task,还有一个当前运行task的链表
    785765-20170225140301007-1306102982.png
    内核启动,设置序列内的第一个进程的进程号为0
    修改状态为启动运行
    把入口地址和线程的ip都改成从函数my_process开始启动。
    把线程的sp更新为进程stack的末端地址
    形成环状进程链表
    785765-20170225140956288-1034011455.png
    创建更多的进程,把入口地址都更新为my_process
    修改进程号 设置运行状态为阻塞 加入环状链表
    785765-20170225141019366-439373149.png
    设置从0号进程开始启动,当前执行程序指向环形链表第一个程序
    把1号程序的sp装载esp 1号程序的bp装载ebp 启动运行(先把esp指向stack空间高位,载入eip载入ebp)
    785765-20170225141304523-1758681194.png
    此时eip地址为my_process函数地址,所以开始执行myprocess函数
    每隔10000000周期进程号。主动询问是否需要调度,如果需要调度启动调度函数
    785765-20170225143431179-2079398896.png
    切换到myinterupt.c代码中,中断调用的程序会进行计数,当1000周期时将启用调度
    785765-20170225143824351-1798046212.png
    调度函数,有记录上一个进程和下一个进程,如果当前进程后面没有进程了则返回,如果当前进程环中空了,也返回,如果有则更新两个记录值
    785765-20170225144136445-1752316332.png
    判断当前情况,如果下一个可以运行,切换下一个进程,装载寄存器
    如果下一个目前状态不能运行,则让他运行并且换到他
    785765-20170225144344366-210970049.png

转载于:https://www.cnblogs.com/xiaofanshao/p/6438788.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值