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

一、学习总结

  1. Linux系统的一般执行过程:

    最一般的情况:正在运行的用户态进程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. Linux系统执行过程中的几个特殊情况:

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

        (1)中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule();
    (2)内核线程(只有内核态没有用户态的特殊进程)可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度;
    (3)用户态进程无法实现主动调度,只能被动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。
  4. schedule()函数分析:

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

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


二、实验过程和分析

  1. 搭建实验环境;

  2. gdb调试;

  3. 设置断点;

  4. 单步执行





  5. switch_to代码分析

        define switch_to(prev, next, last)
    do {
    unsigned long ebx, ecx, edx, esi, edi; asm volatile("pushfl\n\t" /* save flags */ //保存当前进程的flags
    "pushl %%ebp\n\t" /* save EBP */ //把当前进程的堆栈基址压栈
    "movl %%esp,%[prev_sp]\n\t" /* save ESP */ //把当前的栈顶保存到prev->thread.sp
    "movl %[next_sp],%%esp\n\t" /* restore ESP */ //把下一个进程的栈顶保存到esp中,这两句完成了内核堆栈的切换
    "movl $1f,%[prev_ip]\n\t" /* save EIP */ //保存当前进程的EIP,可以从这恢复
    "pushl %[next_ip]\n\t" /* restore EIP */ //把下一个进程的起点位置压到堆栈,就是next进程的栈顶。next_ip一般是$1f,对于新创建的子进程是ret_from_fork
    //一般用return直接把next_ip pop出来
    __switch_canary
    "jmp __switch_to\n" /* regparm call */ //jmp通过寄存器传递参数,即后面的a,d。 函数__switch_to也有return把next_ip pop出来
    "1:\t" //认为从这开始执行next进程(EIP角度),第一条指令是next_ip这个起点,但前面已经完成内核堆栈的切换,早就是next进程的内核堆栈(算prev进程,比较模糊)
    "popl %%ebp\n\t" /* restore EBP */ //next进程曾经是prev进程,压栈过ebp
    "popfl\n" /* restore flags */ /* output parameters */
    : [prev_sp] "=m" (prev->thread.sp), //当前进程的,在中断内部,在内核态,sp是内核堆栈的栈顶
    [prev_ip] "=m" (prev->thread.ip), //当前进程的EIP
    "=a" (last), /* clobbered output registers: */
    "=b" (ebx), "=c" (ecx), "=d" (edx),
    "=S" (esi), "=D" (edi) __switch_canary_oparam /* input parameters: */
    : [next_sp] "m" (next->thread.sp), //下一个进程的内核堆栈的栈顶
    [next_ip] "m" (next->thread.ip), //下一个进程的执行起点 /* regparm parameters for __switch_to(): */
    [prev] "a" (prev), //寄存器的传递
    [next] "d" (next) __switch_canary_iparam : /* reloaded segment registers */
    "memory");} while (0)

三、总结

  1. Linux进程调度是基于分时和优先级的。
  2. Linux中,内核线程是只有内核态没有用户态的特殊进程。
  3. 内核可以看作各种中断处理过程和内核线程的集合。
  4. Linux系统的一般执行过程 可以抽象成正在运行的用户态进程X切换到运行用户态进程Y的过程。
  5. Linux中,内核线程可以主动调度,主动调度时不需要中断上下文的切换。
  6. Linux内核调用schedule()函数进行调度,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换。

2019-2020-1 20199318《Linux内核原理与分析》第九周作业的更多相关文章

  1. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

  2. 20169219 linux内核原理与分析第二周作业

    "linux内核分析"的第一讲主要讲了计算机的体系结构,和各寄存器之间对数据的处理过程. 通用寄存器 AX:累加器 BX:基地址寄存器 CX:计数寄存器 DX:数据寄存器 BP:堆 ...

  3. 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业

    1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...

  4. Linux内核原理与分析-第一周作业

    本科期间,学校开设过linux相关的课程,当时的学习方式主要以课堂听授为主.虽然老师也提供了相关的学习教材跟参考材料,但是整体学下来感觉收获并不是太大,现在回想起来,主要还是由于自己课下没有及时动手实 ...

  5. 2019-2020-1 20199314 <Linux内核原理与分析>第一周作业

    前言 本周对实验楼的Linux基础入门进行了学习,目前学习到实验九完成到挑战二. 学习和实验内容 快速学习了Linux系统的发展历程及其简介,学习了下的变量.用户权限管理.文件打包及压缩.常用命令的和 ...

  6. Linux内核原理与分析-第二周作业

    写之前回看了一遍秒速五厘米:如果

  7. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  8. 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...

  9. 2019-2020-1 20199329《Linux内核原理与分析》第十三周作业

    <Linux内核原理与分析>第十三周作业 一.本周内容概述 通过重现缓冲区溢出攻击来理解漏洞 二.本周学习内容 1.实验简介 注意:实验中命令在 xfce 终端中输入,前面有 $ 的内容为 ...

  10. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

随机推荐

  1. 关于JMeter WebSocket插件:JMeter WebSocket插件-关闭SignalR连接--webSocket Close报错

    在浦发银行的项目中,主机运维连接成功不做任何操作的场景中,用到了webSocket协议,但是脚本运行中出现webSocke Close报错--解决方案:在webSocket Open Connecti ...

  2. CentOS 7 yum安装MongoDB

    1.配置MongoDB的yum源 cd /etc/yum.repos.d vim mongodb-org-6.0.repo 2.添加下载配置文件(这里使用阿里云的源),保存退出 [mngodb-org ...

  3. Pycharm去除白色波浪线

  4. Codeforces Round #827 (Div. 4) 复盘+题解

    原比赛链接 复盘: ABC签到,手速太慢了. D捣鼓了好久才想起来从更小的值域出发去做. E简单二分答案. 然后就time out了.D题搞错方向浪费太久时间了. F思维题,考虑到初值.字符集,然后是 ...

  5. 「DIARY」NOI2021 小结

    这篇就主要说一下个人感悟吧,虽然不是金牌选手,但还是希望多多少少能对后来者提供些帮助 1. 预备 省选到 NOI 的准备,就当讲讲故事. 省选考下来好像不是很行,本来退役记都写了一半了,结果发现省队最 ...

  6. nginx status code 状态码

    目录 1XX 临时响应并需要请求者继续执行操作的状态代码 2XX 成功功处理了请求的状态代码 3XX 重定向 要完成请求,需要进一步操作 通常用来重定向 4XX 表示请求可能出错,妨碍了服务器的处理 ...

  7. 安防视频监控系统前端摄像机——DSP与SOC摄像机

    一.DSP摄像机 DSP(Digital Signal Processing)即数字信号处理,它是利用数字计算机或专用数字信号处理设备,以数值计算的方法对信号进行采集.变换.综合.估值.识别等加工处理 ...

  8. Nginx基础篇

    目录 一.nginx基础篇 1.Nginx开源版本安装 2.Nginx的基础配置 3.虚拟主机与域名解析 4.ServerName匹配规则 5.反向代理 6.动静分离 7.location后符号的匹配 ...

  9. win10安装MAT并单独配置jdk11

    1.下载MAT 2.下载jdk11 3.配置jdk11 MAT解压后,在MemoryAnalyzer.ini配置文件开头添加配置指向jdk11,如下: -vm C:\Program Files\Jav ...

  10. 百题计划-3 codeforces 657div2 C. Choosing flowers 贪心+枚举+二分

    https://codeforces.com/contest/1379/problem/C 题意: 给m种花(a,b),从中取出n朵,每种花可以取0和无限朵,如果取出第i朵花的个数为c>0,则贡 ...