Linux内核的进程切换(上)

Linux内核下进程切换 Linux内核进程切换  本文主要参考了Understanding The LinuxKernel 和水木精华区的分析进程切换宏 switch_to 。感谢相关的作者!本文中有部分内容直接从上面提到的文章中重复,仅仅是为了方便大家阅读。本文中提到的所有内核代码可以到LinuxCross Reference上查阅。欢迎转载本文,转载请保留这份声明。      本文仅讨论内核进程的切换,而不涉 阅读详情

硬件上下文概念

尽管每个进程都可以拥有属于自己的地址空间,但所有进程必须共享CPU寄存器。因此在,在恢复一个进程执行之前,内核必须确保每个寄存器装入了挂起进程时的值。而这些必须装入的寄存器中的数据就称为硬件上下文。

任务状态段

80X86体系结构:
包括一个特殊的段类型,叫任务状态段(TSS),作用是存放硬件上下文。段是x86的概念,在保护模式下,段选择符参与寻址,段选择符在段寄存器中,而tss段则在tr寄存器中。当进程切换的时候就将

intel的建议:
为每一个进程准备一个独立的tss段,进程切换的时候切换tr寄存器使之指向该进程对应的tss段,然后在任务切换时(比如涉及特权级切换的中断)使用该段保留所有的寄存器。

Linux设计:
Linux内核并没有遵从Itel的建议为每个进程设置一个TSS,而是为每个CPU设置了一个TSS,tr寄存器保存该段。

进程切换 概念篇

按照Intel的设计思路,进程切换的硬件上下文要保存在TSS中,这是可以的,因为每个进程都有TSS,然而Linux中每个CPU有一个TSS,所有进程共享一个TSS,那么切换进程时的硬件上下文保存在哪里呢?答案是进程描述符中。在linux中,进程描述符有一个thread_struct类型的字段thread,只要进程被切换出去,内核就把硬件上下文保存在这个结构里面,这个结构里面包含了大部分的CPU寄存器,但是不不包括eax、ebx等等这些通用寄存器,它们的值放在哪里呢?自然是内核栈中啦!进程切换只发生在内核态,执行切换之前,用户进程使用的所有寄存器保存在内核堆栈中,这也包括ss和esp这对寄存器。

小总结:
执行进程切换时,硬件上下文保存在两个地方:

  1. task_struct的thread字段:这里保存了大部分的寄存器,如esp,eip。
  2. 内核态堆栈:状态寄存器、通用寄存器,如eax,ebx…

那么现在有个问题,既然Linux既然使用thread_struct保存硬件上下文,为什么要为每个CPU设计一个TSS呢?

理由有二:

  1. 当80x86的CPU从用户态切换到内核态时候需要找到内核态堆栈的地址,地址去哪里找呢?就是TSS中。进程切换时,只更新tss段中的esp0/ss0字段,使其指向新进程的内核栈。
  2. 当用户态进程师徒通过一个in或者out访问一个端口的时候,CPU需要访问存放在TSS中的I/O许可权位图已检查进程是否有访问端口的权利。

由于进程切换不更换TSS本身,也就是根本不更换TR的内容。这是因为,改变TSS中SS0和ESP0所化的开销比通过装入TR以更换一个TSS要小得多。因此,在Linux内核中,TSS并不是属于某个进程的资源,而是全局性的公共资源。在多处理机的情况下,尽管内核中确实有多个TSS,但是每个CPU仍旧只有一个TSS,并且使用init_tass数组表示多个TSS,如果有N个CPU,那么数组的长度是N。

上述理由说明了在Linux中TSS的作用。到目前为止还有2个问题没有阐述清楚,即进程切换的时候,Linux是如何更新tss的内容的?thread_struct结构体到底长什么样子?下面就来解答这些问题。

执行进程切换

从本质上说,每个进程切换由两步组成:

  1. 切换页全局目录以安装一个新的地址空间。
  2. 切换内核态堆栈和硬件上下文,因为硬件上下文提供了内核执行新进程所需要的所有信息,包括CPU寄存器。
    其中第一步是进程地址空间的内容,这里不再描述,有兴趣的可以看深入理解Linux内核的第九章,我们重点关注的是第二步,这步是由switch_to宏执行,切换的具体过程放在下篇介绍吧。

