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

原创 2015年07月10日 10:29:37

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

重要汇编代码分析

    asm volatile(
        "movl %1,%%esp\n\t"
        "pushl %1\n\t" 
        "pushl %0\n\t" 
        "ret\n\t" 
        "popl %%ebp\n\t"
        : 
        : "c" (task[pid].thread.ip),"d" (task[pid].thread.sp) 
    );

image

image

image

image

image

image

  • 保存恢复进程上下文

    asm volatile(   
        "pushl %%ebp\n\t"   //保存当前 ebp
        "movl %%esp,%0\n\t"     //保存 esp
        "movl %2,%%esp\n\t"     //载入下一个进程的 esp
        "movl $1f,%1\n\t"          //保存 eip
        "pushl %3\n\t"      //
        "ret\n\t"       //载入 eip
        "1:\t"      //下一个进程开始执行
        "popl %%ebp\n\t"    //
        : "=m" (prev->thread.sp),"=m" (prev->thread.ip)
        : "m" (next->thread.sp),"m" (next->thread.ip)
    ); 
    
    
    //如果没有正在运行的进程
    asm volatile(   
        "pushl %%ebp\n\t"      //保存 ebp
        "movl %%esp,%0\n\t"    //保存 esp
        "movl %2,%%esp\n\t"    //载入 esp
        "movl %2,%%ebp\n\t"    //载入 ebp
        "movl $1f,%1\n\t"      //保存 eip  
        "pushl %3\n\t" 
        "ret\n\t"              //载入上下文
        : "=m" (prev->thread.sp),"=m" (prev->thread.ip)
        : "m" (next->thread.sp),"m" (next->thread.ip)
    );          
    

举例分析:如果有三个进程

  • 从 mymain.c 中的__init my_start_kernel方法开始执行
  • 新建 pid=0的进程,并且将其状态设置为0(runnable),设置进程入口地址、栈地址
  • 从0号进程复制1、2号进程,并且将0的 next 赋值为1号的入口地址,1号赋值为2号的入口地址
  • 将0号进程赋值为当前正在执行进程(my_current_task = &task[0];)
  • 执行汇编代码:保存进程信息,开始执行0号进程
  • 发生中断,需要切换进程
  • 执行汇编代码:保存当前进程的ebp、esp、eip(当前进程上下文)
  • 载入下一个进程(1号)的上下文(esp、eip)
  • 下一个进程(1号)开始执行
  • 再次发生中断,需要切换进程……
  • ……
版权声明:本文为博主原创文章,未经博主允许不得转载。(文章来源:http://blog.luoyuanhang.com)

Linux内核分析:完成一个简单的时间片轮转多道程序内核代码

第二周作业:完成一个简单的时间片轮转多道程序内核代码张家骥+ 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-...
  • Neo19901121
  • Neo19901121
  • 2015年03月15日 17:26
  • 784

一个简单的时间片轮转多道程序内核代码

关于时间片轮转多道程序内核代码分析 【当前进程与处于运行状态的目标进程切换】 asm volatile( 1 "pushl %%ebp\n\t" /* save ebp */...
  • sinat_34144680
  • sinat_34144680
  • 2016年03月02日 17:50
  • 486

2、完成一个简单的时间片轮转多道程序内核代码

姓名:周毅 原创作品转载请注明出处  《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一、实验原理主要由 ...
  • u011301547
  • u011301547
  • 2017年03月04日 19:51
  • 136

完成一个简单的时间片轮转多道程序

实验环境:虚拟机Ubuntu Kylin 16.04 实验截图: 图1:搭建内核 图2:运行内核 图3:时间片轮转 图4:mypcb.h文件代码 图5:内核初...
  • yiba1993
  • yiba1993
  • 2017年03月04日 14:07
  • 163

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

章强 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000...
  • kidult1992
  • kidult1992
  • 2017年03月05日 16:40
  • 115

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

陈良 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://www.xuetangx.com/courses/course-v1:ustcX+USTC001+_/about ...
  • sap_liang
  • sap_liang
  • 2017年12月28日 19:38
  • 23

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

一.实验目的 1、熟悉、理解Linux内核工作方式 2、尝试编写自己的内核 3、理解多进程时间片轮转的工作方式 二.实验步骤 1.编写时间片轮转程序。 2.运行程序 cd Linux...
  • u010419639
  • u010419639
  • 2016年03月06日 17:06
  • 121

完成一个简单的时间片轮转多道程序内核代码(一)

完成一个简单的时间片轮转多道程序内核代码先上代码: myPCB.h/* * linux/mykernel/mypcb.h * * describe PCB * * by Yuanhan...
  • luoyhang003
  • luoyhang003
  • 2015年07月07日 23:26
  • 740

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

在实验楼上按步骤cd LinuxKernel/linux-3.9.4 rm -rf mykernel patch -p1 < ../mykernel_for_linux3.9.4sc.patch ma...
  • moling03
  • moling03
  • 2017年03月05日 17:24
  • 61

简单的时间片轮转多道程序内核代码

一个简单时间片轮转调度的内核代码
  • ven_kon
  • ven_kon
  • 2017年03月04日 20:54
  • 228
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:完成一个简单的时间片轮转多道程序内核代码(二)
举报原因:
原因补充:

(最多只允许输入30个字)