20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结...

week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程

1.环境搭建:

rm menu -rf
git clone https://github.com/megnning/menu.git
cd menu
ls
make rootfs
qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd ../rootfs.img -s -S
gdb
file ../linux-3.18.6/vmlinux
target remote:1234

这一堆都是常用配置了,不赘述。

2.使用gdb跟踪分析一个schedule()函数

首先设置几个断点,分别是schedule, pick_next_task,context_switch,switch_to。最后一个switch_to设置失败了,我也无法定位到它,这个另外再说。
设置断点如下:
enter description here

发现一个对schdule的调用:
enter description here

schdule函数定义如下:
enter description here
__visible保证任何地方都能够调用这个函数实现进程的切换。
它首先要建立一个进程描述符,用来表示当前进程,而具体的调度过程交由__schedule()函数执行。

由这张图可以看出来,两个重要的函数context_switch和pick_next_task函数都在__schedule函数中。
enter description here

首先看到的是pick_next_task函数:
enter description here
next指针指向的是由这个函数选择出来的进程,pick_next_task函数里面封装了许多进程调度的算法,通过这个函数就能寻找出适当的下一个执行进程。内部如下:
enter description here

然后看到了context_switch函数,这个函数的功能是进程上下文切换
enter description here

关于switch_to:
switch_to是关键上下文切换的相关代码,切换堆栈和寄存器的状态,利用了prev和next两个参数:prev指向当前进程,next指向被调度的进程。
这段是汇编相关无法跟踪,我只找到了一个__switch_to的函数,这个函数的返回值应该是eax的值。
enter description here

对于switch_to的代码分析如下:

31  #define switch_to(prev, next, last)                    
32  do {                                 
33    /*                              
34     * Context-switching clobbers all registers, so we clobber  
35     * them explicitly, via unused output variables.     
36     * (EAX and EBP is not listed because EBP is saved/restored  
37     * explicitly for wchan access and EAX is the return value of   
38     * __switch_to())                     
39     */                                
40    unsigned long ebx, ecx, edx, esi, edi;                
41                                    
42    asm volatile("pushfl\n\t"      /* 保存当前进程的标志位 */   
43             "pushl %%ebp\n\t"        /* 保存当前进程的堆栈基址EBP   */ 
44             "movl %%esp,%[prev_sp]\n\t"  /* 保存当前栈顶ESP   */ 
45             "movl %[next_sp],%%esp\n\t"  /* 把下一个进程的栈顶放到esp寄存器中,完成了内核堆栈的切换,从此往下压栈都是在next进程的内核堆栈中。   */ 46             "movl $1f,%[prev_ip]\n\t"    /* 保存当前进程的EIP   */ 
47             "pushl %[next_ip]\n\t"   /* 把下一个进程的起点EIP压入堆栈   */    
48             __switch_canary                   
49             "jmp __switch_to\n"  /* 因为是函数所以是jmp,通过寄存器传递参数,寄存器是prev-a,next-d,当函数执行结束ret时因为没有压栈当前eip,所以需要使用之前压栈的eip,就是pop出next_ip。  */ 以上四行代码实际是使用next进程的进程堆栈,但是还算成prev的进程执行,内核堆栈的切换和进程切换完成并不同时间。50             "1:\t"               /* 认为next进程开始执行。 */         
51             "popl %%ebp\n\t"     /* restore EBP   */    
52             "popfl\n"         /* restore flags */  
53                                    
54             /* output parameters 因为处于中断上下文,在内核中prev_sp是内核堆栈栈顶prev_ip是当前进程的eip */                
55             : [prev_sp] "=m" (prev->thread.sp),     
56               [prev_ip] "=m" (prev->thread.ip),  //[prev_ip]是标号        
57               "=a" (last),                 
58                                    
59               /* clobbered output registers: */     
60               "=b" (ebx), "=c" (ecx), "=d" (edx),      
61               "=S" (esi), "=D" (edi)             
62                                         
63               __switch_canary_oparam                
64                                    
65               /* input parameters: next_sp下一个进程的内核堆栈的栈顶next_ip下一个进程执行的起点,一般是$1f,对于新创建的子进程是ret_from_fork*/                
66             : [next_sp]  "m" (next->thread.sp),        
67               [next_ip]  "m" (next->thread.ip),       
68                                         
69               /* regparm parameters for __switch_to(): */  
70               [prev]     "a" (prev),              
71               [next]     "d" (next)               
72                                    
73               __switch_canary_iparam                
74                                    
75             : /* reloaded segment registers */           
76            "memory");                  
77  } while (0)

