Linux 学习笔记(九):基于 TSS 的进程切换

news2024/11/20 9:29:17

一、TSS 基本概念

1、什么是 TSS ?

       TSS(Task State Segment)即任务状态段。具体的说,在设计 “Intel 架构”(即 x86 系统结构)时,每个任务(进程or线程)都对应有一个独立的 TSS ,TSS 就是内存中的一个结构体,里面包含了 几乎所有的 CPU 寄存器的映像

       在 Linux 0.11 中,就是依靠任务状态段 TSS 的切换来真正完成进程的切换。

2、TR 寄存器

       TR(Task Register)即任务寄存器,指向当前进程对应的 TSS 结构体。

       TR 指向当前进程对应的 TSS 结构体,但具体是怎么 “指向” 的呢?—— 通过 GDT 表。具体实现为:TR 存储当前进程的 TSS 结构体的段选择符,通过段选择符在 GDT 表中找到对应 TSS 结构体的内存位置。

  • 关于段的存储可以看看这篇文章:操作系统:段存储_DoYa~的博客-CSDN博客

二、TSS 切换

1、什么是 TSS 切换 ?

       所谓的 TSS 切换 就是将 CPU 中 几乎所有的寄存器 复制到 TR 指向的那个 TSS 结构体中保存起来,同时还要找到一个目标 TSS(即将要切换到的下一个进程所对应的 TSS),并将其中存放的寄存器映像 “扣” 在CPU 上,就完成了执行现场的切换,如下图所示。 

       Intel 架构不仅提供了 TSS 来实现任务的切换,而且只需要一条指令就能完成这样的切换,即图中的 ljmp 指令。

2、具体的工作过程

【1】首先用 TR 中存储的段选择符GDT 表中找到当前 TSS 的内存位置。即上图的(1)(2)

       由于 TSS 是一个,所以需要用段表中的一个描述符来表示这个段,这和在系统启动时论述的内核代码段是一样的,当时的那个段使用 GDT 中的 8 对应的第 1 项来描述。此处的 TSS 也是用 GDT 中的某个表项来描述,而 TR 寄存器就是用来表示这个段用 GDT 表中的哪一项来描述,所以 TR 和 CS、DS 等寄存器的功能是完全类似的。

【2】找到了当前的 TSS 段(也就是一段内存区域)以后,将此刻 CPU 中的寄存器映像存放到这段内存区域中,即 “拍” 了一个快照。即上图的(3)

