Linux内核分析作业第八周

进程的切换和系统的一般执行过程

一、进程调度的时机

  • 中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();

  • 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;

  • 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。

 

二、进程的切换

  • 为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换、任务切换、上下文切换;

  • 挂起正在CPU上执行的进程,与中断时保存现场是不同的,中断前后是在同一个进程上下文中,只是由用户态转向内核态执行;

  • 进程上下文包含了进程执行需要的所有信息

    • 用户地址空间:包括程序代码,数据,用户堆栈等

    • 控制信息:进程描述符,内核堆栈等

    • 硬件上下文(注意中断也要保存硬件上下文只是保存的方法不同)

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

    • next = pick_next_task(rq, prev);//进程调度算法都封装这个函数内部
    • context_switch(rq, prev, next);//进程上下文切换
    • switch_to利用了prev和next两个参数:prev指向当前进程,next指向被调度的进程

 

31#define switch_to(prev, next, last)                    \
32do {                                    \
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。 */
50             "1:\t"                 /* 认为next进程开始执行。 */ 
51             "popl %%ebp\n\t"        /* restore EBP   */    \
52             "popfl\n"            /* restore flags */    \
53             /* output parameters 因为处于中断上下文,在内核中 prev_sp是内核堆栈栈顶 prev_ip是当前进程的eip */                        \
54             /* output parameters */                \
55             : [prev_sp] "=m" (prev->thread.sp),        \
56               [prev_ip] "=m" (prev->thread.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: */                \
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)

 

三、Linux系统的一般执行过程

 

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

  1. 正在运行的用户态进程X

  2. 发生中断——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).

  3. SAVE_ALL //保存现场

  4. 中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换

  5. 标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)

  6. restore_all //恢复现场

  7. iret - pop cs:eip/ss:esp/eflags from kernel stack

  8. 继续运行用户态进程Y

 

2、几种特殊情况

  • 通过中断处理过程中的调度时机,用户态进程与内核线程之间互相切换和内核线程之间互相切换,与最一般的情况非常类似,只是内核线程运行过程中发生中断没有进程用户态和内核态的转换;
  • 内核线程主动调用schedule(),只有进程上下文的切换,没有发生中断上下文的切换,与最一般的情况略简略;
  • 创建子进程的系统调用在子进程中的执行起点及返回用户态,如fork;
  • 加载一个新的可执行程序后返回到用户态的情况,如execve;

四、Linux操作系统架构和系统执行过程概览


1、操作系统基本概念

任何计算机系统都包含一个基本的程序集合,称为操作系统。

  • 内核(进程管理,进程调度,进程间通讯机制,内存管理,中断异常处理,文件系统,I/O 系统,网络部分)
  • 其他程序(例如函数库、shell程序、系统程序 等等)


操作系统的目的

  • 与硬件交互,管理所有的硬件资源
  • 为用户程序(应用程序)提供一个良好的执行环境

2、Linux系统架构

  • 硬件管理
  • 内核实现
  • 系统调用
  • 基础软件(shell、lib)
  • 用户程序


3、最简单也是最复杂的操作ls

 

4、站在CPU和内存角度看Linux系统的执行

 

5、从内存的角度

五、Linux的系统结构

六、用gdb对schedule进行

1、环境搭建:

 

2、设置断点

3、list查看断点所在代码段,发现schedule()被调用

4、c之后按n单步执行,直到遇到__schedule函数

 

5、继续执行,直到发现context_switch函数

6、继续单步执行,直到发现context_switch函数

 

7、设置断点后,进入其内部查看

转载于:https://www.cnblogs.com/20135231hj/p/5379217.html

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

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

相关文章

iOS--数据存储NSUserDefaults

2019独角兽企业重金招聘Python工程师标准>>> 今天去面试,被问道NSUserDefaults的存取并手写出来,一时想不起来,回来之后看看之前的笔记,稍作一些整理 NSUserDefaults是一个单例,在整个程序中只有一个实例对…

巨人肩膀_如何站在巨人的肩膀上

巨人肩膀“If I have seen further than others, it is by standing on the shoulders of giants.” — Isaac Newton“如果我能比其他人看到更多,那就是站在巨人的肩膀上。” —艾萨克牛顿 In 1676, Isaac Newton spoke of the great thinkers who came before him…

mysql 触发器定义变量_MySQL 函数存储过程触发器定义简单示例

