首页 > 其他分享 >CPU 是怎样进行任务切换的?

CPU 是怎样进行任务切换的?

时间:2024-04-04 14:32:06浏览次数:22  
标签:中断 任务 CPU 当前任务 描述符 切换 寄存器 TSS 怎样

通过“中断+任务门”进行任务切换

好处

好处

抢占式任务调度,所有任务都有运行的机会

例子

在8258A中,把时钟的中断向量号设置为0x20,因此在中断描述符表IDT的第0x20个中断描述符中注册了时钟的中断处理程序

随着时钟中断的定期发生,满足一定条件后,该中断处理程序又调用schedule()进行线程调度

与任务相关的是TSS选择子,这个时钟中断的描述符是中断描述符,中断描述符存储的不是TSS选择子,而是目标中断处理例程的代码段选择子及偏移地址,因此处理器并没有把此中断门描述符中的中断处理程序当成新的任务

任务门的作用

中断发生时,处理器一定会通过中断向量号检索IDT中的描述符,所以,若想通过中断的方式进行任务切换,该中断对应的描述符中必须包含TSS选择子,唯一包含TSS选择子的描述符便是任务门描述符

在这里插入图片描述
任务门描述符中的内容是TSS选择子,任务门描述符也是系统段,因此S的值为0,在S为0的情况下,TYPE的值为0101,就表示此描述符为任务门描述符

中断是任何时候都会发生的,任务在执行时都会被中断信号打断,在中断描述符表中的描述符可以是中断门、陷阱门、任务门。所以,当前任务被中断后,要么是去执行中断处理程序,要么是进行任务切换

当中断发生时,处理器通过中断向量号在IDT中找到描述符后,通过分析描述符中字段S和字段TYPE的组合,判断描述符的类型

若发现中断对应的描述符是中断门描述符,则转去执行此中断门描述符中指定的中断处理例程。在中断处理程序的最后,通过iretd指令返回到被中断任务的中断前的代码处

若发现中断对应的是门描述符,此时便进行任务切换

任务调用的前提

一个完整的任务包括用户空间和内核空间代码,这两种代码加起来才是任务的全局空间

另外,在CPU眼里,一个TSS就代表一个任务,TSS才是任务的标志,CPU区分任务就是靠TSS。因此,只要TR寄存器中的TSS信息不换,无论执行的是哪里的指令,也无论指令是否跨越特权级(从用户态到内核态),CPU都任务还是在同一个任务中

平时所写的程序代码都只是用户态代码,对于完整的任务来说它属于半成品。用户代码和内核代码只是同一个任务的不同部分

中断处理例程属于内核代码,因此它也属于当前的任务,当在中断处理例程中执行iretd指令从中断返回后,是返回到当前任务在中断前的代码处,依然属于当前任务,只是返回到了当前任务的不同部分

iretd可以调用一个任务

之前了解了iretd指令用于从中断处理例程中返回,其实这只是它的一个功能,它一共有两个功能 - 从中断返回到当前任务的中断前代码处 - 当前任务是被嵌套调用时,它会调用自己TSS中“上一个任务的TSS指针”的任务,也就是返回到上一个任务

现在关注的重点:iretd可以调用一个任务

一个指令在不同环境下具备不同的功能,有时候这很容易引起混淆,现在模拟一下这个情况,当中断发生时,假设当前任务A被中断,CPU进入中断后,它有可能的动作是: - 假设是中断门或陷阱门,执行完中断处理例程后是用iretd指令返回到任务A中断前的指令部分 - 假设是任务门,进行任务切换,此时是嵌套调用任务B,任务B在执行期间又发生了中断,进入了对应的中断门,当执行完对应的中断处理程序后,用iretd指令返回 - 同样假设是任务门,任务A调用任务B执行,任务B执行完成后要通过iretd指令返回任务A,使任务A继续完成后续的指令

以上几种情况的最后都是执行iretd指令,那么,CPU在执行iretd时,是回到任务A中断前的代码部分,还是回到任务B中断前的代码部分?还是调用任务A?必须要分清楚这几种情况,因为涉及的底层不同

怎么区分这几种情况?

看来必须在调用新任务之初就给自己留好“后路”,这时候标志寄存器eflags中的NT位和TSS中的“上一个任务的TSS指针”字段便起作用了

NT位是eflags中的第14位,1bit的宽度,它表示Nest Task Flag,任务嵌套。 - 任务嵌套是指当前任务是被前一个任务调用后才执行的,也就是当前任务嵌套于另一个任务中,相当于另一个任务的子任务 - 在此任务执行完成后还要回到前一个任务,使其继续执行 - 这一点类似于在函数A中调用一个子函数Ac,子函数Ac执行完成后还是要回到函数A中

TSS的字段"上一个任务的TSS指针",用于记录是哪个任务调用了当前任务,有点类似于“父任务”,此字段中的值是TSS的地址,因此它就形成了任务嵌套关系的单向链表,每个TSS属于链表中的节点,CPU用此链表来记录任务嵌套调用关系,如图11-8所示