【3】保存当前进程的执行现场以后,接下来就要找到目标进程的现场,并将其 “扣” 在 CPU 上。即上图的(4)(5)(6)

       寻找目标 TSS 段的方法也是一样的,因为找段都要从一个描述符表中找,而描述 TSS 的描述符放在 GDT 表中,所以找 目标 TSS 段也要靠 GDT 表。当然只需要给出目标 TSS 段对应的描述符在 GDT 表中存放的位置——段选择子就可以了(仔细回想系统启动时那条著名的 jmpi 0,8 指令,这个段选择子就放在 ljmp 的参数中,实际上就是 jmpi 0,8 中的 8。

【4】一旦将 目标 TSS 中的全部寄存器映像扣在 CPU 上,就相当于切换到了目标进程的执行现场,因为那里存储着目标进程停下时CS:EIP,所以现在就要从目标进程停下时的那个 CS:EIP 处开始接着执行。

       另外,由于完成了进程切换,目标进程现在就变成了当前进程,所以 TR 需要修改为当前进程(也就是一开始的目标进程)的 TSS 段在 GDT 表中的段描述符所在的位置,因为 TR 总是指向当前进程 TSS 段的段描述符所在的位置。即上图的(7)

【 注 】从上面的工作过程可以看出,每个进程对应的 TSS 结构体中存储的 CPU 相关信息并不是实时的,而是存储的该进程停下时的 CPU 相关信息。所以每次进行进程切换时,要先通过 TR 寄存器更新一下当前进程的 TSS 结构体,即保存当前进程停止时的执行现场( “拍” 一个照)。

3、switch_to() 函数

       上面给出的这些工作都是通过一句长跳转指令 ljmp 段选择子:段内偏移 ,在段选择子指向的段描述符是 TSS 段时 CPU 解释执行的结果。

       Linux 0.11 中,进程/线程的切换是通过 switch_to() 函数实现的(在 include/linux/sched.h 中定义),而 switch_to 进行宏展开后实际上就是一句 ljmp 指令:

#define switch_to(n) {
    struct{long a,b;} tmp;
    __asm__(
        "movw %%dx,%1"
        "ljmp %0" ::"m"(*&tmp.a), "m"(*&tmp.b), "d"(TSS(n)
    )
 }

#define FIRST_TSS_ENTRY 4

#define TSS(n) (((unsigned long) n) << 4) + (FIRST_TSS_ENTRY << 3))

上面这段代码就是实现进程的切换(包括记录当前进程的 TSS、切换目标进程)

4、GDT 表

GDT 表的结构如下图所示:

       从上图可以看出,第一个 TSS 表项,即 进程 0 的 TSS 表项在第 4 个位置上,4<<3,即 4 * 8,相当于 TSS 在 GDT 表中开始的位置

       而 TSS(n)找的是 进程 n 的 TSS 位置,所以还要再加上 n<<4,即 n * 16。因为每个进程对应有 1 个 TSS 和 1 个 LDT,而这两个描述符的长度都是 8 个字节,总共就是 16 字节,所以是 * 16。其中 LDT 的作用就是上面论述的那个映射表,关于此表的详细论述要等到内存管理一章。

       因此,TSS(n) = n * 16 + 4 * 8 得到就是 进程 n(切换到的目标进程)的 TSS 选择子,将这个值存放到 dx 寄存器中,并且又放置到结构体 tmp 中 32 位长整数 b 的前 16 位。现在 64 位 tmp 中的内容是前 32 位为空,这个 32 位数字是段内偏移,也就是 jmpi 0,8 中的 0;而接下来的 16 位n * 16 + 4 * 8 ,这个数字是段选择子,也就就是 jmpi 0,8 中的 8,再接下来的 16 位也为。所以 switch_to 的核心实际上就是 ljmp 空,n*16+4*8

       到现在,我们应该可以和前面给出的基于 TSS 的进程切换联系在一起了。

三、TSS 切换的缺点

       虽然 TSS 用一条指令就能完成任务切换,但条这指令的执行的时间很长,这条 ljmp 指令在实现任务切换时大概需要 200 多个时钟周期。而通过 堆栈 实现任务切换可能要更快,而且采用堆栈的切换还可以使用指令流水的并行优化技术,同时又使得 CPU 的设计变得简单。所以无论是 Linux 还是 Windows,进程/线程的切换都没有使用 Intel 提供的这种 TSS 切换手段,而都是通过堆栈实现的。

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

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

相关文章

Java经典笔试题—day13

Java经典笔试题—day13 &#x1f50e;选择题&#x1f50e;编程题&#x1f36d;参数解析&#x1f36d;跳石板 &#x1f50e;结尾 &#x1f50e;选择题 (1)一个关系数据库文件中的各条记录 &#xff08;&#xff09; A. 前后顺序不能任意颠倒&#xff0c;一定要按照输入的顺序排…

测试4-数据库设计

测试4-数据库设计 目录 测试4-数据库设计选择题简答题1. 画E-R图并将其转换为适当的关系模型题目E-R图关系模型 2. 画E-R图并将其转换为关系模型题目E-R图关系模型 选择题 下列关于数据库运行和维护的叙述中&#xff0c;正确的是D。 A &#xff0e;只要数据库正式投入运行&…

网狐大联盟服务端源码分析之服务核心-ServiceCore-Base64编解码实现

工程属性分析: 1.工程属性->动态链接库 2.dll类型->MFC共享DLL 3.字符集->Unicode 4.库导出类型->使用模块定义文件def 5.生成的导出模块函数与对应的地址定义lib文件 源码分析: 头文件分析: 头文件与对应含义表示如下:

shell变量类型含义 长方形面积计算 截取相应字段方法

1.总结变量的类型及含义&#xff1f; 2.实现课堂案例计算长方形面积&#xff1f;&#xff08;6种方式&#xff09; 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815&#xff08;通过多种方法实现&#xff09; 1&#xff09;截取网站访问的协议 …

spring之spring入门程序

1.创建Maven Module 2.pom.xml引入依赖 此图引用于https://www.cnblogs.com/Zz-maker/p/11199331.html Maven种的依赖的传递性&#xff0c;spring-context依赖于core,beans,aop,expression等模块&#xff0c;但是在pom.xml中只引用spring-context即可&#xff1a; <?xml v…

WhatsApp与电子商务,最佳拍档

您可以通过将 WhatsApp 整合到您的电子商务业务策略中。首先&#xff0c;您可以从将WhatsApp集成到您的客服渠道&#xff0c;与您的其他客户沟通渠道形成交互&#xff0c;并统一进行客户管理与回复&#xff0c;您需要一个工具做到——SaleSmartly&#xff08;ss客服&#xff09…

UI自动化测试、接口测试等自动化测试详解

今天跟大家介绍UI测试、接口测试、单元测试主要内容&#xff0c;以及每种测试花费时间讨论。 一.UI测试【Selenium】 UI测试是最接近软件真实用户使用行为的测试类型。通常是模拟真实用户使用软件的行为&#xff0c;即模拟用户在软件界面上的各种操作&#xff0c;并验证这些操…

030:Mapbox GL设置渐变矢量矩形

第030个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载数据,构成渐变的矩形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共109行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:…

第十三章 常用类(包装类和 String 相关类)

一、包装类 1. 包装类的分类 &#xff08;1&#xff09;针对八种基本数据类型相应的引用类型—包装类 &#xff08;2&#xff09;有了类的特点&#xff0c;就可以调用类中的方法。 2. 包装类和基本数据类型的转换 &#xff08;1&#xff09;jdk5 前的手动装箱和拆箱方式 publi…

html面试复习

目录 网页的显示过程 浏览器的渲染引擎 不同浏览器的内核 什么是标记语言&#xff08;markup language &#xff09; 什么是超文本&#xff08; HyperText &#xff09; 完整的html结构 文档声明 html元素 head元素 body元素 html元素 img标签 a标签 锚点链接 i…

链接投票二维码制作投票的链接制作投票链接的制作

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…

ACS Cent. Sci 2018 | 数据驱动的分子连续表征的自动化学设计

原文标题&#xff1a;Automatic Chemical Design Using a Data-Driven Continuous Representation of Molecules 代码&#xff1a;https://github.com/aspuru-guzik-group/chemical_vae 原文链接&#xff1a;https://pubs.acs.org/doi/10.1021/acscentsci.7b00572 Automatic…

涨点神器:基于Yolov5/Yolov7的小目标性能提升

1.小目标介绍 目标检测近十年涌现了一大批如Faster R-CNN、RetinaNet、YOLO等可以在工业界实用的目标检测方法,但小目标检测性能差的问题至今也没有被完全解决。因为Swin Transformer的提出,COCO test-dev上的 AP 已经刷到64 ,但小目标检测性能(即APS )和大目标检测性能(…

什么是MQTT?mqtt协议和http协议区别

摘要&#xff1a; 什么是MQTT&#xff1f;MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;译为&#xff1a;消息队列遥测传输&#xff0c;是一种轻量级的通讯协议&#xff0c;用于在网络上传输消息。MQTT 最初由 IBM 发布&#xff0c;后来成为 OASIS&#xf…

图解LeetCode——138. 复制带随机指针的链表

一、题目 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。…

研报精选230525

目录 【行业230525中泰证券】半导体行业深度报告&#xff1a;解析英伟达成长的核心战略&#xff1a;研发为底、生态为径、AI为翼 【行业230525西南证券】医药行业周报&#xff1a;行情回暖&#xff0c;持续精选个股 【行业230525国元证券】2023年中期军工行业投资策略&#xff…

2023最系统的网络安全学习路线

什么是网络安全 网络安全是指保护计算机网络及其系统和应用程序的安全性和完整性&#xff0c;防止未经授权的访问、攻击、病毒、恶意软件和其他安全威胁。它是通过技术、管理和教育等综合手段来确保网络信息安全。网络安全包括网络防火墙、入侵检测系统、数据加密、网络访问控…

STM8、STM8S003F3P6 双机串口通信(片上串口)

背景 这里为什么要写串口通信&#xff0c;因为实际项目上使用了串口&#xff0c;STM8S003F3P6的串口简单啊&#xff0c;不值得一提。本文写的串口确实简单&#xff0c;因为这里我想先从简单的写起来&#xff0c;慢慢的把难的引出来。这里呢&#xff0c;做个提纲说明&#xff0…

基于SSM+HTML5的网上跳蚤市场系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 前言…

数据结构-查找(顺序查找与二分查找的讲解与代码实现)

顺序查找概念&#xff1a;从表的另一端开始&#xff0c;一次将记录的关键字和给定值进行比较&#xff0c;若某个记录的关键字和给定的值相等&#xff0c;则查找成功&#xff0c;反之则查找失败。 ASL:平均查找长度 pi查找概率&#xff0c;ci查找次数 eg&#xff1a;序列1&…