tss的作用举例:保存不同特权级别下任务所使用的寄存器,特别重要的是esp,因为比如中断后,涉及特权级切换时(一个任务切换),首先要切换栈,这个栈显然是内核栈,那么如何找到该栈的地址呢,这需要从tss段中得到,这样后续的执行才有所依托(在x86机器上,c语言的函数调用是通过栈实现的)。只要涉及地特权环到高特权环的任务切换,都需要找到高特权环对应的栈,因此需要esp2,esp1,esp0起码三个esp,然而linux只使用esp0。

tss是什么:tss是一个段,段是x86的概念,在保护模式下,段选择符参与寻址,段选择符在段寄存器中,而tss段则在tr寄存器中。

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

linux的做法:

1.linux没有为每一个进程都准备一个tss段,而是每一个cpu使用一个tss段,tr寄存器保存该段。进程切换时,只更新唯一tss段中的esp0字段到新进程的内核栈。

2.linux的tss段中只使用esp0和iomap等字段,不用它来保存寄存器,在一个用户进程被中断进入ring0的时候,tss中取出esp0,然后切到esp0,其它的寄存器则保存在esp0指示的内核栈上而不保存在tss中。

3.结果,linux中每一个cpu只有一个tss段,tr寄存器永远指向它。符合x86处理器的使用规范,但不遵循intel的建议,这样的后果是开销更小了,因为不必切换tr寄存器了。

linux的实现:

1.定义tss:

struct tss_struct init_tss[NR_CPUS] __cacheline_aligned = { [0 ... NR_CPUS-1] = INIT_TSS };(arch/i386/kernel/init_task.c)

INIT_TSS定义为:

#define INIT_TSS  {                            /

.esp0        = sizeof(init_stack) + (long)&init_stack,    /

.ss0        = __KERNEL_DS,                    /

.esp1        = sizeof(init_tss[0]) + (long)&init_tss[0],    /

.ss1        = __KERNEL_CS,                    /

.ldt        = GDT_ENTRY_LDT,                /

.io_bitmap_base    = INVALID_IO_BITMAP_OFFSET,            /

.io_bitmap    = { [ 0 ... IO_BITMAP_LONGS] = ~0 },        /

}

2.初始化tss:

struct tss_struct * t = init_tss + cpu;

...

load_esp0(t, thread);

set_tss_desc(cpu,t);

cpu_gdt_table[cpu][GDT_ENTRY_TSS].b &= 0xfffffdff;

load_TR_desc();

相关函数或者宏为:

#define load_TR_desc() __asm__ __volatile__("ltr %%ax"::"a" (GDT_ENTRY_TSS*8))

static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, void *addr)

{

_set_tssldt_desc(&cpu_gdt_table[cpu][entry], (int)addr,

offsetof(struct tss_struct, __cacheline_filler) - 1, 0x89);

}

#define set_tss_desc(cpu,addr) __set_tss_desc(cpu, GDT_ENTRY_TSS, addr)

经过上述的初始化,tr永远指向唯一的tss段,然而tss段中的esp0以及iomap却是不断随着进程切换而变化的。

3.进程切换时切换全局唯一tss段中的esp0以及iomap即可:

在__switch_to中:

struct tss_struct *tss = init_tss + cpu;

...

load_esp0(tss, next);

从而改变了tss的esp0。

此时如果进程在用户态被中断,机器切到ring0,从tr中取出唯一的tss段,找到它的esp0,将堆栈切过去即可,然后把所有的其它寄存器都保存在tss当前的esp0指示的内核也就是ring0的堆栈上。