在这里插入图片描述

任务调用

当调用一个新任务时,处理器做了两件准备工作 - 自动将新任务eflags中的NT位置为1,这就表示新任务能够执行的原因被别的任务调用,也就是嵌套调用 - 随后处理器将旧任务的TSS选择子写入新任务TSS的“上一个任务的TSS”字段中

之前,中断发生时,处理器要把NT位和TF位置为0,如果对应的描述符是中断门描述符,还要再将标志寄存器eflags中的IF位清0,这是为了避免嵌套。防止正在处理的中断尚未完成时相同的中断源又发出中断信号,避免引发GP异常

有了上面的准备工作,当CPU执行iretd指令时,始终要判断NT位的值。如果NT等于1,这表示是从新任务返回到旧任务,于是CPU到当前任务(新任务)TSS的“上一个任务的TSS指针”字段中获取旧任务的TSS,转而去执行旧任务

如果NT等于0,这表示要回到当前任务中断前的指令部分

中断发生时,通过任务门进行任务切换过程

  1. 从该任务门描述符中取出任务的TSS选择子

  2. 用新任务的TSS选择子在GDT中索引TSS描述符

  3. 判断该TSS描述符的P位是否为1,为1表示该TSS描述符对应的TSS已经位于内存中TSS描述符指定位置可以访问 1. 否则P不为1表示该TSS描述符对应的TSS不在内存中,这会导致异常

  4. 从寄存器TR中获取旧任务的TSS位置,保存旧任务(当前任务)的状态到旧TSS中 1) 其中,任务状态是指CPU中寄存器的值,这仅包括TSS结构中列出的寄存器: 2) 8个通用寄存器,6个段寄存器、指令指针eip、栈指针寄存器esp、页表寄存器cr3和标志寄存器eflags等

  5. 把新任务的TSS中的值加载到相应的寄存器中

  6. 使寄存器TR指向新任务的TSS

  7. 将新任务(当前任务)的TSS描述符中的B位置1

  8. 将新任务标志寄存器中eflags的NT位置1

  9. 将旧任务的TSS选择子写入新任务TSS中"上一个任务的TSS指针"字段中

  10. 开始执行新任务

调用iretd返回旧任务,处理器检查NT位,为1则返回

  1. 将当前任务(新任务)标志寄存器中eflags的NT位置0

  2. 将当前任务TSS描述符中的B位置为0

  3. 将当前任务的状态信息写入TR指向的TSS

  4. 获取当前任务TSS中“上一个任务的TSS指针”字段的值,将其加载到TR中,恢复上一个任务的状态

  5. 执行上一个任务(当前任务),从而恢复到旧任务

call、jmp切换任务

概述

首先,任务描述符除了可以在IDT中注册,还可以在GDT和LDT中注册

其次,任务以TSS为代表,只要包括TSS选择子的对象都可以作为任务切换的操作数

call和jmp指令 + TSS选择子或任务门选择子

TSS中已经包含了任务的详细信息,任务门描述符中又包含了TSS选择子,所以它和所有的门描述符一样,使用TSS和任务门作为call和jmp指令操作数时,操作数中包含了偏移量,CPU只用选择子部分就够了,会忽略其中的偏移量部分

假设任务门选择子定义在GDT中第2个描述符位置 - call 0x0010:0x1234

假设TSS选择子定义在GDT中第3个描述符位置 - call 0x0018:0x1234

call 是有去有回的指令,jmp是一去不回的指令

call 0x0018:0x1234 任务切换步骤

  1. CPU忽略偏移量0x1234,拿选择子0x0018在GDT中索引到第3个描述符

  2. 检查描述符中的P位,若P为0,表示该描述符对应的段不存在,这将导致异常

  • 同时检查该描述符的S与TYPE的值,判断其类型
  • 如果是TSS描述符,检查该描述符符的B位,B位若为1将抛出GP异常,即表示调用不可重入
  1. 进行特权级检查,数值上"CPL和TSS选择子中的RPL"都要小于等于TSS描述符的DPL,否则抛出GP异常

  2. 特权检查完成后,将当前任务的状态保存到寄存器TR指向的TSS中

  3. 加载新任务TSS选择子到TR寄存器的选择器部分,同时把TSS描述符中的起始地址和偏移量等属性加载到TR寄存器中的描述符缓冲器中

  4. 将新任务TSS中的寄存器数组载入到相应的寄存器中,同时进行特权级检查,如果检查未通过,则抛出GP异常

  5. CPU会把新任务的标志寄存器eflags中的NT位置为1

  6. 将旧任务TSS选择子写入新任务TSS的字段"上一个任务的TSS指针"中,这表示新任务是被旧任务调用才执行的

  7. 然后将新任务TSS描述符中的B位置1以表示任务忙 1) 旧任务TSS描述符中的B位不变,依然保持为1 2) 旧任务的标志寄存器eflags中的NT位的值保持不变

