Linux内核分析第八周——进程的切换和系统的一般执行过程

李雪琦+原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、知识要点:

schedule目的:在运行队列中找到一个进程,把cpu分配给他。

schedule()函数选择一个新的进程来运行,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换。

next = pick_next_task(rq, prev);//进程调度算法都封装这个函数内部
context_switch(rq, prev, next);//进程上下文切换

switch_to利用了prev和next两个参数:prev指向当前进程,next指向被调度的进程

打开schedule代码分析:

打开switch_to代码,对其进行分析:

​​ #defineswitch_to(prev, next, last)

32do {
40unsignedlongebx, ecx, edx, esi, edi;
42asmvolatile("pushfl\n\t" //保存当前进程的flag
43"pushl % ebp\n\t"         //把当前进程的堆栈基址压栈
44"movl %%esp,%[prev_sp]\n\t"   //把当前栈顶保存起来,保存到thread.sp [prev_sp]是使用标号,类似以前的%1,这里使用字符串标记参数
45"movl %[next_sp],%%esp\n\t"   //把下一个进程的栈顶放到esp寄存器里面,从这开始,所有的压栈都是在next进程里面了
46"movl $1f,%[prev_ip]\n\t"         //保存当前进程的eip,在恢复prev当前进程的时候可以从这里开始恢复
47"pushl %[next_ip]\n\t"              //把next进程起点也就是IP的位置压栈,这里是压到next进程的堆栈,next进程的栈顶就是他的起点。
48__switch_canary
49"jmp __switch_to\n"                //不同于call调用函数
用寄存器传递参数
50"1:\t"                                      //从这才开始执行next进程第一条语句,以上的语句是很模糊的,属于哪个进程还不好说,但从45行之后就已经在next进程中压栈了。
51"popl % ebp\n\t"
52"popfl\n"
55     : [prev_sp] "=m" (prev->thread.sp),//当前进程,因为中断内部在内核态,sp内核堆栈顶。                                                                             56       [prev_ip] "=m" (prev->thread.ip),//thread.ip当前进程的eip
57"=a" (last),
59
60"=b" (ebx), "=c" (ecx), "=d" (edx),
61"=S" (esi), "=D" (edi)    
63__switch_canary_oparam
66     : [next_sp]  "m" (next->thread.sp),//input:next->thread.sp下一个进程内核堆栈栈顶
67       [next_ip]  "m" (next->thread.ip),//next->thread.ip下一个进程执行的起点
70       [prev]     "a" (prev),
71       [next]     "d" (next)
73__switch_canary_iparam
75     :
76"memory");
77} while (0)

二、总结:

​Linux系统的一般执行过程分析总结:

最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程

  • 正在运行的用户态进程X
  • 发生中断——save cs:eip/esp/eflags(current) to kernel stack(用户态进程x的内核堆栈),then load cs:eip(entry of a specific ISR当前对应的中断服务历程的起点) and ss:esp(point to kernel stack)(当前进程内核堆栈的信息)
  • SAVE_ALL //保存现场
  • 中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换
  • 标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
  • restore_all //恢复现场
  • iret pop cs:eip/ss:esp/eflags from kernel stack(Y进程在发生中断时保存到堆栈里面的)
  • 继续运行用户态进程Y

Linux内核分析第八周——进程的切换和系统的一般执行过程的更多相关文章

  1. 20135327郭皓--Linux内核分析第八周 进程的切换和系统的一般执行过程

    第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 不同类型的进程有不同的调度需求 第一种分类: I/O-bound:频繁进行I/O ...

  2. Linux内核设计第八周 ——进程的切换和系统的一般执行过程

    Linux内核设计第八周 ——进程的切换和系统的一般执行过程 第一部分 知识点总结 第二部分 实验部分 1.配置实验环境,确保menu内核可以正常启动 2.进入gdb调试,在shedule和conte ...

  3. 《Linux内核》第七周 进程的切换和系统的一般执行过程 20135311傅冬菁

    进程的切换和系统的一般执行过程 一.内容总结与分析 进程调度与进程调度时机 进程调度需求的分类: 第一种分类方式: I/O -bound(频繁进行I/O,通常会花很多时间等待I/O操作) CPU-bo ...

  4. Linux内核及分析 第八周 进程的切换和系统的一般执行过程

    学习笔记: 一.进程调度与进程调度的时机分析 1.不同类型的进程有不同需求的调度需求: 第一种分类: —I/O-bound:频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 —CPU-boun ...

  5. 《Linux内核分析》第八周 进程的切换和系统的一般执行过程

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK EIGHT ...

  6. Linux内核分析——第八周学习笔记20135308

    第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 (1)进程分类 第一种分类 I/O-bound:等待I/O CPU-bound: ...

  7. 《Linux内核分析》 第八节 进程的切换和一般的执行过程

    张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第八 ...

  8. 20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程

    第八周 进程的切换和系统的一般执行过程 一.进程切换关键代码switch_to 1.不同类型进程有不同调度需求--两种分类 2.调度策略--规则 Linux中进程优先级是动态的,周期性调整. 3.时机 ...

  9. Linux 第八周实验 进程的切换和系统的一般执行过程

    姬梦馨 原创作品 <Linux内核分析>MOOC课程:http://mooc.study.163.com/course/USTC-1000029000 第八讲 进程的切换和系统的一般执行过 ...

随机推荐

  1. 【LeetCode算法题库】Day7:Remove Nth Node From End of List & Valid Parentheses & Merge Two Lists

    [Q19] Given a linked list, remove the n-th node from the end of list and return its head. Example: G ...

  2. 下一个时代的发展架构竟然是它!FaaaaaaaaS到底是个啥?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云serverless团队发表于云+社区专栏 导读:2018年7月6 - 7日,一年一度的技术圈盛会ArchSummit全球架构师 ...

  3. 点击小图查看大图jQuery插件FancyBox魔幻灯箱

    今日发现一个不错的JQuery插件FancyBox,也许早就有这个插件了,但是没名字,我就暂且叫他魔幻灯箱吧,采用Mac系统的样式.网传主要有以下功能:■弹出的窗口有很漂亮的阴影效果.■关联的对象(就 ...

  4. Apache 工作模式的正确配置

       prefork work event

  5. JAVA开发环境的熟悉

    北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1352 姓名:马悦 学号:20135235 成绩: 指导教师:娄嘉鹏 实验日期:2015.4.13 实验密级: 预习程度 ...

  6. 四则运算(window窗体程序)

    我的第一个程序 忙活了半个下午做出来了,勉强可以见人,虽然还有些瑕疵,但是我也尽力了...... 我做的是一个能对0--10之间的整数进行四则运算的,题目的数据是程序自动生成的,而且程能接收用户输入的 ...

  7. 11_Java面向对象_第11天(接口、多态)_讲义

    今日内容介绍 1.接口 2.多态 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的"类". 接口只描述所应该具备的方法,并没有具 ...

  8. Enterprise Library 2.0 参考源码索引

    http://www.projky.com/entlib/2.0/Microsoft/Practices/EnterpriseLibrary/Caching/BackgroundScheduler.c ...

  9. PAT 甲级 1141 PAT Ranking of Institutions

    https://pintia.cn/problem-sets/994805342720868352/problems/994805344222429184 After each PAT, the PA ...

  10. Delphi函数的out、var等关键字的作用,和使用场景

    问题描述 Delphi函数的out.var等关键字的作用,和使用场景 Delphi函数的out.var等关键字的作用,和使用场景,我知道var是作为传值调用,但是像out这个关键字又是什么作用呢? 解 ...