简而言之,原理如下:

schedule()函数选择一个新的进程来运行:

使用pick_next_task内部封装的调度算法执行选择
并调用context_switch进行上下文的切换
context_switch又调用switch_to来进行关键上下文切换
switch_to切换堆栈和寄存器的状态,利用了prev和next两个参数:
prev指向当前进程,next指向被调度的进程。

3.学习笔记

请走链接 学习笔记

转载于:https://www.cnblogs.com/20135202yjx/p/5392618.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jni技术_JNI技术简介

JNI(Java Native Interface)提供一种Java字节码调用C/C的解决方案,JNI描述的是一种技术。NDK(Native Development Kit)Android NDK 是一组允许您将 C 或 C(“原生代码”)嵌入到 Android 应用中的工具,NDK描述的是工具集。 能够在 Android 应用中使用原生…

java web redis_java web redis使用(二)

上篇中已经安装好redis,然后下面就说怎么在java web中用客户端来使用regis使用jedis java客户端一:一个简单的示例代码:public static void main(String[] args) {Jedis jedis new Jedis( "147.151.240.234" , 6379 );jedis.set("foo&…

mysql 主从_搭建mysql主从并编写监控主从状态脚本

要求:两台centos7虚拟机分为主和从安装mysqlyum -y install mysql mysql-server关闭防火墙service iptables stopsetenforce 0上面的主从都做。修改主的配置文件vi /etc/my.cnf#添加server-id1log-binmysqlbinrelay-logrelays之后保存退出重启mysql服务service …

Java核心技术点之动态代理

本篇博文会从代理的概念出发,介绍Java中动态代理技术的使用,并进一步探索它的实现原理。由于个人水平有限,叙述中难免出现不清晰或是不准确的地方,希望大家可以指正,谢谢大家:) 一、概述 1. 什么…

shell入门之expr的使用

在expr中加减乘除的使用,脚本例如以下: #!/bin/sh #a test about expr v1expr 5 6 echo "$v1" echo expr 3 5 echo expr 6 / 2 echo expr 9 \* 5 echo expr 9 - 6 执行效果 转载于:https://www.cnblogs.com/bhlsheji/p/5401458.html

java中子线程与主线程通信_Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息...

之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码:packagecn.lixyz.handlertest;…

java开源笔记软件下载_开发常用软件笔记 - ZhaoQian's Blog - OSCHINA - 中文开源技术交流社区...

notepad使用快捷键CtrlH打开“替换对话框”,在每行的开头添加内容。 勾选左下角的“正则表达式”选项 在“查找目标”里输入上尖号“^”,上尖号代表每行的开头 在“替换为”里输入“private String”。然后点"全部替换"按钮,这样每…

极光推送指定用户推送_App用户都睡着了?是时候用推送和活动唤醒一波了!

想要运营好一款App,引流、留存、促活三大环节必不可少。引流解决了用户来的问题,留存解决了用户留下来的问题,而促活解决的是让一部分新注册用户以及许久没有动静的老用户,在平台中再次活跃起来。今天,我们就来聊聊关于…

oracle awr报告生成_分享AWR报告的生成和简单分析方法

生成AWR报告方法:第一步:数据库压力测试卡开始时:生成第一个快照:Sql>exec dbms_workload_repository.create_snapshot();第二步:数据库压力测试结束时:生成第二个快照Sql>exec dbms_workload_reposi…

安卓开发 登录用户信息缓存_在Linux上使用finger命令查询登录用户信息

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言本文主要讲解finger命令的作用和日常使用案例。finger命令是一个用户信息查询命令,它给出了所有登录用户的详细信息。…

POJ 1065 Wooden Sticks

http://blog.csdn.net/acdreamers/article/details/7626671 学习一下Dilworth定理 推荐一篇写得很好博客 要求最少的覆盖&#xff0c;按照Dilworth定理 最少链划分 最长反链长度 所以最少系统 最长导弹高度上升序列长度。 之前写的LIS模板不对。。。。。。 1 #include<cst…

python 对象_Python小课堂面向对象

Python3 面向对象Python从设计之初就已经是一门面向对象的语言&#xff0c;正因为如此&#xff0c;在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。如果你以前没有接触过面向对象的编程语言&#xff0c;那你可能需要先了解一些面向对象语言…

使用jemalloc优化java_Jemalloc优化MySQL和Nginx

Redis 2.4版本之后&#xff0c;默认使用jemalloc来做内存管理&#xff1b;tengine也整合jemalloc。jemalloc从各方评测的结果可见与google tcmalloc都不相伯仲&#xff0c;皆为内存管理器领域最高水平。如下图&#xff1a;最左边的就是glibc的malloc&#xff0c;最右边的就是je…

【代码升级】【iCore3 双核心板】例程二十八:FSMC实验——读写FPGA

实验指导书及代码包下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1i6WL51V 密码&#xff1a;1mk4 iCore3 购买链接&#xff1a; https://item.taobao.com/item.htm?id524229438677 转载于:https://www.cnblogs.com/xiaomagee/p/5409024.html

sqlserver连接字符串_【自学C#】|| 笔记 39 SQL server 连接数据库

一、ADO.NET数据库操作 任何一个应用程序都离不开数据的存储&#xff0c;数据可以在内存中存储&#xff0c;但只能在程序运行时存取&#xff0c;无法持久保存。数据还可以在磁盘中以文件的形式存储&#xff0c;但文件的管理和查找又十分烦琐无法胜任大数量的存储。将数据存储…

Android Studio、 补充知识以及主要组件

转载于:https://www.cnblogs.com/arxk/p/5410597.html

using(){},Close(),Dispose()的区别

//用Close(),Dispose()方式关闭连接 string connString "Data Source(local);Initial CatalogLinq;Integrated SecuritySSPI"; SqlConnection conn new SqlConnection(connString); conn.Open(); conn.Close(); conn.Dispose();//用using方式关闭连接 string connS…

一个域名解析到另一个域名_注册域名公司|教你如何注册一个.net域名

近几年各后缀域名注册量都在增加&#xff0c;很多行业知道线上业务平台搭建的重要性&#xff0c;都优先制作网站布局线上&#xff0c;建站肯定需要域名&#xff0c;所以这也是带动域名注册量上涨原因之一。.COM、.NET域名一直是建站注册域名首选&#xff0c;.COM域名大家可能相…

java jedis connect timed out_Java连接Redis connection timed out 报错的解决方法

Java连接Redis connection timed out 报错的解决方法踩坑场景在使用 RedisTemplate 连接 Redis 进行操作的时候&#xff0c;发生了如下报错&#xff1a;报错信息如下&#xff1a;Caused by: io.netty.channel.ConnectTimeoutException: connection timed out: /192.168.73.10:6…

富文本存储型XSS的模糊测试之道

富文本存储型XSS的模糊测试之道 凭借黑吧安全网漏洞报告平台的公开案例数据&#xff0c;我们足以管中窥豹&#xff0c;跨站脚本漏洞&#xff08;Cross-site Script&#xff09;仍是不少企业在业务安全风险排查和修复过程中需要对抗的“大敌”。 XSS可以粗分为反射型XSS和存储型…