lab5:深入理解进程切换

这篇具有很好参考价值的文章主要介绍了lab5:深入理解进程切换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要分析 Linux 5.4.34 版本内核中进程切换的基本操作与基本代码框架。

一、进程切换的工作机制

    在实际的代码中,每个进程切换基本都由两个步骤组成,即切换页全局目录以安装一个新的地址空间以及切换内核态堆栈和进程cpu上下文。
  具体的代码走向如下:schedule()函数选择一个新的进程来运行,并调用context_switch进行上下文的切换。context_switch首先调用switch_mm切换CR3,然后调用宏switch_to来进行CPU上下文切换。

content_switch 函数位于 Linux 内核源码目录的 kernel/sched/core.c 中,代码如下:
lab5:深入理解进程切换
lab5:深入理解进程切换

content_switch 函数有三个参数:rq、prev、next,其中 rq 指向本次进程切换发生的 进程就绪队列;prev 和 next 分别指向切换前后进程的进程描述符。下面我们来分析一下具体的执行过程。

看代码可知,首先执行的是prepare_task_switch函数,该函数需要在进程切换之前调用,内核会执行与体系结构相关的一些调测指令。上下文切换完成后,必须调用 finish_task_switch,即这两个函数一定是要成对出现的。

然后是arch_start_context_switch()函数,该函数给各个体系结构专有的开始上下文切换的工作提供了入口,在不同的体系结构中其实现是不同的。

在本函数的主体部分(上述if-else部分)实现了进程地址空间切换过程,这里prev是进程切换之前的进程,next是进程切换后要执行的进程,mm是进程的地址空间描述符。

  • 这里首先判断next进程mm是否为空,如果为空的话,说明是内核级线程(否则就是用户进程),如果是内核级线程的话需要调用enter_lazy_tlb,标记cpu内核进入了lazy tlb mode(这里查阅了资料应该是为了减少切换上下文时不必要的TLB更新,CPU进入该模式后不对TLB进行更新)。然后地址空间不用更改,如果之前的是用户进程,则引用计数增加1个,如果之前的进程是内核级线程,则需要把原来的进程的active_mm清空,结束对mm_struct的借用。

  • 如果next->mm不为空,即要切换到的进程为用户进程。首先调用membarrier_switch_mm函数来建立了一个内存屏障,来保证上一个进程访问其内存空间与下一个进程访问内存空间之前的一个先后顺序(其实就是一个进程同步),避免在访存时出现访存错误;然后是执行switch_mm_irqs_off函数,即真正切换 mm_struct;最后如果切换前的进程是内核进程,则需要设置一些东西来用于后续清除引用计数。

    最后面就是switch_to函数,即切换寄存器状态和栈,switch_to会进一步调用__switch_to_asm,而 __switch_to_asm 的实现是和体系结构强相关的。

二、sp和ip在不同体系及结构下汇编代码的切换方法

__switch_to_asm是在C代码中调用的,也就是使用call指令,而这段汇编的结尾是jmp __switch_to,__switch_to函数是C代码最后有个return,也就是ret指令。 将__switch_to_asm和__switch_to结合起来,正好是call指令和ret指令的配对出现。 call指令压栈RIP寄存器到进程切换前的prev进程内核堆栈;而ret指令出栈存入RIP寄存器的是进程切换之后的next进程的内核堆栈栈顶数据.
lab5:深入理解进程切换

然后下面是arm64下的代码

lab5:深入理解进程切换

arm64 也没有显式保存和恢复程序计数器 PC 的值,这和 x86_64 的处理方法是大同小异的,也是通过函数调用堆栈的特性来巧妙解决这一问题。文章来源地址https://www.toymoban.com/news/detail-454045.html