参考文章:
http://blog.youkuaiyun.com/dog250/article/details/6203529
http://oss.org.cn/kernel-book/ch05/5.4.1.htm

深入Linux内核(进程篇)—进程切换之ARM体系架构 进程切换 阅读详情

相关推荐

Linux内核源码学习之进程切换细节整理

linux中的进程是个最基本的概念,进程从运行队列到开始运行有两个开始的地方, 一个就是switch_to宏中的标号1:"1:/t",//只要不是新创建的进程,几乎都是从上面的那个标号1开始的,而switch_to宏则是除了内核本身,所有的进程要 想运行都要经过的地方 另 一个就是ret_form_fork 这样看来,虽然linux的进程体系以及进程调度非常复杂,但是总体看来就是一个沙漏

aganlengzi的专栏 2959

tss

1.linux进程切换和TSS结构 http://blog.youkuaiyun.com/goodlixueyong/article/details/6018281   TSS 全称为task state segment,是指在操作系统进程管理的过程中,进程切换时的任务现场信息。    X86体系从硬件上支持任务间的切换。为此目的,它增设了一个新段:任务状态段(TSS),它和数据段、代码段一样也是一种段

cybertan的专栏 2746

三相SVPWM逆变器双闭环PI解耦控制:从dq坐标系到参数整定实战

本文深入解析了三相SVPWM逆变器的双闭环PI解耦控制技术。通过引入dq坐标系,将交流量转换为直流量,并结合前馈补偿实现电流环的解耦控制。文章详细阐述了从数学模型推导、控制器设计到参数整定与SVPWM实现的完整流程,为工程师提供了从理论到实战的系统性指导。

weixin_28292761的博客 405

Linux操作系统分析Lab5:深入理解进程切换

通过对Linux内核进程切换的流程了解和对代码的具体分析,可以总结出:Linux内核进程切换过程中,会保存当前进程的上下文信息,并从调度队列中选中下一个需要执行的进程,然后将下一个进程的上下文信息加载到 CPU的寄存器和内存中,使其能够继续执行。在切换进程时,它会涉及到懒惰 TLB刷新、地址空间切换、锁切换等一系列操作,以确保进程能够正确地运行。最后,它会完成任务切换,并返回前一个进程的调度队列。

weixin_43363720的博客 626

正交试验实战指南:从PICT工具到混合水平表应用

本文详细介绍了正交试验法在测试设计中的实战应用,从基础概念到PICT工具的高级使用技巧。通过混合水平表设计和工程化实践案例,帮助测试工程师高效解决参数组合爆炸问题,提升测试覆盖率与效率。特别适合兼容性测试和复杂系统验证场景。

weixin_29230865的博客 260

蓝桥杯嵌入式(基础教程)STM32G431RBT6——创建工程以及点灯

首先选择正确的芯片类型:STM32G431RBT6工程的创建主要有配置时钟以及烧录的方式。在配置好之后需要对时钟进行配置,由于蓝桥杯的外部晶振是24MHz因此需要对时钟树进行相应的配置。第一步先点击时钟配置之后就可以对时钟进行相应的配置了最后一步,需要对工程起一个名字,并且要选择KEIL做为其相应的软件之后再需要再生成代码那里进行相应的控制。当然这样根据生成的工程不能直接使用会有一个报错,所以需要添加一个启动文件。这个启动文件可以在官方的LCD文件夹下复制到自己的工程中。

m0_74051113的博客 1093

Linux下如何从用户态切换到内核态?

首先我们得明白什么是用户态和内核态? 明白这两个概念之前,我们得知道用户空间和内核空间。 用户空间:指的就是用户可以操作和访问的空间,这个空间通常存放我们用户自己写的数据等等;而内核空间则是系统内核来操作的一块空间,这块空间里面存放系统内核的函数、接口等。 不管对于Linux还是Windows, 他们都具有自己用户空间和内核空间。当一个程序运行时,如果它是在用户空间下执行,我们把此时运行得程序的这...

