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

举报
远航 | FIBOS 发表于 2020/12/02 00:14:33 2020/12/02
【摘要】 完成一个简单的时间片轮转多道程序内核代码 重要汇编代码分析 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) ); 123...

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

重要汇编代码分析

 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) );

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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)
    ); 
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

  • 从 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号)开始执行
  • 再次发生中断,需要切换进程……
  • ……

文章来源: blog.csdn.net,作者:冰水比水冰,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/luoyhang003/article/details/46827401

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。