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

原创 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)

相关文章推荐

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

完成一个简单的时间片轮转多道程序内核代码先上代码: myPCB.h/* * linux/mykernel/mypcb.h * * describe PCB * * by Yuanhan...

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

在实验楼上按步骤cd LinuxKernel/linux-3.9.4 rm -rf mykernel patch -p1 < ../mykernel_for_linux3.9.4sc.patch ma...

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

1、实验图 这次试验的内核由Linux3.9.4修改而来,详情见https://github.com/mengning/mykernel2、代码分析mypcb.h#define MAX_TASK_N...

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

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

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

杨俊 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 时间片轮转调度是一种最古...

从一个简单的时间片轮转多道程序内核代码看操作系统如何运行

上了网易云课堂MOOC的《Linux内核代码分析》这门课,学到了很多知识,现在做博文记录第二次试验。 试验要求: 完成一个简单的时间片轮转多道程序内核代码,需要仔细分析进程的启动和进程的切换机制,...

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

张韩 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 首先,解读一下程序的...

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

董涛 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本文通过编写一个简单的时间片轮...

2_进程切换_一个简单的时间片轮转多道程序内核代码

版权声明:陈诚 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ==============...
  • bshcc
  • bshcc
  • 2016年02月29日 20:37
  • 685

操作系统是如何工作的-------通过一个简单的时间片轮转多道程序内核代码分析

王雪 原创作品转载请注明出处 《Linux内核分析》MOOC课程 http://mooc.study.163.com/course/USTC-1000029000一、理论知识 1.计算机是如何工作的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:完成一个简单的时间片轮转多道程序内核代码(二)
举报原因:
原因补充:

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