shanghx_123的博客 2万+

信号编辑软件ZX/SignalEditing

信号编辑软件ZX/SignalEditing

weixin_45661395的博客 964

Linux 上下文切换 寄存器 内核线程 用户线程

最近在看Go语言的goroutine调度,看到一篇理论文章,对一些关于Linux多线程的知识进行进一步的了解并且记录。 目录 什么是:CPU寄存器 CPU上下文切换? 进程上下文切换 线程上下文切换 中断上下文切换 Go程序内核线程能有多少个? Linux创建的线程是用户级还是内核级线程? 什么是:CPU寄存器 CPU上下文切换? CPU寄存器,是CPU内置的容量小、但速度极快的...

年轻气盛 温顺尚早 2587

一张图读懂 SAP S/4HANA Cloud 与 SAP BTP 的扩展版图

本文解析了SAP S/4HANA Cloud的扩展技术谱系,提出扩展应分为on-stack(系统内)和side-by-side(并行)两种路径,并沿着低代码到专业代码的能力梯度进行分层。on-stack扩展包括面向业务人员的Key User Extensibility和面向开发者的Developer Extensibility,强调贴近核心业务对象;side-by-side扩展则依托SAP BTP平台,提供SAP Build低代码工具、CAP开发框架和ABAP云环境三种方案,支持解耦创新。文章通过五个真实案

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 255

16、经皮功能性电刺激助行:Parastep系统全解析

本文全面解析了经皮功能性电刺激助行系统——Parastep系统,涵盖其发展历史、技术参数、系统设计、患者准入标准、训练方案及临床效果。作为首个获得FDA批准并商业化的非侵入性FES助行系统,Parastep为胸段截瘫患者提供了独立站立与行走的可能性,并在改善下肢血流、肌肉质量、心理状态等方面展现出显著医学与心理益处。文章还对比了其他FES系统,分析了Parastep的优势与局限,并探讨了未来技术改进方向与应用拓展前景。

l3m4n的博客 110

用户态到内核态切换之奥秘解析

学号:SA12**6112 本文将主要研究在X86体系下Linux系统中用户态到内核态切换条件,及切换过程中内核栈和任务状态段TSS在中断机制/任务切换中的作用及相关寄存器的变化。 一:用户态到内核态切换途径: 1:系统调用 2:中断   3:异常 对应代码,在3.3内核中,可以在/arch/x86/kernel/entry_32.S文件中查看。 二:...

weixin_34075268的博客 306

YOLOv8改进:在C2F模块中引入RepGhost Bottleneck模块

C2F类是YOLOv8中的C2F模块的实现,它包含一个RepGhostBottleneck模块、一个卷积层和一个批归一化层。通过在C2F模块中引入RepGhost Bottleneck模块,我们可以在保持计算效率的同时提升模型的表达能力。这是因为RepGhost Bottleneck模块通过引入重复的卷积核来扩展模型的感受野,从而增加了模型对不同尺度目标的感知能力。RepGhost Bottleneck是一种用于卷积神经网络的改进模块,它可以在保持计算效率的同时提升模型的表达能力。希望以上内容对你有帮助!

IlgCrystal的博客 1307

Linux内核进程切换

Linux内核进程切换    本文主要参考了Understanding The Linux Kernel 和水木精华区的分析进程切换宏 switch_to 。感谢相关的作者!本文中有部分内容直接从上面提到的文章中重复,仅仅是为了方便大家阅读。本文中提到的所有内核代码可以到Linux Cross Reference上查阅。欢迎转载本文,转载请保留这份声明。    本文仅讨论内核进程的切换,而不涉

学习笔记 4325

S7-1200中时钟功能设定和读写调用的具体方法

S7-1200中时钟功能设定和读写调用的具体方法

Robot_PLC_HMI_Automation 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux内核进程上下文的切换