到了这里,关于lab5:深入理解进程切换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络攻防技术-Lab5-shellcode编写实验(SEED Labs – Shellcode Development Lab)

    网络攻防技术实验,实验环境、实验说明、实验代码见 Shellcode Development Lab 1) 编译mysh.s得到二进制文件 2) 执行 1)中的二进制文件 ,结果如下图, 我们 看到运行mysh之前的PID与运行mysh之后的PID是不同的,证明我们通过mysh启动了一个新的shell。 3) 获取机器码,以便进一步

    2023年04月13日
    浏览(29)
  • 《深入理解计算机系统》Lab2-Bomblab

    这篇文章主要记录了我做bomblab的过程,希望能给你一些灵感 本次实验为 熟悉汇编程序 及其 调试方法 的实验。 实验内容包含2个文件:bomb(可执行文件)和bomb.c(c源文件)。 实验主题内容为: 程序运行在linux环境中。程序运行中有6个关卡(6个phase),每个phase需要用户在

    2024年02月04日
    浏览(32)
  • 【Linux】关于进程的理解、状态、优先级和进程切换

    进程不同的状态本质都是在满足不同的运行场景的 1.运行队列 运行队列 进程如何在CPU上运行的:CPU在内核上维护了一个运行队列,进行进程的管理。让进程入队列,本质就是将该进程的task_struct 结构体对象放入运行队列之中。 2.运行状态 运行状态 进程PCB在运行队列里就是运

    2024年02月04日
    浏览(33)
  • 6.s081/6.1810(Fall 2022)Lab5: Copy-on-Write Fork for xv6

    本来往年这里还有个Lazy Allocation的,今年不知道为啥直接给跳过去了。. 环境搭建 Lab1: Utilities Lab2: System calls Lab3: Page tables Lab4: Traps Lab5: Copy-on-Write Fork for xv6 官网链接 xv6手册链接,这个挺重要的,建议做lab之前最好读一读。 xv6手册中文版,这是几位先辈们的辛勤奉献来的呀!

    2024年02月14日
    浏览(25)
  • 【Linux】Linux进程的理解 --- 冯诺依曼体系、进程描述符、状态、优先级、切换…

    如果不改变自己,就别把跨年搞的和分水岭一样,记住你今年是什么吊样,明年就还会是什么吊样!!! 1.冯诺依曼体系结构中的存储器指的是内存,带电存储,具有掉电易失的特点。 2.CPU中含有能够解释计算机指令的指令集,指令集又可分为精简指令集和复杂指令集,这也

    2024年01月25日
    浏览(40)
  • 【云原生-深入理解 Kubernetes 系列 3】深入理解容器进程的文件系统

    【云原生-深入理解Kubernetes-1】容器的本质是进程 【云原生-深入理解Kubernetes-2】容器 Linux Cgroups 限制 大家好,我是秋意零。 😈 CSDN作者主页 😎 博客主页 👿 简介 👻 普通本科生在读 在校期间参与众多计算机相关比赛,如:🌟 “省赛”、“国赛” ,斩获多项奖项荣誉证书

    2024年02月06日
    浏览(39)
  • 【Linux】深入理解进程概念

    个人主页:🍝在肯德基吃麻辣烫 我的gitee:Linux仓库 个人专栏:Linux专栏 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处 本篇文章继上一篇的冯诺依曼体系结构和操作系统这两个软硬件的概念之后,开始讲解Linux下 三座大山 之一的 进程 。 因为进程概念虽然不是

    2024年02月14日
    浏览(24)
  • 【从零学习python 】84.深入理解线程和进程

    进程,能够完成多任务,比如在一台电脑上能够同时运行多个QQ。 线程,能够完成多任务,比如一个QQ中的多个聊天窗口。 进程是系统进行资源分配和调度的一个独立单位。 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程

    2024年02月11日
    浏览(32)
  • 【云原生-深入理解Kubernetes-1】容器的本质是进程

    大家好,我是秋意零。 😈 CSDN作者主页 😎 博客主页 👿 简介 👻 普通本科生在读 在校期间参与众多计算机相关比赛,如:🌟 “省赛”、“国赛” ,斩获多项奖项荣誉证书 🔥 各个平台, 秋意零/秋意临 账号创作者 🔥 云社区 创建者 点赞、收藏+关注下次不迷路! 欢迎加

    2024年02月02日
    浏览(46)
  • 【多线程系列-01】深入理解进程、线程和CPU之间的关系

    多线程系列整体栏目 内容 链接地址 【一】深入理解进程、线程和CPU之间的关系 https://blog.csdn.net/zhenghuishengq/article/details/131714191 【二】java创建线程的方式到底有几种?(详解) https://blog.csdn.net/zhenghuishengq/article/details/127968166 【三】深入理解java中线程的生命周期,任务调度 ht

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包