10) 开始执行新任务,完成任务切换

jmp 任务切换步骤jmp 指令以非嵌套的方式调用新任务,新任务和旧任务之间不会形成链式关系

当以jmp指令调用新任务时,新任务TSS描述符中的B位会被CPU置为1以表示任务忙,旧任务TSS描述符中的B位会被CPU清0

任务返回

当通过iretd指令任务返回时,新任务eflags寄存器的NT位必须为1,所以iretd仅适用于call

当调用iretd返回旧任务时,CPU会将当前任务(新任务)TSS描述符中B位清0,同时将其eflags寄存器的NT位清0

标签:中断,任务,CPU,当前任务,描述符,切换,寄存器,TSS,怎样
From: https://blog.csdn.net/weixin_40398522/article/details/137374330

相关文章

  • 05 | 面向对象编程:怎样才能写出一个“好”的类?
    如果按照前几节课的惯例,今天应该是讲运行阶段的。但是,运行阶段跟前面的编码、预处理和编译阶段不同,它是动态的、实时的,内外部环境非常复杂,CPU、内存、磁盘、信号、网络套接字……各种资源交织在一起,可谓千变万化(正如在第1节课里所说,每一个阶段的差异都非常大)。解决这个阶段......
  • 数字化对传统工业带来了怎样的革新?
    我国工业数字化发展正步入一个全新的阶段,呈现出蓬勃发展的态势。在政策的大力推动下,工业数字化转型持续深化,数字技术在工业领域的应用愈发广泛,对产业发展的赋能作用也日益显著。中国工业数字化的一些代表性数据:1.数字经济规模据《数字中国发展报告(2022年)》发布的数据显示,2......
  • 利用 Optimum Intel 和 fastRAG 在 CPU 上优化文本嵌入
    嵌入模型在很多场合都有广泛应用,如检索、重排、聚类以及分类。近年来,研究界在嵌入模型领域取得了很大的进展,这些进展大大提高了基于语义的应用的竞争力。BGE、GTE以及E5等模型在MTEB基准上长期霸榜,在某些情况下甚至优于私有的嵌入服务。HuggingFace模型hub提供了多种尺......
  • cpu如何执行指令
    重点:理解cpu执行指令的大概过程.c源代码文件->编译->.exe可执行文件(二进制)->点击运行.exe文件->操作系统把这个文件加载到内存cpu根据PC程序计数器,取指令解析执行指令  例子:......
  • gem5 CPU ISA level is lower than required
    错误提示:/lib/x86_64-linux-gnu/libc.so.6:CPUISAlevelislowerthanrequired错误截图:在互联网上搜索该错误,在gem5的邮件列表发现:Jason说在某次commit解决了这个问题,然后去这两个链接里面看一下:大概的意思是说GLIBC更新了,对硬件检查更严格了。当尝试加载动态......
  • 将wavedrom图转换为excel+UVM使用双顶层环境+慎用casex和casez使用case inside+shell
    将wavedrom图转换为excel原理上是先转换为json,然后写入到excel中。importcsvimportjsonimportpandasaspdcontent=[]withopen("source.txt")asf:c=f.read()c=c.replace("reg","\"reg\"").replace("bits",&......
  • [转帖]芯片相关-- Cpu历史--intel系列
    https://zhuanlan.zhihu.com/p/464413953 上次发了一篇文章,本以为没有人会感兴趣,大家关注的还挺多的,正好最近有空,把cpu的历史做了一个简单的回顾,将历史上出现的相关厂家关键芯片做个梳理,通过发展历史,大致了解脉络后,看罗马也不是一天完成的。说明:使用到的图片大部分来源......
  • [转帖]芯片相关-- Cpu历史--AMD系列
    芯片相关--Cpu历史--AMD系列https://zhuanlan.zhihu.com/p/477864185 1.1AMD1968年,仙童半导体的8位创始人中的两位——总经理罗伯特·诺伊斯(RobertNoyce)和实验室负责人戈登·摩尔(GordenMoore),带着一部分员工离开了陷入资金危机的公司,成立了英特尔(Intel)。而一......
  • 海外问卷渠道查有什么优势?新手入行该怎样避坑?
    新手入行先要了解清楚海外问卷的调查类型再进行选择,目前市面上分为三种调查类型:口子查、站点查和渠道查,每种调查的方式都是不一样的。口子查:通过自己公司的官方渠道(例如:Facebook、Twitter、Linkedln等)发布问卷调查链接,所有人都可以参与(口子)。口子查一般是美国的白天,也就是我......
  • 903-多路PCIe3.0的单CPU 学习型AI工作站
     一、机箱功能和技术指标:系统系统型号ORI-SR500主板支持EEB(12'*13')/CEB(12'*10.5')/ATX(12'*9.6')/MicroATX前置硬盘最大支持2个3.5寸+1个2.5寸SATA硬盘+2个2.5寸SATA硬盘(背部)电源类型CRPS冗余电源,标准AT......