进程管理中最重要的一步要进行进程上下文切换,其中主要有两大步骤:地址空间切换和处理器状态切换(硬件上下文切换),前者保证了进程回到用户空间之后能够访问到自己的指令和数据(其中包括减小tlb清空的ASID机制),后者保证了进程内核栈和执行流的切换,会将当前进程的硬件上下文保存在进程所管理的一块内存,然后将即将执行的进程的硬件上下文从内存中恢复到寄存器,有了这两步的切换过程保证了进程运行的有条不紊,当然切换的过程是在内核空间完成,这对于进程来说是透明的。

嵌入式Linux内核的博客 1007

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

在Linux-0.11中实现基于内核栈切换的进程切换

原有的基于TSS的任务切换的不足 进程切换的六段论 1 中断进入内核 2 找到当前进程的PCB和新进程的PCB 3 完成PCB的切换 4 根据PCB完成内核栈的切换 5 切换运行资源LDT1. 原有的基于TSS的任务切换的不足 原有的Linux 0.11采用基于TSS和一条指令,虽然简单,但这指令的执行时间却很长,在实现任务切换时大概需要200多个时钟周期。而通过堆栈实现任务切换可能要快,而且采

秋雨mac的博客 2268

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Linux内核进程上下文切换深入理解

我都知道操作系统的一个重要功能就是进行进程管理,而进程管理就是在合适的时机选择合适的进程来执行,在单个cpu运行队列上各个进程宏观并行微观串行执行,多个cpu运行队列上的各个进程之间完全的并行执行。进程管理是个复杂的过程,例如进程的描述、创建和销毁、生命周期管理、进程切换、进程抢占、调度策略、负载均衡等等。本文主要关注进程管理的一个切入点,那就是进程的上下文切换,来理解linux内核是如何进程进程上下文切换的,从而揭开上下文切换的神秘面纱。 (注意:本文以linux-5.0内核源码讲解,采用arm64架构)

lx123010的专栏 7623

深入理解Linux内核进程上下文切换

作者简介韩传华,就职于南京大鱼半导体有限公司,主要从事linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,乐于分享喜欢学习,喜欢专研Linux内核源代码。我都知道...

宋宝华 1万+

进程并发究竟是如何进行进程切换的?Linux内核原理解析

实时操作系统(Real Time Operating System,简称RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。此时操作系统会在进程被剥离前,将当前进程的运行相关信息保存到PCB中,然后将该进程的PCB从活跃队列中移除,加载到过期队列。至于新产生的需要被调度的进程,则是直接添加到过期队列中。活跃进程、过期进程。

Zhenyu_Coder的博客 2015

64位x86体系Linux内核进程切换

首先简单提一下这个宏和函数的被调用关系:     schedule() --> context_switch() --> switch_to --> __switch_to()   这里面,schedule是唯一调用switch_to的函数,涉及到一些调度算法,这里不讨论。当schedule()需要暂停A进程的执行而继续B进程的执行时,就发生了进程之间的切换。进程切换主要有两大步:1、

云(存储),松(耦合) 6339

Linux-0.11操作系统实验4-基于内核栈切换的进程切换

实验环境:基于内核栈切换的进程切换 实验本质:将 Linux 0.11 中采用的 TSS 切换部分去掉,取而代之的是基于堆栈的切换程序。具体的说,就是将 Linux 0.11 中的 switch_to实现去掉,写成一段基于堆栈切换的代码。 重写 switch_to 修改/kernel/system_call.s: .globl system_call,sys_fork,timer_interrup...

XBlog 2548

Linux内核进程管理进程切换之context_switch

基本概念 进程虚拟地址空间 ARM64的地址空间分配如下: 用户地址空间 0x0000000000000000–0000ffffffffffffffff 内核地址空间 0xffff000000000000–0xffffffffffffffff 每一个用户进程拥有自己独立的用户地址空间,但内核地址空间只有一个,所有进程共用。 task_struct有两个成员mm和active_mm,用来描述进...

liuhangtiant的博客 1349
上一篇: 开发Android硬件访问服务
下一篇: Linux权限引发的"血案"
OS技术解密
博客等级 码龄16年 3761粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值