linux进程tss和ldt,x86体系下linux中的任务切换与TSS相关推荐

  1. 操作系统实验报告linux进程管理,计算机操作系统实验报告三Linux进程基本管理.doc...

    GDOU-B-11-112广东海洋大学学生实验报告书(学生用表) GDOU-B-11-112 实验名称 Linux进程基本管理 课程名称 计算机操作系统 课程号 学院(系) 专业 统 班级 学生姓名 ...

  2. 【Linux进程、线程、任务调度】一 Linux进程生命周期 僵尸进程的含义 停止状态与作业控制 内存泄漏的真实含义 task_struct以及task_struct之间的关系

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 文章目录 1 ...

  3. 观察Linux进程 线程的异步并发执行,操作系统linux版实验报告.doc

    操作系统linux版实验报告.doc (29页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 操作系统实验报告(Linux版)网络142 ...

  4. linux efi 双系统,EFI+GPT模式下Linux与Windows双系统要诀

    本文并非要对 BIOS/EFI/MBR/GPT 等进行理论探讨,相关知识请各位自行搜索学习.本着薄荷网一贯坚持的实操原则,本文主要是介绍在"EFI引导+GPT分区"模式下,安装 L ...

  5. linux进程管理之mm_struct,【转】Linux进程管理之SMP负载平衡(续二)

    继续来分析balance_tasks()函数,结合代码中的注释,理解这段代码应该很容易,在这里主要分析它的两个重要的子函数,即can_migrate_task()和pull_task(). 先来看ca ...

  6. linux进程挂掉 自动启动,配置systemd以在Linux崩溃后自动启动服务

    本文介绍配置systemd以在Linux崩溃后自动启动服务的方法.进程在Linux系统上崩溃的原因有很多,你可以调查并解决问题,但可能需要一段时间.但是你可以立即将服务恢复到联机状态的一件事是在服务中 ...

  7. linux设置BIOS串口,将x86平台的Linux控制台重定向到串口

    一般地,安装在PC的Linux是使用鼠标.键盘作为输入源,显示器作为输出显示,但有些X86的设备,如工控机等,为了节省成本,会去掉认为无用的外设接口,以致熟悉了PC的人不习惯.一个设备,没有鼠标.键盘 ...

  8. linux进程泄露命令明文参数,sshpass 使Linux可以明文参数输入SSH密码(示例代码)

    sshpass 使Linux可以明文参数输入SSH密码 这几天配置一台服务器,在某云平台创建云服务器后,生成了巨长.巨复杂的一串密码,在输入几十次密码后,依然是密码错误.这时候就想如果密码是非交互式输 ...

  9. linux进程创建截图,桌面应用|如何在 Linux 系统里用 Scrot 截屏

    最近,我们介绍过 gnome-screenshot 工具,这是一个很优秀的屏幕抓取工具.但如果你想找一个在命令行运行的更好用的截屏工具,你一定要试试 Scrot.这个工具有一些 gnome-scree ...

最新文章

  1. R语言偏相关或者部分相关性系数计算实战:通过拟合两个回归模型、或者pysch包计算偏相关系数(Partial Correlation)、通过方差分析获得偏相关系数的F统计量(偏F检验、二型检验)
  2. 测试机的版本高于Xcode的版本的解决方法
  3. form-data php,PHP 模拟form-data上传文件
  4. mysql 批量增加字段命令_sql使用命令批量给一个表添加字段
  5. SAP CRM Fiori应用里的note section
  6. c向文件中插入数据_Redis从文件中批量插入数据
  7. JAVA中神奇的双刃剑--Unsafe
  8. ElasticSearch里面关于日期的存储方式,解决差8个小时
  9. git报错:fatal: remote origin already exists
  10. android百分比布局失效,Android 百分比布局库【原创】
  11. BCNF/3NF的判断方法
  12. 谁决定了 IT 直男的价值
  13. Python---HTML表单
  14. Base64,DES,RSA,SHA1,MD5 笔记
  15. trump可音译为“专普”
  16. Android游戏开发入门基础
  17. nodejs下载文件到本地并命名 和 删除文件
  18. 纯粹数学的雪崩效应:庞加莱猜想何以造福了精准医疗?
  19. windows/linux远程开关机原理及实现
  20. ST-GCN论文分析

热门文章

  1. 基于JAVA+SpringMVC+MYSQL的火车票订票系统
  2. 基于JAVA+SpringMVC+Mybatis+MYSQL的博客系统
  3. 基于JAVA+SpringMVC+Mybatis+MYSQL的健身管理系统
  4. python语句分为复合语句与_对Python中for复合语句的使用示例讲解
  5. 【洛谷1090】合并果子
  6. 面试官问你有什么要问的时候,大胆的提出类似问题
  7. 期末总结20135320赵瀚青LINUX内核分析与设计期末总结
  8. Java基础知识之变量与常量、数据类型、类型转换
  9. idea运行报错Parameter ‘name‘ not found. Available parameters are [arg1, arg0, param1, param2]
  10. 03:计算书费【一维数组】