Linux内核分析第八周——进程的切换和系统的一般执行过程
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内核分析第八周——进程的切换和系统的一般执行过程的更多相关文章
- 20135327郭皓--Linux内核分析第八周 进程的切换和系统的一般执行过程
第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 不同类型的进程有不同的调度需求 第一种分类: I/O-bound:频繁进行I/O ...
- Linux内核设计第八周 ——进程的切换和系统的一般执行过程
Linux内核设计第八周 ——进程的切换和系统的一般执行过程 第一部分 知识点总结 第二部分 实验部分 1.配置实验环境,确保menu内核可以正常启动 2.进入gdb调试,在shedule和conte ...
- 《Linux内核》第七周 进程的切换和系统的一般执行过程 20135311傅冬菁
进程的切换和系统的一般执行过程 一.内容总结与分析 进程调度与进程调度时机 进程调度需求的分类: 第一种分类方式: I/O -bound(频繁进行I/O,通常会花很多时间等待I/O操作) CPU-bo ...
- Linux内核及分析 第八周 进程的切换和系统的一般执行过程
学习笔记: 一.进程调度与进程调度的时机分析 1.不同类型的进程有不同需求的调度需求: 第一种分类: —I/O-bound:频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 —CPU-boun ...
- 《Linux内核分析》第八周 进程的切换和系统的一般执行过程
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK EIGHT ...
- Linux内核分析——第八周学习笔记20135308
第八周 进程的切换和系统的一般执行过程 一.进程切换的关键代码switch_to分析 1.进程调度与进程调度的时机分析 (1)进程分类 第一种分类 I/O-bound:等待I/O CPU-bound: ...
- 《Linux内核分析》 第八节 进程的切换和一般的执行过程
张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第八 ...
- 20135337朱荟潼 Linux第八周学习总结——进程的切换和系统的一般执行过程
第八周 进程的切换和系统的一般执行过程 一.进程切换关键代码switch_to 1.不同类型进程有不同调度需求--两种分类 2.调度策略--规则 Linux中进程优先级是动态的,周期性调整. 3.时机 ...
- Linux 第八周实验 进程的切换和系统的一般执行过程
姬梦馨 原创作品 <Linux内核分析>MOOC课程:http://mooc.study.163.com/course/USTC-1000029000 第八讲 进程的切换和系统的一般执行过 ...
随机推荐
- String字符串的方法
String字符串在Java开发中是我们常用的一种数据类型,同时String字符串也为我们提供了大量的方法.通过一些实例的练习,我们可以对String字符串的方法有一个比较清楚的了解. 有一个字符串S ...
- golang应用打包成docker镜像
golang编译的应用是不需要依赖其他运行环境的,那么为什么还需要打包成docker镜像呢?当需要附带配置和日志等文件时可以更方便的移植和运行,下面介绍从dockerfile编译成镜像. 在项目根目录 ...
- 安装keystone时创建用户失败
系统:centos7.3 版本:openstack ocata 1.问题描述 安装keystone在创建用户时报错: The request you have made requires authen ...
- dvwa学习笔记之xss
反射型Low 直接输入<script>alert(/xss/)</script>就可以发现弹窗Medium 检查源码 可以看到网站对输入字符进行了过滤,尝试双写绕过,构造< ...
- swapon和swapoff命令详解
基础命令学习目录首页 原文链接:https://blog.csdn.net/yexiangCSDN/article/details/83182259 swapon命令用于激活Linux系统中交换空间, ...
- Tornado之笔记集合
目录 一.基本使用 二.路由系统 三.视图函数 四.模版语言 五.cookie 六.CSRF 七.文件上传 八.异步非阻塞 九.RESTFUL 十.自定义组件 一.基本使用 1.最简使用 import ...
- Daily Scrum 11.18
今日完成任务: 1.在提问问题的时候为问题创建索引 2.解决了修改个人资料后刷新没有更新的问题 3.初步加入了采纳功能(没完善UI设计) 遇到困难:创建索引之后,跳转到主页,需要重新登录,找了半天不知 ...
- c# combobox向上展开
1.问题情境:实际中的下拉框默认向下扩展,如果屏幕下方空间不足,会向上扩展. 向下扩展情况下,有时候会超出form窗体. 2.解决办法: 寻找相关属性无果. 退而求其次,重画item的框.发现Draw ...
- 关于rand()函数 转载于其他人
C++中的rand()函数 分类: 编程语言/ C#/ 文章 C++中产生随机数种子对于初学者一直都很困惑.大家知道,在C中有专门的srand(N)函数可以轻松实现这一功能,然而在C++中则要复杂一些 ...
- xml命名空间
https://yq.aliyun.com/articles/40353 ************************************* 摘要: 相信很多人和我一样,在编写Spring或者 ...