1.变量提示NEW 是新值-- OLD 是旧值INSERT 只有NEW ----UPDATE有NEW和OLD ---DELETE只有OLD2.准备测试表(userinfo、userinfolog)use test;create table userinfo(userid int,username varchar(10),userbirthday date);create table userinfolog(logtime datetime,loginfo varc…

[EOJ439] 强制在线

Description 见EOJ439 Solution 先考虑不强制在线怎么做。 按询问区间右端点排序&#xff0c;从左往右扫&#xff0c;维护所有后缀的答案。 如果扫到 \(a[i]\)&#xff0c;那么让统计个数的 \(cnt[a[i]]\). 如果\(cnt[a[i]]<a[i]\)&#xff0c;那么在当前的右端点固定的情况…

大数据 就业 缺口_中国AI&大数据就业趋势报告:平均月薪超2万,缺口650万人...

2019世界人工智能大会开幕式上&#xff0c;特斯拉公司联合创始人兼首席执行官Elon Musk 和中国企业家俱乐部主席、联合国数字合作高级别小组联合主席马云进行了一场“双马”对话。谈到人工智能话题时&#xff0c;马斯克认为&#xff0c;“未来的科技发展变化将超越我们的能力”…

Android pm 命令详解

一、pm命令介绍与包名信息查询 1.pm命令介绍 pm工具为包管理&#xff08;package manager&#xff09;的简称 可以使用pm工具来执行应用的安装和查询应用宝的信息、系统权限、控制应用 pm工具是Android开发与测试过程中必不可少的工具&#xff0c;shell命令格式如下&#xff1a…

开源 非开源_开源为善

开源 非开源by Michael D. Johnson迈克尔约翰逊(Michael D.Johnson) 开源为善 (Open Source for Good) We’ve spent two years coding for a cause, one nonprofit at a time. And now Free Code Camp’s pushing ahead to help organizations at scale.我们花了两年的时间为…

mysql5.6热升级_Mysql5.6主从热备配置

数据库是应用系统的核心&#xff0c;为了保证数据库的安全采用主从热备是很常见的方法&#xff0c;也就是主数据库DDL、DML都将被同步到从数据库。一、 实验环境操作系统&#xff1a;windowsserver 2008 R2数据库&#xff1a;mysql-advanced-5.6.21-winx64二、 准备工作1、…

InfluxDB(官方使用说明)

安装InfluxDB OSS 此页面提供有关安装&#xff0c;启动和配置InfluxDB的说明。 InfluxDB OSS安装要求 root为了成功完成&#xff0c;需要安装InfluxDB软件包或具有管理员权限。 InfluxDB OSS网络端口 InfluxDB默认使用以下网络端口&#xff1a; TCP端口8086用于通过InfluxDB的H…

incc与oracle连接_Oracle 连接和会话的区别

连接并不是会话的同义词&#xff0c;发现这一点时很多人都很诧异。在大多数人眼里&#xff0c;它们都是一样的&#xff0c;但事实上并不一定如此。在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的&#xff0c;即使它们共享同一条数据库物理连接也是如此。一…

CodeForces 176B Word Cut(DP)

题意&#xff1a;给你a串和b串&#xff0c;你能切k次&#xff0c;每次切完将尾部分放在头的前面&#xff0c;问有多少种方案切k次从a串变为b串 思路&#xff1a;令dp[i][0]为砍了i次变成b串的方案数&#xff0c;dp[i][1]为砍了i次变成非b串的方案数&#xff0c;然后预处理一下前…

如何将React App转换为React Native

I have been working on a lot of mobile projects lately — including Cordova, PhoneGap, React Native, some Ionic and Swift — but I have to say, React Native is by far the best experience in mobile development I have had so far. It has great, web-like d…

HTTP状态码:400\500 错误代码

转自&#xff1a;http://blog.sina.com.cn/s/blog_59b052fa0100it74.html一些常见的状态码为&#xff1a;200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解&#xff1a;1xx&#xff08;临时响应&#xff09;表示临时响应并需要请求者继续执行操作的状态…

dhcp服务

安装与配置 配置文件 修改配置文件 复制这个文件到另一端 打开另一端的配置文件 原端输入这些命令可以去掉英文 然后vim进入另一端配置文件 全局配置不在{}内的 分发范围是指哪个ip到哪个ip的范围 指定固定电脑获取固定位置 原端修改配置文件 下面进行启动dhcp 克隆一台虚拟机&…

python数据结构与算法40题_Python数据结构与算法40:递归编程练习题3:ASCII谢尔宾斯基地毯...

注&#xff1a;本文如涉及到代码&#xff0c;均经过Python 3.7实际运行检验&#xff0c;保证其严谨性。本文阅读时间约为7分钟。递归编程练习题3&#xff1a;ASCII谢尔宾斯基地毯谢尔宾斯基地毯谢尔宾斯基地毯是形如上图的正方形分形图案&#xff0c;每个地毯可分为等大小的9份…

使用Python发送电子邮件

by Arjun Krishna Babu通过Arjun Krishna Babu 如何使用Python发送电子邮件 (How to send emails using Python) As a learning exercise, I recently dug into Python 3 to see how I could fire off a bunch of emails. There may be more straightforward methods of doing…

此blog不更了

1转载于:https://www.cnblogs.com/ybai62868/p/5384097.html

Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart)

在接触WebService时值得收藏的一篇文章&#xff1a; 在调试Axis1.4访问WebService服务时&#xff0c;出现以下错误&#xff1a; Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart) 有错误找到错误原因以及发现值得收藏的…

java遍历树结构数据_Java数据结构——二叉树的遍历(汇总)

二叉树的遍历分为深度优先遍历(DFS)和广度优先遍历(BFS)DFS遍历主要有&#xff1a;前序遍历中序遍历后序遍历一、递归实现DFSNode.java:public class Node {private Object data;Node richild;Node lechild;public Object getData() {return data;}public void setData(Object …

vue 移动端头像裁剪_使用vue-cropper裁剪正方形上传头像-阿里云开发者社区

引用方式在组件内使用import { VueCropper } from vue-croppercomponents: {VueCropper,},main.js里面使用import VueCropper from vue-cropperVue.use(VueCropper)基本使用方法ref"cropper":img"option.img":autoCrop"true":fixedNumber"[…